Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否在每个循环中都计算for循环中的条件?_Javascript_Optimization - Fatal编程技术网

Javascript 是否在每个循环中都计算for循环中的条件?

Javascript 是否在每个循环中都计算for循环中的条件?,javascript,optimization,Javascript,Optimization,我的情况如下: for(var i = 0; i < a + b; ++i) // code that doesn't affect a and b 或者这会浪费一行代码吗 事实上,我担心的不是一行代码,而是每次我在JavaScript中遇到这样的情况时都会想到它!另外,今天它是一个加法,明天它可能是其他的,比如它的平方根,所以我认为它很重要每次都要评估该条件 发件人: 条件:在每次循环迭代之前要计算的表达式。如果 此表达式的计算结果为true,则执行语句。这 条件测试是可选的。如

我的情况如下:

for(var i = 0; i < a + b; ++i)
  // code that doesn't affect a and b
或者这会浪费一行代码吗



事实上,我担心的不是一行代码,而是每次我在JavaScript中遇到这样的情况时都会想到它!另外,今天它是一个加法,明天它可能是其他的,比如它的平方根,所以我认为它很重要

每次都要评估该条件

发件人:

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

(斜体是我的)

根据引擎的不同,可能对条件的子表达式进行优化,也可能不进行优化:当您有类似的疑问时,您可以做的最快的事情是设置测试并测量性能

举例来说,在最新的Chrome和Firefox上,这两个版本占用相同的时间

然而,这种优化的经验法则是:不要过早地优化。来自维基百科:

“我们应该忘记小效率,比如说97%的时间: 过早的优化是万恶之源,但我们不应该过关 在这关键的3%中增加我们的机会。”

克努特,唐纳德(1974年12月)。“带go to的结构化编程 声明”。ACM杂志计算调查6(4):268。城市服务器: 10.1.1.103.6084

编写功能正确的代码,而不必担心如此小或可疑的性能问题。执行时,如果发现性能问题,请深入挖掘并优化

TL;DR

您不必担心这一点,对性能的影响可能很小,而现代javascript引擎似乎已经对此进行了优化


但是如果你仍然担心,在我看来,写一行代码并不是一个很大的浪费。那么,为什么不这样做,停止思考呢?

最好这样定义常数:

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
}
(var i=0;i
array.length
在每次迭代中都会计算,您可以使用
array.push()创建一个无限循环

将对每个循环进行评估,但示例中使用的简单加法操作(如a+b)通常非常简单,您不会看到任何明显的差异。也就是说,在循环之前添加a和b是一个更好的主意,如第二个示例中所示。

我非常确定每次迭代都会对其进行评估,我可以想象它会在每一行上进行评估,但这将取决于运行代码的任何javascript实现中的优化者。如果它足够聪明,它可能会优化它。一旦您(正确地)分析了代码,并且发现自己执行检查会减慢速度,那么就需要考虑手动优化。我会添加一行代码以提高可读性,而不管性能如何提高,顺便说一句,对于大多数当前的引擎来说,这是次要的。@illiptic:我会避免使用额外的一行,因为同样的原因(除非变量有比
end
更具描述性的名称):-)我同意性能可以忽略不计。“我担心的是,我每次面对这样的情况时都会想到它。”:注意,这意味着每次循环迭代都会对整个条件进行评估。如果Optimizer很聪明,它可能仍然会缓存它的子部分(即OP询问的
a+b
),我知道,这就是为什么我在下一段中说可能存在优化或不存在优化,这取决于引擎。写这篇文章的方法很好。我不确定你的第二个例子是如何为你的论点提供权重的-你可以同样地将
end++
放在循环中,并遇到同样的问题。如果你要写糟糕的代码,你会得到糟糕的结果…@JamesThorpe True,我改变了示例是的,这是一个更容易理解的问题-可能是一个更微妙的错误,但本质上仍然是糟糕的代码:)这可能是一个好建议,但与问题无关。我真的不明白为什么它被选为公认的答案。
for(var i = a + b; i--;)
for(var i = 0; i < array.length; ++i) { 
   array.push('value'); // infinite loop
}