Каков наиболее точный способ проверить скорость вычисления функции в JavaScript?

Мне нужно сравнить скорость вычислений некоторого кода, но я не уверен, что лучший способ сделать это. Есть ли какой-то встроенный таймер для этого? И можно ли получить скорость вычислений в наносекундах, или мне нужно иметь дело с миллисекундами JavaScript обычно работает с?

Ответ 1

Я столкнулся с API производительности. То, что вы ищете, вероятно, Performance.now(), которое даст вам микросекундное разрешение.

Метод Performance.now() возвращает DOMHighResTimeStamp, измеренный в миллисекундах, с точностью до одной тысячной миллисекунды, равной число миллисекунд с PerformanceTiming.navigationStartсвойство и вызов метода (источник).

Пример MDN:

var t0 = performance.now();
doSomething();
var t1 = performance.now();
console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.")

Функция, которую вы могли бы использовать для проверки производительности определенной короткой части кода несколько раз, вы могли бы использовать следующее:

/**
 * Finds the performance for a given function
 * function fn the function to be executed
 * int n the amount of times to repeat
 * return array [time elapsed for n iterations, average execution frequency (executions per second)]
 */
function getPerf(fn, n) {
  var t0, t1;
  t0 = performance.now();
  for (var i = 0; i < n; i++) {
    fn(i)
  }
  t1 = performance.now();
  return [t1 - t0, repeat * 1000 / (t1 - t0)];
}

Возвращает время, в течение которого выполняется однократное выполнение fn(i) в миллисекундах, и частота выполнения (выполнение в секунду). Чем выше значение n, тем больше точность, чем больше, тем больше времени требуется для проверки. Аргумент i может быть включен в тестируемую функцию, которая содержит текущую итерацию функции.

Ответ 3

Вы можете использовать jsPerf, чтобы получить статистически значимые результаты. Из-за различных систем JIT, задействованных в браузерах, результаты работы могут сильно различаться, поэтому jsPerf или используемая им библиотека Benchmarking.js будут запускать ваш код столько раз, сколько нужно для получения хороших результатов. Но учтите, что если функция работает всего за несколько наносекунд, беспокоиться о ее производительности почти всегда не нужно.

Ответ 4

Вы можете использовать Инструменты разработчика Script Профайлер Internet Explorer. Я уверен, что есть аналогичный инструмент для Chrome и Firefox. Это даст вам миллисекунды. Но если время меньше, чем миллисекунда, то я думаю, что он будет отображаться и в наносекундах.