JS performance.now() 和 console.time() 在 Nodejs 中不准确?
JS performance.now() and console.time() inaccurate in Nodejs?
我对 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');
};
我怀疑计时器随机停止或在通话结束前停止。
我应该将回调转换为承诺,并使用 .then
或 await
吗?还是我遗漏了一些关于 JS 的更基础的东西(比如事件循环或调用堆栈)?
我经历过:
- How can I benchmark JavaScript code?
- https://nodejs.org/api/console.html#console_console_timeend_label
Klaycon 在上面的评论中为我解决了这个问题,但由于某种原因不能 post 回答。我传递了一个数字(而不是回调);我正在评估计时器之前的回调。
要解决我的问题,我首先需要将实际回调传递到我的 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');
}
我对 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');
};
我怀疑计时器随机停止或在通话结束前停止。
我应该将回调转换为承诺,并使用 .then
或 await
吗?还是我遗漏了一些关于 JS 的更基础的东西(比如事件循环或调用堆栈)?
我经历过:
- How can I benchmark JavaScript code?
- https://nodejs.org/api/console.html#console_console_timeend_label
Klaycon 在上面的评论中为我解决了这个问题,但由于某种原因不能 post 回答。我传递了一个数字(而不是回调);我正在评估计时器之前的回调。
要解决我的问题,我首先需要将实际回调传递到我的 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');
}