Как измерить время выполнения функции в JavaScript?
Основные способы измерения времени выполнения функций
В JavaScript есть несколько надёжных способов замерить время выполнения функции. Рассмотрим их от простого к более точному.
1. Самый простой способ: console.time() и console.timeEnd()
Этот метод встроен в браузерные инструменты разработчика и Node.js. Он прост в использовании:
console.time('myFunction');
// Ваша функция
function processData(items) {
let result = [];
for (let i = 0; i < items.length; i++) {
result.push(items[i] * 2);
}
return result;
}
processData([1, 2, 3, 4, 5]);
console.timeEnd('myFunction'); // Выведет: myFunction: 0.123ms
Плюсы: Простота, автоматическое форматирование.
Минусы: Нельзя получить значение программно (только в консоль), точность может быть ниже.
2. Точный способ: performance.now() (рекомендуется)
Этот метод возвращает высокоточную метку времени (с точностью до микросекунд). Он доступен как в браузерах, так и в Node.js (через модуль perf_hooks):
const start = performance.now();
// Ваша функция
function processData(items) {
let result = [];
for (let i = 0; i < items.length; i++) {
result.push(items[i] * 2);
}
return result;
}
processData([1, 2, 3, 4, 5]);
const end = performance.now();
const duration = end - start;
console.log(`Время выполнения: ${duration} миллисекунд`);
Для Node.js (если performance не определён):
const { performance } = require('perf_hooks');
// ... далее тот же код
3. Универсальная функция-обёртка
Чтобы не писать одно и то же каждый раз, можно создать вспомогательную функцию:
function measureTime(fn, ...args) {
const start = performance.now();
const result = fn(...args);
const end = performance.now();
console.log(`Функция ${fn.name} выполнилась за ${(end - start).toFixed(2)} мс`);
return result;
}
// Использование:
const data = [1, 2, 3, 4, 5];
const processed = measureTime(processData, data);
4. Для асинхронных функций
С асинхронными функциями нужно работать аккуратно:
async function measureAsyncTime(fn, ...args) {
const start = performance.now();
const result = await fn(...args);
const end = performance.now();
console.log(`Асинхронная функция выполнилась за ${(end - start).toFixed(2)} мс`);
return result;
}
// Пример асинхронной функции
async function fetchData(url) {
const response = await fetch(url);
return response.json();
}
// Использование:
measureAsyncTime(fetchData, 'https://api.example.com/data');
Что выбрать?
- Для быстрой отладки в консоли — используйте
console.time. - Для точных измерений и программного анализа —
performance.now(). - Для асинхронных операций — обёртка с
await. - Для бенчмаркинга — запускайте функцию много раз (например, 1000) и усредняйте результат.
Важно: не забывайте, что время выполнения может варьироваться из-за нагрузки на процессор, сборки мусора и других факторов. Для точных замеров запускайте тесты несколько раз.
<<Альтернативный подход: использование Date.now()
Хотя Date.now() менее точен (миллисекунды), он может быть полезен, если performance недоступен (например, в очень старых средах):
const start = Date.now();
// ваш код
const end = Date.now();
console.log(`Время: ${end - start} мс`);
Специализированные инструменты
Для серьёзного профилирования используйте встроенные инструменты браузера (Chrome DevTools → Performance) или Node.js --prof флаг. Они покажут не только время, но и стек вызовов, память и узкие места.
Также существуют библиотеки для бенчмаркинга:
- Benchmark.js — популярная библиотека для точных замеров с учётом статистики.
- micro-benchmark — лёгкая альтернатива.
// Пример с Benchmark.js
const Benchmark = require('benchmark');
const suite = new Benchmark.Suite();
suite
.add('Вариант 1', function() {
// код функции
})
.add('Вариант 2', function() {
// другой код
})
.on('cycle', function(event) {
console.log(String(event.target));
})
.run();
Выбирайте инструмент под задачу: для быстрой проверки — performance.now(), для серьёзного сравнения — Benchmark.js.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги