Javascript For-Loop条件缓存

时间:2014-09-12 20:53:14

标签: javascript performance

我已经整理了一个jsperf测试,该测试比较迭代数组的循环,缓存数组长度条件而非缓存。我认为之前缓存变量以避免重新计算数组长度每次迭代会更快,但jsperf测试说不然。有人可以解释为什么会这样吗?我还认为在for循环初始化中包含数组长度变量定义(缓存时)会减少时间,因为解析不需要两次查找“var”关键字,但这似乎也不是情况下。

没有缓存的示例:

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

缓存的例子

var len = testArray.length;
for(var i = 0; i < len; i++){
  //
}

在for循环初始化中定义缓存变量的示例

for(var i = 0, len=testArray.length; i < len; i++){
   //
}

http://jsperf.com/for-loop-condition-caching

2 个答案:

答案 0 :(得分:3)

  

有人可以解释为什么会这样吗?

此优化和案例非常常见,因此现代JavaScript引擎会自动为您执行此优化。

一些注意事项:

  • 迭代NodeList时不是这种情况(例如querySelectorAll
  • 的结果
  • 无论如何,对于大多数代码路径来说,这是一种过度的微优化,通常情况下,循环体比这种比较需要更多的时间。

答案 1 :(得分:1)

您发布的方案的性能取决于JS引擎优化器的智能程度。当您使用变量时,具有非常转储优化器(或根本没有优化器)的引擎可能会更快,但您甚至不能依赖它。毕竟,长度的类型是众所周知的,而变量可以是任何东西,可能需要额外的检查。 鉴于完美的优化器,所有三个示例都应该具有相同的性能。而且你的例子非常简单,现代引擎很快就会达到这一点。