При оценке скорости выполнения кода часто допускается одна и та же ошибка — измерение времени одной операции:
const start = performance.now();
"the sky is blue".split(' ').reverse().join(' ');
const end = performance.now();
console.log('Время выполнения =', end - start);
Такой подход даёт неточный и практически бесполезный результат. Разберёмся, почему.
Во-первых, операция слишком мала. Современные JavaScript-движки выполняют подобные выражения за доли микросекунд, и на итоговое значение начинают влиять посторонние факторы: планировщик задач, загрузка процессора, работа других вкладок.
Во-вторых, влияет JIT-компиляция. Движки, такие как V8 JavaScript engine, сначала исполняют код в базовом режиме, а затем оптимизируют его. Поэтому первый запуск не отражает реальную производительность.
В-третьих, возможны оптимизации со стороны движка: повторяющиеся вычисления могут кэшироваться или упрощаться, что искажает измерение.
Как измерять корректно
1. Выполняйте операцию многократно
const ITERATIONS = 1_000_000;
const start = performance.now();
for (let i = 0; i < ITERATIONS; i++) {
"the sky is blue".split(' ').reverse().join(' ');
}
const end = performance.now();
console.log('Среднее время:', (end - start) / ITERATIONS);
Это позволяет получить усреднённое значение и снизить влияние случайных факторов.
2. Используйте «прогрев» (warm-up)
for (let i = 0; i < 10000; i++) {
"test string".split(' ').reverse().join(' ');
}
Перед измерением стоит выполнить код несколько тысяч раз, чтобы движок успел применить оптимизации.
3. Сравнивайте функции изолированно
Каждый тест должен выполняться отдельно, в одинаковых условиях. Нельзя делать выводы, измеряя несколько вариантов подряд без контроля среды.
4. Используйте специализированные инструменты
Для более точного анализа подойдут:
*
performance.now()*
console.time()* библиотеки вроде Benchmark.js
#js