JS performance.now () и console.time () неточны в Nodejs? - PullRequest
0 голосов
/ 31 января 2020

Я относительно новичок в JS и пытался тестировать некоторый код (для изучения производительности различных алгоритмов), чтобы я мог просто увидеть, сколько времени занимает работа на моем терминале. Первоначально у меня было:

function benchmark(callback, name = `${callback+""}`) { // Convert callback to literal string if no name provided
  console.log(`${name}`);
  console.time("time");
  console.log(`\t${callback}`);
  console.timeEnd("time");
  console.log('\n');
}

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

Пример 1:

function fib(n) {
  if (n === 1 || n === 2) return 1;
  return fib(n - 1) + fib(n - 2);
}

Когда я запускаю:

benchmark(fib(6), "fib(6) Rep 1");    // 0.5449770092964172ms
benchmark(fib(50), "fib(50) Rep 1"); //  0.004218995571136475ms

От fib(50) до финала sh требуется больше времени, но измеренное время короче!

Модифицированный эталонный тест с помощью performance.now() также не работает

Я столкнулся с той же проблемой выше если я использую performance.now().

const {performance} = require('perf_hooks');
function benchmark(callback, name = `${callback+""}`) {
  let t0 = performance.now();
  let result = callback;
  let t1 = performance.now();
  console.log(`\t${result}`);
  console.log(`time: ${t1 - t0}ms`);
  console.log('\n');
};

, я подозреваю, что таймеры останавливаются случайным образом или до завершения вызова. Должен ли я преобразовать обратный вызов в обещание и использовать .then или await? Или я упускаю что-то более фундаментальное в JS (например, событие l oop или стек вызовов)?

Я прошел через:

1 Ответ

2 голосов
/ 31 января 2020

Klaycon решил это для меня в комментарии выше, но по какой-то причине не может опубликовать ответ. Я передавал номер (а не обратный звонок); Я оценивал обратный вызов ДО таймеров.

Чтобы решить мою проблему, мне сначала нужно передать фактический обратный вызов в мою функцию benchmark():

  benchmark( () => fib(6), "fib(6) Rep 1");

, а затем мне нужно вызвать мой обратный вызов в самой функции бенчмарка:

function benchmark(callback, name = `${callback + ""}`) {
  console.log(`${name}`);
  console.time("time");
  console.log(`\t${callback()}`);          // ##### CHANGE HERE ######
  console.timeEnd("time");
  console.log('\n');
}
...