百科问答小站 logo
百科问答小站 font logo



JavaScript 有必要缓存 for 循环中的 Array.length 吗? 第1页

  

user avatar   straybugs 网友的相关建议: 
      

题主来了

先上结论:缓存 Array.lengh 对优化影响不大,甚至会减慢。

1、从测试结果上看

stackoverflow 上也有这个讨论,

For-loop performance: storing array length in a variable

accepted 的答案是说缓存会起到加速的结果,给出了

jsPerf

测试。

但是有答案反对,也给出了

jsPerf

测试。

两个答案的区别在于 (

Loop-invariant code motion

) 后面会讲到。

从另一篇文章

Shoud I have to cache my array’s length?

的测试结果也可以看出缓存差别不大。



还有这篇

JavaScript's .length Property is a Stored Value



2、从 V8 的中间代码分析

这篇文章

mrale.ph/blog/2014/12/2

从 V8 的 hydrogen 探讨 Array.length 在 for 循环中的处理。

正如上面提到的

Loop-invariant code motion

,引擎会把能确定不变的代码移到循环外。

所以像下面这种代码也不会影响引擎对 Array.length 的优化:

       function uncached(arr) {   for (var i = 0; i < arr.length; i++) {     arr[i]   } }      

而当循环中调用不可

内联函数

时,引擎没法做优化,每次循环都会重新计算一遍 length

       function BLACKHOLE(sum, arr) {   try { } catch (e) { } }  function uncached(arr) {   var sum = 0;   for (var i = 0; i < arr.length; i++) {     sum += arr[i];     if (sum < 0) BLACKHOLE(arr, sum);   }   return sum; }      

但这时即便是在循环外缓存了 length 也是没有用的,引擎没法预判数组的变化,当需要访问数组元素时会触发 bounds check ,从而照样要计算一遍 length 。所以缓存 length 是没有用的。

甚至,由于多了一个变量,底层的寄存器分配器每次循环还要多一次恢复这个变量。当然这个只有在大规模的情况下才会看出区别。

当然这篇文章也有局限性,仅仅讨论了 V8 引擎,也没有讨论访问 length 代价更高的 HTMLCollection 。但这已经足够让我们不用再局限于缓存的写法,可以放开来按照自己喜欢的方式去写循环了。

【完】




  

相关话题

  如何看待领导让测试把所有bug都指给前端? 
  如何看待 Reaktor Hello World 卫星将搭载 node.js 程序? 
  设计闭包(Closure)的初衷是为了解决什么问题? 
  React.js有哪些设计缺陷? 
  如何看待 node-ipc 包以反战为名进行供应链投毒? 
  为什么一些公司招前端不想要培训班出来的人? 
  请问一下各位大佬,js的静态方法有啥作用呀,写工具类吗,小菜鸡想不出来静态方法有啥作用? 
  请问一下各位大佬,js的静态方法有啥作用呀,写工具类吗,小菜鸡想不出来静态方法有啥作用? 
  如何看待 TS 团队发起的 「JS 类型标注」提案 Types as Comments? 
  JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别? 

前一个讨论
做中文 NLP 的时候,大家为啥不用拼音?
下一个讨论
smarty 应该由谁来写?





© 2024-12-22 - tinynew.org. All Rights Reserved.
© 2024-12-22 - tinynew.org. 保留所有权利