哪个布尔运算更快<或者<=

Which Boolean is Faster? < or <=

本文关键字:lt 或者 布尔运算      更新时间:2023-09-26

我正在做一些工作,涉及在浏览器中处理大量数据。因此,我正在努力优化一切,直到螺母和螺栓。我不需要任何人告诉我我在浪费时间,或者过早优化是万恶之源。

我只是想知道,如果有人了解JS的工作原理,会不会知道小于布尔值的布尔值是否比小于等于布尔值的运行速度更快。我的意思是,会:

return (i<2? 0:1)

被解析并运行速度快于:

return (i<=1? 0:1)

在这个例子中,我们假设i是一个整数。谢谢

JavaScript标准描述了评估这些表达式所需采取的步骤。您可以查看ECMAScript 2015语言规范,第12.9.3节。

请注意,即使这两个操作的步骤略有不同,应用程序中的其他内容对性能的影响也会比JavaScript中无法控制的这些简单操作大得多。例如垃圾收集器的工作,即时编译器。。。

即使您尝试在JavaScript中测量时间,这也不会起作用,因为仅仅获取时间戳对性能的影响要比您想要测量的实际表达式大得多。此外,您编写的代码可能不是真正经过评估的代码,因为在实际运行代码之前,引擎可能会进行一些预优化。

我不会称之为微优化,而是称之为纳米优化
情况如此相似,你的测量精度很可能低于你预期的增益。。。

(编辑)
如果对该代码进行了优化,生成的汇编代码将从JA更改为JAE(在(x86)中),并且它们使用相同的循环计数。00000%的变化
如果不是,你可能会在引擎的select中赢得一步。。。

令人讨厌的是,它会让你错过更大的画面:除非我错了,否则你需要一个分支,如果你那么担心时间,你输入的统计分布会对执行时间产生更大的影响。(但仍然没有那么多…)

所以退一步比较一下:

if (i<2) 
    return 0;
else 
    return 1;

和:

if (i>=2) 
    return 1;
else 
    return 0;

您可以看到,对于(100,20,10,1,50,10)(1)分支更多,而对于(0,1,0,0,20,1),(2)分支更多
这将带来更大的不同。。。这可能很难衡量!!!

(作为留给读者的一个问题,我想知道return +(i>1)是如何编译的,以及是否有避免分支的技巧…)

(顺便说一句,我并不反对早期优化,如果你感兴趣的话,我甚至在这里发布了一些建议:https://gamealchemist.wordpress.com/2016/04/15/writing-efficient-javascript-a-few-tips/)

我已经使用performance.now API和console.time API的API都说明了执行函数/循环所花费的时间。我觉得主要的区别是结果,性能。现在给出了更准确的值,即高达1/1000毫秒的

https://jsfiddle.net/ztacgxf1/

function lessThan(){
    var t0 = performance.now();
    console.time("lessThan");
    for(var i = 0; i < 100000; i++){
        if(i < 1000){}
    }
   console.timeEnd("lessThan");
   var t1 = performance.now();
   console.log("Perf -- >>" + (t1-t0));
}
function lessThanEq(){
    var t0 = performance.now();
    console.time("lessThanEq")
    for(var i = 0; i < 100000; i++){
        if(i <= 999){}
    }
    console.timeEnd("lessThanEq");
    var t1 = performance.now();
    console.log("Perf -- >>" + (t1-t0));
}
lessThan()
lessThanEq()

我没有太大区别。可能迭代得更多可能会得到不同的结果。

希望这对你有帮助。