Javascript Node.js中的console.time()与performance.now()的比较

Javascript Node.js中的console.time()与performance.now()的比较,javascript,node.js,arrays,algorithm,performance,Javascript,Node.js,Arrays,Algorithm,Performance,我在Internet上找到了几篇文章,并在这里找到了有关如何在Node中度量代码性能的问题。但我得到的结果相差大约两倍,这取决于测量工具。 目标功能是: 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, 2

我在Internet上找到了几篇文章,并在这里找到了有关如何在Node中度量代码性能的问题。但我得到的结果相差大约两倍,这取决于测量工具。 目标功能是:

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;
    
}
这里我想知道数组中是否有两个数字,加上它们,我得到被调用函数的第二个参数。我独立使用这两种方法,只是注释了代码的相应部分
console.time()
给出了平均0.300ms的性能分数

performance.now()
给出0.170ms


请帮助我理解为什么这两种方法会产生不同的结果(几乎是原来的两倍)?我使用的是节点v15、CPU核心i5、8GB RAM、Win10。

如果将测量值放在一个小循环中,您会发现它们几乎与自身不一致

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.")

}
它们几乎是随机数,毫无用处。
但是,如果我调用
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.")

}
它仍然有将近半秒的传播,但很明显,平均(1000万次呼叫)约为16秒,因此一次呼叫约为0.016毫秒,这显然不是任何单个呼叫所测量的


TL;DR:时间就是时间,衡量什么比选择什么计时器API重要得多。

您是否尝试过将这两种方法互换?您的“基准测试”没有预热时间,第一次跑步需要更长的时间并不罕见。是的,我试着分别启动两个测试,每次大约20次。这不太可能是100-300毫秒,但是0.100-0.300毫秒,在我的笔记本电脑上只运行了一次2毫秒,它被浏览器吃掉了,有一个i5。此外,您可能希望将测量线放入一个循环中,以检查它们是否与如此短的时间一致。哦,是的,我编辑了数字“TL;DR:时间就是时间,您测量的内容远比您选择的计时器API重要。”这是纯金。一般来说,这也是一个很好的答案,因为我们中的许多人都需要大致的标准,而不是最准确或最精确的测量。
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.
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.")

}
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.