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

时间:2016-05-16 18:26:38

标签: javascript arrays sorting optimization micro-optimization

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

我只想知道是否有人了解JS如何工作会知道小于布尔值的运行速度是否小于等于布尔值。我的意思是,将:

return (i<2? 0:1)

解析并运行得比以下更快:

return (i<=1? 0:1)

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

3 个答案:

答案 0 :(得分:2)

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

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

令人烦恼的是它让你错过了更大的画面:除非我错了,你需要一个分支,如果你担心时间,你的输入的统计分布将影响更多的执行时间。 (但仍然没那么多......)

然后退后一步并进行比较:

select

和:

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

你看到(100,20,10,1,50,10)(1)将分支更多,而(0,1,0,0,20,1),(2)分支更多。<登记/> 这会产生更大的不同......这可能也很难衡量!!!

(作为一个留给读者的问题,我想知道if (i>=2) return 1; else return 0; 如何编译,以及是否有诀窍避免分支......)

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

我使用performance.now API和console.time API创建了一个小提琴 这两个API都说明执行函数/循环所需的时间是多少。 我觉得主要区别在于结果,性能。现在给出更准确的值,即高达1/1000毫秒。 https://jsfiddle.net/ztacgxf1/ function lessThan(){     var t0 = performance.now();     console.time( “每种不超过”);     for(var i = 0; i&lt; 100000; i ++){         if(i <1000){}     }    console.timeEnd( “每种不超过”);    var t1 = performance.now();    console.log(“Perf - &gt;&gt;”+(t1-t0)); } function lessThanEq(){     var t0 = performance.now();     console.time( “lessThanEq”)     for(var i = 0; i&lt; 100000; i ++){         if(i <= 999){}     }     console.timeEnd( “lessThanEq”);     var t1 = performance.now();     console.log(“Perf - &gt;&gt;”+(t1-t0)); } 少于() lessThanEq() 我差别不大。可能迭代更多可能会给出不同的结果。 希望这对你有所帮助。