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

gsa*_*ras 6 javascript optimization

我有这样的情况:

for(var i = 0; i < a + b; ++i)
  // code that doesn't affect a and b
Run Code Online (Sandbox Code Playgroud)

我是否应该担心每次迭代都会进行添加?或者JavaScript(它的解析器?)足够聪明,可以理解它a + b是不变的吗?

换句话说,我应该这样做:

var end = a + b;
for(var i = 0; i < end; ++i)
  // code
Run Code Online (Sandbox Code Playgroud)

或者这会浪费一行代码?


好吧,实际上我担心的不是那一行代码,而是每当我在JavaScript中面对这样的情况时我都会考虑这个问题!此外,今天它是一个补充,明天它可能是其他东西,如它的平方根,所以我认为这很重要!

And*_*cia 5

每次将评估条件。

来自:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/

for ([initialization]; [condition]; [final-expression])
   statement
Run Code Online (Sandbox Code Playgroud)

条件在每次循环迭代之前要求值的表达式。如果此表达式的值为true,则执行语句。此条件测试是可选的。如果省略,则条件始终为true。如果该表达式的计算结果为false,则执行将跳至for构造之后的第一个表达式。

(斜体是我的)

可能会可能不会是在条件的子表达式的优化,根据发动机:当你有一个类似的疑问,你可以做最快的是要建立一个测试和测量性能。

根据这个测试例如,,两个版本在最新的Chrome和Firefox上使用的时间相同。

但是,关于这种优化的经验法则是:不要过早地优化。从Wikipedia上的程序优化

我们应该忘记效率低下的问题,大约有97%的时间是这样:过早的优化是万恶之源。但是,我们不应该在这3%的临界水平上放弃机会

唐纳德·努斯(1974年12月)。“转到语句的结构化编程”。ACM Journal Computing Surveys 6(4):268。CiteSeerX:10.1.1.103.6084。

编写功能正确的代码,而不必担心如此小的或令人怀疑的性能问题。执行时,如果发现性能问题,请进行挖掘和优化。

TL; 博士

您不必为此担心,对性能的影响可能很小,而且现代javascript引擎似乎仍然可以对此进行优化。

但是,如果您仍然担心,编写代码行对我来说似乎不是什么大浪费。那么,为什么不只是这样做,而停止思考呢?

  • 注意,这意味着每次循环迭代都会评估_whole condition_。如果优化器很聪明,它可能仍会缓存其子部分(即OP询问的“ a + b”) (3认同)

R3t*_*tep 5

最好像这样定义常量:

for(var i = 0, end = a + b; i < end; ++i)
Run Code Online (Sandbox Code Playgroud)

优化方式

你可以这样写你的循环:

for(var i = a + b; i--;)
Run Code Online (Sandbox Code Playgroud)

这对我来说是更优化的,但是i下降而不是上升


更多示例

一个简单的例子就可以理解。如果您像这样创建循环:

for(var i = 0; i < array.length; ++i) { 
   array.push('value'); // infinite loop
}
Run Code Online (Sandbox Code Playgroud)

array.length在每次迭代时都会进行评估,您可以使用 来创建无限循环array.push()