Console.timeEnd: примеры (JAVASCRIPT)

Использование console.timeEnd для замера времени выполнения кода
Раздел: Отладка, Производительность
console.timeEnd(label: String): undefined

Описание функции console.timeEnd

Функция console.timeEnd() является частью Console API в JavaScript и предназначена для завершения измерения времени выполнения участка кода, который был начат с помощью функции console.time(). Она используется для профилирования и отладки производительности скриптов.

Функция вызывается с одним обязательным аргументом — меткой (label), которая должна совпадать с меткой, переданной в console.time(). При вызове функция выводит в консоль браузера или среду выполнения (например, Node.js) строку, содержащую метку и прошедшее время в миллисекундах.

Возвращаемое значение: функция console.timeEnd() не возвращает никакого значения (undefined). Ее основная задача — вывод информации в консоль. В некоторых средах, таких как Node.js, время также может быть доступно через высокоточные таймеры (process.hrtime.bigint()), но сам метод возвращает undefined.

Базовые примеры использования

Простейший пример измерения времени выполнения цикла:

console.time('Цикл for');
for (let i = 0; i < 1000000; i++) {
  // Имитация работы
}
console.timeEnd('Цикл for');
Цикл for: 12.345ms

Измерение времени асинхронной операции:

console.time('Запрос данных');
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => {
    console.timeEnd('Запрос данных');
  });
Запрос данных: 456.789ms

Похожие функции в JavaScript

performance.now(): возвращает текущее время в миллисекундах с высокой точностью (до микросекунд). Позволяет вручную вычислять разницу между двумя замерами. Часто используется для более точных и гибких измерений, чем console.time().

const start = performance.now();
// Код для замера
const end = performance.now();
console.log(`Выполнено за ${end - start} мс`);

Date.now(): возвращает текущее время в миллисекундах с начала эпохи Unix. Менее точен, чем performance.now(), но подходит для простых замеров с точностью до миллисекунды.

const start = Date.now();
// Код для замера
const end = Date.now();
console.log(`Выполнено за ${end - start} мс`);

Выбор метода зависит от требуемой точности и удобства. console.time/timeEnd удобны для быстрой отладки, тогда как performance.now() лучше подходит для детального анализа производительности в продакшене.

Альтернативы в других языках программирования

Python: модуль time с функцией time.perf_counter().

import time
start = time.perf_counter()
# Код для замера
end = time.perf_counter()
print(f"Выполнено за {end - start:.6f} секунд")
Выполнено за 0.123456 секунд

PHP: функция microtime(true).

$start = microtime(true);
// Код для замера
$end = microtime(true);
echo "Выполнено за " . ($end - $start) . " секунд";

C: использование заголовочного файла time.h и функции clock().

#include <time.h>
#include <stdio.h>
int main() {
    clock_t start = clock();
    // Код для замера
    clock_t end = clock();
    double time_spent = (double)(end - start) / CLOCKS_PER_SEC;
    printf("Выполнено за %f секунд\n", time_spent);
    return 0;
}

Основное отличие от JavaScript заключается в том, что в других языках обычно нет встроенной пары функций для автоматического вывода результата в консоль, и разработчику нужно вручную вычислять разницу и форматировать вывод.

Типичные ошибки

1. Несоответствие меток у console.time() и console.timeEnd(). Это приводит к предупреждению в консоли и отсутствию вывода времени.

console.time('метка1');
// Код
console.timeEnd('метка2'); // Ошибка: метки не совпадают
Timer 'метка2' does not exist

2. Многократный вызов console.timeEnd() с одной и той же меткой без перезапуска таймера. Второй и последующие вызовы также выводят предупреждение.

console.time('таймер');
// Код
console.timeEnd('таймер'); // Вывод времени
console.timeEnd('таймер'); // Ошибка
таймер: 10ms
Timer 'таймер' does not exist

3. Использование зарезервированных или некорректных символов в метке. Хотя это редко приводит к ошибкам, может усложнить чтение вывода.

Изменения в последних версиях

Функция console.timeEnd() является стабильной частью Console API и не претерпевала существенных изменений в последних версиях ECMAScript. Однако, в различных средах выполнения могут быть добавлены улучшения. Например, в Node.js начиная с версии 10.0.0, время выводится с более высокой точностью. В браузерах реализация также следует стандартам, и существенных изменений в синтаксисе или поведении не было.

Важно отметить, что в некоторых современных средах, таких как Node.js, существуют альтернативные API для измерения производительности, например, модуль perf_hooks с функцией performance.now(), который обеспечивает наносекундную точность.

Расширенные примеры

Использование вложенных таймеров для замера разных этапов выполнения:

Пример javascript
console.time('Общее время');
console.time('Этап 1');
// Код этапа 1
console.timeEnd('Этап 1');

console.time('Этап 2');
// Код этапа 2
console.timeEnd('Этап 2');

console.timeEnd('Общее время');
Этап 1: 50.123ms
Этап 2: 100.456ms
Общее время: 150.579ms

Измерение времени выполнения асинхронных функций с использованием async/await:

Пример javascript
async function fetchData() {
  console.time('fetchData');
  const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
  const data = await response.json();
  console.timeEnd('fetchData');
  return data;
}

fetchData();

Замер времени в циклах с накоплением результатов для статистики:

Пример javascript
const times = [];
for (let i = 0; i < 5; i++) {
  console.time(`Итерация ${i}`);
  // Имитация различной нагрузки в каждой итерации
  const delay = Math.random() * 100;
  const start = Date.now();
  while (Date.now() - start < delay) {}
  console.timeEnd(`Итерация ${i}`);
}
Итерация 0: 34.567ms
Итерация 1: 67.890ms
Итерация 2: 12.345ms
Итерация 3: 89.123ms
Итерация 4: 45.678ms

Использование в условиях для отладки медленных участков кода:

Пример javascript
function processArray(arr) {
  console.time('processArray');
  let result = 0;
  for (let i = 0; i < arr.length; i++) {
    // Медленная операция для демонстрации
    for (let j = 0; j < 10000; j++) {
      result += arr[i] * j;
    }
  }
  console.timeEnd('processArray');
  return result;
}

processArray([1, 2, 3, 4, 5]);
processArray: 250.123ms

JS console.timeEnd function comments

En
Console.timeEnd Ends a timer with a specific label and logs the elapsed time