Вопрос проверяет практический опыт кандидата в использовании профилировщиков для поиска узких мест производительности и утечек памяти в приложениях.
Профилировщик — это инструмент, который во время работы программы собирает статистику о том, какие функции вызываются, сколько времени они занимают и сколько памяти выделяется. Без него оптимизация превращается в угадывание: разработчик может часами улучшать код, который вообще не влияет на общую скорость. Профилировщик показывает реальные узкие места, поэтому его используют при расследовании просадок производительности, утечек памяти и высокого потребления CPU.
Допустим, эндпоинт отвечает медленно. Снимаем CPU-профиль через встроенный инспектор и смотрим самые «горячие» функции.
// запуск с инспектором
// node --inspect app.js
// затем в Chrome DevTools: Performance -> Record
function heavyCalc(n) {
let sum = 0;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) sum += i * j; // O(n^2)
}
return sum;
}
app.get('/slow', (req, res) => {
res.json({ result: heavyCalc(5000) });
});
Профиль покажет, что почти всё время уходит в heavyCalc. Дальше можно заменить алгоритм на линейный, кэшировать результат или вынести вычисление в отдельный воркер.
В Python удобно использовать tracemalloc или memory_profiler, чтобы увидеть, где растёт потребление памяти.
import tracemalloc
tracemalloc.start()
# ... код, который подозревается в утечке ...
snapshot = tracemalloc.take_snapshot()
for stat in snapshot.statistics('lineno')[:5]:
print(stat)
Вывод покажет файл и строку, где выделяется больше всего памяти. Часто причина — глобальный список, в который бесконечно добавляются объекты.
Итог: профилировщик стоит применять всегда, когда есть подозрение на узкое место или утечку — он экономит время и не даёт оптимизировать наугад. На собеседовании важно показать, что вы умеете не просто запускать инструмент, а интерпретировать его вывод и делать выводы.