javascript - Nodejs 中的 JS Performance.now() 和 console.time() 不准确?

标签 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 ,并使用 .thenawait 吗?或者我错过了一些关于 JS 的更基本的东西(比如事件循环或调用堆栈)?

我经历过:

最佳答案

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

关于javascript - Nodejs 中的 JS Performance.now() 和 console.time() 不准确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994439/

相关文章:

javascript - 试图将流体宽度 div 变成 100% 宽模态

javascript - 查找基于的所有对象的正确查询有很多关系

javascript - Express js - 请求正文为空

javascript - 如何检查并添加 https ://to Url ? MEAN Stack 应用程序

javascript - AngularJs - 在 ng-repeat 中执行函数

javascript - 从新数组使用 $.makeArray() 功能后获取对象属性

javascript - jQuery 点击功能转换为悬停在全宽下拉菜单上

linux - 解释多线程程序的 Linux 时间命令结果 (%CPU > 100)

java - 为什么 `parallelStream` 比 `CompletableFuture` 实现快?

c++ - 使用 std::vector 分配的类比指针分配慢很多