Forwarded from Daily Coding 🔥
📖Learning GitHub Copilot
🖋Laster Brent 2025
Повысьте продуктивность написания кода с помощью генеративного искусственного интеллекта GitHub Copilot. В этом практическом руководстве автор Брент Ластер расскажет, как использовать генеративный искусственный интеллект для более быстрого написания качественного кода, простого создания тестов, безупречной документации на любом этапе разработки и многого другого. Вы также узнаете о более продвинутых способах использования, таких как использование функции Copilot Agent для автономного добавления функций и автоматического просмотра запросов на включение изменений.
💾 Скачать книгу
Daily Coding #книги #Git & Max
🖋Laster Brent 2025
Повысьте продуктивность написания кода с помощью генеративного искусственного интеллекта GitHub Copilot. В этом практическом руководстве автор Брент Ластер расскажет, как использовать генеративный искусственный интеллект для более быстрого написания качественного кода, простого создания тестов, безупречной документации на любом этапе разработки и многого другого. Вы также узнаете о более продвинутых способах использования, таких как использование функции Copilot Agent для автономного добавления функций и автоматического просмотра запросов на включение изменений.
💾 Скачать книгу
Daily Coding #книги #Git & Max
Forwarded from Node.JS [ru] | Серверный JavaScript
process.nextTick в дебаунсерах: как сделать Event Loop неубиваемым?
Кажется, что
Почему nextTick опасен в дебаунсере?
*
* Это убивает производительность при частых событиях, например, в WebSocket или resize.
Что происходит под капотом?
Когда вы пишете:
То при каждом вызове кладется микрозадача. Если событие приходит каждую миллисекунду, Event Loop не успевает обработать I/O, таймеры или setImmediate. Это классический starvation.
Как диагностировать проблему?
* Используйте
* Clinic.js покажет, как микрозадачи занимают 100% цикла.
* Старый трюк — замер времени через
Правильный дебаунс — через setTimeout
Это макрозадача, которая не блокирует Event Loop.
Когда nextTick оправдан?
Только для синхронной обработки ошибок или действий, которые должны выполниться строго до следующей фазы. В дебаунсерах — никогда.
Если приложение тормозит на событиях, первым делом проверяйте дебаунсеры на наличие
Вывод:
Кажется, что
process.nextTick быстрее setTimeout(fn, 0), поэтому его часто используют в дебаунсерах. Но в production это может заблокировать Event Loop, превратив приложение в тормознутый монолит. Ошибка в том, что разработчики путают микрозадачи с макрозадачами и не видят последствий.Почему nextTick опасен в дебаунсере?
process.nextTick выполняется до всех фаз Event Loop, включая I/O и таймеры. Если дебаунсер вызывает nextTick рекурсивно или на каждое событие, микрозадачи забивают очередь, и Event Loop не может перейти к другим фазам. Результат: CPU 100%, запросы висят, приложение умирает.*
nextTick никогда не даст выполниться I/O, пока его очередь не опустеет.* Это убивает производительность при частых событиях, например, в WebSocket или resize.
Что происходит под капотом?
Когда вы пишете:
function badDebounce(fn) {
let pending = false;
return function() {
if (!pending) {
pending = true;
process.nextTick(() => {
pending = false;
fn();
});
}
};
}То при каждом вызове кладется микрозадача. Если событие приходит каждую миллисекунду, Event Loop не успевает обработать I/O, таймеры или setImmediate. Это классический starvation.
Как диагностировать проблему?
* Используйте
node --inspect и CPU profiling: ищите много вызовов nextTick в стеке.* Clinic.js покажет, как микрозадачи занимают 100% цикла.
* Старый трюк — замер времени через
process.hrtime.bigint(): если setImmediate выполняется с большой задержкой, значит, nextTick блокирует.Правильный дебаунс — через setTimeout
function debounce(fn, delay) {
let timer = null;
return function() {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, arguments), delay);
};
}Это макрозадача, которая не блокирует Event Loop.
setTimeout корректно обрабатывает события на I/O фазе и не вызывает starvation.Когда nextTick оправдан?
Только для синхронной обработки ошибок или действий, которые должны выполниться строго до следующей фазы. В дебаунсерах — никогда.
Если приложение тормозит на событиях, первым делом проверяйте дебаунсеры на наличие
process.nextTick. Это частая причина падения производительности в Node.js.Вывод:
process.nextTick в дебаунсере блокирует Event Loop и приводит к starvation I/O, используйте setTimeout как единственно правильный вариант, чтобы не убить производительность в production.Forwarded from PSD | Дизайн-пространство