Javascript 解释非零检查的性能测试

Javascript 解释非零检查的性能测试,javascript,Javascript,我最近又陷入了过早优化的陷阱,希望能爬出来。然而,在我短暂的中场休息时,我遇到了一些事情,我想确认一下 我最基本的性能测试在chrome上得到了类似的结果(所有变量都是全局声明的,第一个需要9毫秒,第二个需要7.5毫秒): input=Array.from({length:1000000},()=>Math.random()>0.8?0:Math.random()*100000000); 开始=性能。现在(); 对于(设i=0;iMath.random()>0.8?0:Math.random()

我最近又陷入了过早优化的陷阱,希望能爬出来。然而,在我短暂的中场休息时,我遇到了一些事情,我想确认一下

我最基本的性能测试在chrome上得到了类似的结果(所有变量都是全局声明的,第一个需要9毫秒,第二个需要7.5毫秒):

input=Array.from({length:1000000},()=>Math.random()>0.8?0:Math.random()*100000000);
开始=性能。现在();
对于(设i=0;i<1000000;i++){
输入[i]=输入[i]==0?0:1;
}
log(performance.now()-start);

input=Array.from({length:1000000},()=>Math.random()>0.8?0:Math.random()*100000000);
开始=性能。现在();
对于(设i=0;i<1000000;i++){
输入[i]=((输入[i]|(~input[i]+1))>>>31)和1;
}
log(performance.now()-start);
考虑到循环和分配本身已经花费了大量的时间(~4.5ms),第二个循环可能需要约33%的时间,但这远远小于我的预期(在测量不准确度时,例如在FireFox上,两者都需要更长的时间,而第二个循环则需要约33%的时间)

在这一点上,我可以得出这样的结论:条件的优化已经在进行,类似的代码更改已经在进行,或者我是不是陷入了微基准的幻觉?在我看来,这一类的分支应该比计算花费过多的时间


我主要怀疑我自己的推理,因为我知道,由于不可预见的原因,这些类型的测试很容易产生扭曲的结果。

是的,这很可能是度量和JIT编译器效应的综合结果

特别是heuristik驱动的是如此之好,您将没有任何机会直观地看到更快语句的“真正”性能优势

我的浏览器中的差异如此之大,以至于两个代码需要大约相等的时间(在Opera中运行),这突出了您在FF中的效果

很高兴您发现1.5ms的优势,您不会看到更多。

我可能不会使用“优化”,因为它可读性差得多,速度也不是一个因素,因此在测量精度范围内(无法真正确定哪个更快)。PS:在阅读链接文章时,我看到了
节点--trace opt--tracedeopt
,很快就注意到,在IIFE中包装for循环也会加快这个过程,因为对于我来说,
控制台.log
有一个去优化步骤。我更加确信,这一切又是一场海市蜃楼,而在现实世界的应用程序中,实际测量哪种速度更快是无法用我所做的来完成的。
input = Array.from({ length: 1000000 }, () => Math.random() > 0.8 ? 0 : Math.random() * 1000000000 );
start = performance.now();
for (let i = 0; i < 1000000; i++) {
  input[i] = input[i] === 0 ? 0 : 1;
}
console.log(performance.now() - start);
input = Array.from({ length: 1000000 }, () => Math.random() > 0.8 ? 0 : Math.random() * 1000000000 );
start = performance.now();
for (let i = 0; i < 1000000; i++) {
  input[i] = ((input[i] | (~input[i] + 1)) >>> 31) & 1;
}
console.log(performance.now() - start);