NodeJS用于循环优化

时间:2014-12-22 14:37:31

标签: javascript arrays node.js v8

我知道在浏览器中按照

的顺序编写for循环更为理想
 for(var i=0, l=arr.length; i<l; i++){ }

而不是

 for(var i=0; i<arr.length; i++){ }

但这在NodeJS中是真的还是V8引擎对它进行了优化?

我知道在ecma-262 5.1 sec-15.4数组长度定义如下:

  

length属性的值在数值上大于名称为数组索引的每个属性的名称;无论何时创建或更改Array对象的属性,都会根据需要调整其他属性以保持此不变量。

因此,如果长度没有改变,这个方法会变慢的唯一原因是因为你必须访问该属性。我正在寻找的是一个合理的示例/解释,它将显示V8引擎(在NodeJS中使用)在访问此属性时是否会受到影响。

3 个答案:

答案 0 :(得分:4)

如果arr是纯局部变量并且循环没有以任何方式触及它,那么是。但是,即使优化失败,反复加载相同的字段也不会因CPU缓存而花费任何成本。

答案 1 :(得分:2)

我总是会使用第一个(如果适用)因为它会通知解释器和任何未来的代码读者,循环不会修改数组的长度。

即使它不快(虽然http://jsperf.com/array-length-vs-cached表明它实际上是这样),但从循环外部对常量表达式进行因子分析是一种很好的做法。

答案 2 :(得分:1)

问题是长度的计算。在此示例中,将在每次循环迭代时计算for(var i=0; i<arr.length; i++){ }语句arr.length。但是for(var i=0, l=arr.length; i<l; i++){ }值将在没有任何计算的情况下进行。简单地获取值比计算数组的长度更快 任何编译器都无法优化获取长度,因为它可以更改。所以它计算了每次迭代。