Nodejs中的JS performance.now()和console.time()不正确吗?

时间:2020-01-30 21:00:06

标签: javascript node.js benchmarking

我对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');
}

但是,我没有收到运行该功能所花费的时间。例如,我的输出表明,找到第6个斐波那契数比第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)花费的时间更长,但是测量的时间更短!

通过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');
};

我怀疑计时器会随机停止或在通话结束之前停止。 我应该将回调转换为Promise,并使用.then还是await?还是我缺少有关JS的更基本的知识(例如事件循环或调用堆栈)?

我经历过:

1 个答案:

答案 0 :(得分:2)

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');
}