哪个布尔值更快? < 或 <=

Which Boolean is Faster? < or <=

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

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

return (i<2? 0:1)

被解析并且 运行 比:

return (i<=1? 0:1)

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

我使用 performance.now API 和 console.time API 创建了一个 fiddle API 都表示执行 functions/loops 花费了多少毫秒的时间。 我觉得主要的区别在于结果,performance.now 给出了更准确的值,即高达 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()

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

希望对您有所帮助。

我不会称之为微优化,而是纳米优化。
案例非常相似,您的测量精度很可能低于您预期的增益...

(编辑)
如果优化此代码,生成的汇编代码将仅从 JA 更改为 JAE(在 (x86) 中,并且它们使用相同的循环计数。0,0000% 更改。
如果不是,您可能会在 select 引擎中赢得一步...

烦人的是它让你错过了大局:除非我错了,否则你需要一个分支,如果你担心时间,你输入的统计分布会影响更多执行时间。 (但还是没那么多...)

所以退一步比较一下:

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

和:

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

你看到 for ( 100, 20, 10, 1, 50, 10) (1) 会分支更多,而 for (0, 1, 0, 0, 20, 1), (2) 分支更多.
这将带来更大的不同……这可能也很难衡量!!!

(作为留给 reader 的问题,我想知道 return +(i>1) 是如何编译的,是否有避免分支的技巧...)

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

JavaScript 标准描述了评估这些表达式需要采取的步骤。你可以看一下ECMAScript 2015 Language Specification,第12.9.3节

请注意,即使这两个操作的步骤之间存在细微差别,应用程序中的其他内容对性能的影响也会比您在 JavaScript 中无法控制的这些简单操作大得多。例如垃圾收集器的工作,即时编译器,...

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