是否在每个循环中评估for循环中的条件?

时间:2015-09-28 13:23:35

标签: javascript optimization

我的情况如下:

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>

3 个答案:

答案 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放在一起,如第二个例子所示。