【问题标题】:Array for-loop: temp save the Array[i] or keep calling Array[i] ? Which is better/faster?Array for-loop: temp 保存 Array[i] 还是继续调用 Array[i] ?哪个更好/更快?
【发布时间】:2020-02-23 11:29:49
【问题描述】:

我正在尝试确定是否应该在 for 循环中使用它时临时复制一个数组项。 有什么性能差异吗?除了使代码更具可读性。 (JavaScript)

var max = someArray.length;
for (var i = 0; i < max; i++) {
   // Here I will use someArray[i] quite often. Like this:
   if (someArray[i].position.y > blabla) {
       //...
   }
}

或者:

var max = someArray.length;
for (var i = 0; i < max; i++) {
   var tmp = someArray[i]; // <---- CHANGE
   // Here I will use tmp quite often. Like this:
   if (tmp.position.y > blabla) {
       //...
   }
}

【问题讨论】:

  • 很好的问题,您是否尝试过设置一个 jsperf 来找出答案。 jsperf.com

标签: javascript arrays performance for-loop


【解决方案1】:

警告:当您需要担心特定的性能问题时,请担心性能。在那之前,写任何对你和你的团队来说最清晰、最不容易出错的东西。在 99.999999% 的情况下,给定循环的具体性能在现实世界中并不重要。

话虽如此:

对于现代 JavaScript,我可能会改用 for-of 循环 (ES2015+):

for (const entry of someArray) {
    if (entry.position.y > blabla) {
        // ...
    }
}

理论上,这在幕后使用了迭代器,其中涉及函数调用;在实践中,如果您正在处理一个实际的数组并且该数组使用标准迭代器,那么如果循环是热点,JavaScript 引擎将能够优化循环(如果不是,则不是值得担心)。

如果isomeArray 在循环中没有变化,并且someArray 只是一个普通数组,那么你的两个选择,JavaScript 引擎很可能能够将它优化成类似于你的第二个循环的东西.就风格而言,在for-of 之前,我总是在循环中使用本地而不是每次都重新输入someArray[i],但这只是因为输入tmp(或一些更有意义的名称)比输入someArray[i] 更容易。

如果有理由相信某个特定的循环很慢(因此由于某种原因,它没有得到优化),那么我可能会使用类似于您的第二个示例的内容:

for (let i = 0, max = someArray.length; i < max; i++) {
   const tmp = someArray[i];
   if (tmp.position.y > blabla) {
       //...
   }
}

但又一次,这主要是风格问题,直到/除非您遇到要诊断和修复的特定性能问题。

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 2010-10-08
    • 2017-10-16
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    相关资源
    最近更新 更多