【问题标题】:set length to variable or calculate length within loop statment将长度设置为变量或在循环语句中计算长度
【发布时间】:2012-08-03 00:05:03
【问题描述】:

在执行for循环之前用另一个变量的长度声明一个变量更有效还是应该在循环内计算长度。

我确定答案取决于计算长度的数组有多大。我只是总是看到

for ( var i = 1; i <= theVar.length; i++ ) {

}

但后来有人告诉我这样做的资源密集度较低

var theVarLen = theVar.length

for ( var i = 1; i <= theVarLen; i++ ) {

}

因为它避免了每次迭代都重新计算长度。

还是取决于具体情况,以至于无法做出明确的法令?

或者,这根本不重要..?

非常感谢!

【问题讨论】:

  • 测试它:jsperf.com。但长话短说,长度不会重新计算,它是一个固定值,每当数组更改时都会更新。您每次迭代保存一个属性查找,这确实可以产生影响,具体取决于迭代次数(-&gt; 数组长度)。
  • 作为旁注,我也经常看到这种方式:for(var i = 0, len = a.length; i &lt; len; i++)
  • 我见过while (theLen--&gt;=0) …。我认为有些人认为它看起来很酷,因为它有一个模棱两可的箭头操作符。我个人不喜欢它。 ;)
  • @JosephMarikle 嗯。你认为这有什么好处?它正在做这两件事!

标签: javascript


【解决方案1】:

好吧,让我们找出答案。我在这里创建了一个可以运行的测试:http://jsperf.com/loop-length-caching

浏览器似乎会在创建(并可能修改)数组后存储它的长度,因此将长度存储在变量中并没有巨大的速度优势。唯一真正的因素(在这种情况下)是访问对象属性和访问变量之间的速度差异。

【讨论】:

  • 每次访问.length不会重新计算长度。
  • 我就是这么想的。但从测试来看,缓存长度似乎使循环速度提高了约 20%。如果它以任何一种方式缓存,为什么会有速度差异?
  • 属性访问比访问变量慢。见:jsperf.com/loop-length-caching/2
  • @FelixKling 这是有道理的。我很难相信它会。对 Blender 和 Felix 来说:既然它的速度提高了,那么你建议用后一种方式吗?
  • @thomas:看看上面约瑟夫的评论,这是一种常见的方式。也就是说,浏览器优化代码的方式不同,所以你是否获得优势也取决于浏览器。如果你一般对性能和 JavaScript 感兴趣,我推荐这本书:shop.oreilly.com/product/9780596802806.do
【解决方案2】:

可以说,它少了一个指向内部取消引用的指针,但我从来没有,曾经见过它在实际代码中以第二种方式完成。我相信人们很难证明你可能获得的任何表现是合理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 2016-06-28
    • 2015-06-13
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多