我做了一些涉及在浏览器中处理大量数据的工作。因此,我试图优化一切到螺母和螺栓。我不需要任何人告诉我,我在浪费时间,或者过早的优化是万恶之源。
我只想知道是否有人了解JS如何工作会知道小于布尔值的运行速度是否小于等于布尔值。我的意思是,将:
return (i<2? 0:1)
解析并运行得比以下更快:
return (i<=1? 0:1)
在这个例子中,我们假设i是一个整数。感谢。
答案 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)