我的情况如下:
for(var i = 0; i < a + b; ++i)
// code that doesn't affect a and b
我是否应该担心每次迭代都会进行添加?或者JavaScript(它的解析器?)足够聪明,可以理解a + b
是不变的吗?
换句话说,我应该这样做:
var end = a + b;
for(var i = 0; i < end; ++i)
// code
或者这会浪费一行代码吗?
嗯,实际上我担心的不是那一行代码,而是每当我在JavaScript中遇到这样的情况时我都会考虑这个问题!此外, 今天它是一个补充,明天它可能是其他东西,比如它的平方根,所以我认为它很重要! < / p>
答案 0 :(得分:4)
每次都要对这个条件进行评估。
来自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for
for ([initialization]; [condition]; [final-expression])
statement
条件:在每次循环迭代之前评估的表达式。如果 此表达式求值为true,执行语句。这个 条件测试是可选的。如果省略,则始终为条件 评估为真。如果表达式的计算结果为false,则执行 跳到for构造后面的第一个表达式。
(Italic是我的)
可能或无法对条件的子表达式进行优化,具体取决于引擎:当您遇到类似疑问时,您可以做到最快做的是设置测试并测量性能。
根据this test例如,这两个版本在最新的Chrome和Firefox上使用的时间相同。
然而,关于这种优化的拇指规则是:不要过早优化。来自维基百科上的Program optimization:
“我们应该忘记效率低,大约97%的时间说: 过早优化是万恶之源。但我们不应该通过 我们在关键的3%“
中获得机会Knuth,唐纳德(1974年12月)。 “结构化编程与转到 声明“.ACM Journal Computing Surveys 6(4):268。CiteSeerX: 10.1.1.103.6084。
编写功能正确的代码,而不必担心这种小问题或疑问性能问题。执行时,如果发现存在性能问题,请深入挖掘并进行优化。
<强> TL; DR 强>
你不应该担心这一点,性能影响可能很小,现代的javascript引擎似乎无论如何都要优化它。
但如果你仍然担心,写一行代码在我看来并不是一件大事。那么为什么不只是这样做,而不再考虑它?
答案 1 :(得分:2)
最好像这样定义常量:
for(var i = 0, end = a + b; i < end; ++i)
优化方式
您可以像这样编写循环:
for(var i = a + b; i--;)
这对我来说更优化但i
正在下降而不是提升
更多示例
一个简单的例子来理解。如果您创建这样的循环:
for(var i = 0; i < array.length; ++i) {
array.push('value'); // infinite loop
}
array.length
会在每次迭代时进行评估,您可以使用array.push()
创建无限循环。
答案 2 :(得分:0)
将对每个循环进行评估,但是您在示例中使用的简单加法操作(例如a + b)通常是一种简单的操作,您不会以某种方式看到明显的差异。话虽如此,最好在循环之前将a和b放在一起,如第二个例子所示。