wat*_*ode 11 javascript arrays performance node.js performance.now
我在互联网上找到了几篇关于如何衡量 Node.js 代码性能的文章和问题。但根据测量工具的不同,我得到的结果大约相差两倍。目标函数为:
let arr = [75, 283, 361, 168, 23, 489, 421, 95, 72, 380, 384, 470, 235, 465, 276, 26, 364, 416, 373, 184, 211, 239, 485, 18, 19, 252, 447, 6, 291, 324, 497, 352,
458, 201, 238, 116, 333, 163, 207, 417, 340, 431, 5, 269, 258, 178, 182, 295, 257, 434, 37, 372, 154, 223, 313, 80, 71, 229, 379, 181, 396, 281, 491, 58, 254,
359, 79, 175, 143, 214, 217, 148, 393, 246, 34, 166, 251, 381, 413, 180, 338,
442, 494, 378, 123, 118, 395, 446, 459, 472, 457, 51, 127, 351, 389, 157, 260,
370, 405, 346]
const { performance } = require("perf_hooks")
function summBrute(arr, k) {
for(let i = 0; i < arr.length; i++) {
for(let j = i + 1; j < arr.length; j++) {
if(arr[i] + arr[j] == k) {
return true;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
测量方法有:
console.time('summBrute')
summBrute(arr, 394)
console.timeEnd('summBrute')
var t0 = performance.now()
summBrute(arr, 394) //
var t1 = performance.now()
console.log("Call to summBrute took " + (t1 - t0) + " milliseconds.")
Run Code Online (Sandbox Code Playgroud)
这里我想找出有问题的数组中是否有两个数字,将其相加,我得到被调用函数的第二个参数。我独立使用这两种方法,只需注释掉相应的代码部分即可。console.time()给出平均 0.300ms 的性能分数console.time 结果
并performance.now()给出 0.170ms 的性能。现在结果
请帮助我理解为什么这两种方法给出不同的结果(几乎翻倍)?我使用的是 Node v15、CPU Core i5、8GB RAM、Win10。
tev*_*dar 13
如果将测量结果放在一个小循环中,您会发现它们几乎与自身不一致。
for(let i=0;i<5;i++){
console.time('summBrute')
summBrute(arr, 394)
console.timeEnd('summBrute')
var t0 = performance.now()
summBrute(arr, 394) //
var t1 = performance.now()
console.log("Call to summBrute took " + (t1 - t0) + " milliseconds.")
}
Run Code Online (Sandbox Code Playgroud)
生产
Run Code Online (Sandbox Code Playgroud)summBrute: 0.234ms Call to summBrute took 0.1938999891281128 milliseconds. summBrute: 0.171ms Call to summBrute took 0.13520002365112305 milliseconds. summBrute: 0.107ms Call to summBrute took 0.1332000494003296 milliseconds. summBrute: 0.095ms Call to summBrute took 0.10259997844696045 milliseconds. summBrute: 1.385ms Call to summBrute took 0.10839998722076416 milliseconds.
它们几乎是随机数,毫无用处。
但是如果我调用summBrute()1000 万次:
for(let i=0;i<5;i++){
console.time('summBrute')
for(let j=0;j<10000000;j++)
summBrute(arr, 394)
console.timeEnd('summBrute')
var t0 = performance.now()
for(let j=0;j<10000000;j++)
summBrute(arr, 394) //
var t1 = performance.now()
console.log("Call to summBrute took " + (t1 - t0) + " milliseconds.")
}
Run Code Online (Sandbox Code Playgroud)
结果不再取决于我的计算机的情绪,而是变得更加一致:
Run Code Online (Sandbox Code Playgroud)summBrute: 16.369s Call to summBrute took 16184.267899990082 milliseconds. summBrute: 15.643s Call to summBrute took 15852.86260008812 milliseconds. summBrute: 16.355s Call to summBrute took 15942.392500042915 milliseconds. summBrute: 16.190s Call to summBrute took 16314.965299963951 milliseconds. summBrute: 16.523s Call to summBrute took 16744.983800053596 milliseconds.
它仍然有近半秒的时间跨度,但很明显,平均值(1000 万次调用)约为 16 秒,因此一次调用约为 0.016 毫秒,这显然不是任何单个调用测量的时间。
TL;DR:时间就是时间,你测量的内容比你选择的计时器 API 更重要。