当前位置: 首页 > 面试题库 >

For循环性能:将数组长度存储在变量中

邢灿
2023-03-14
问题内容

考虑同一循环迭代的两个版本:

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

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

后一种版本比前一种版本快吗?


问题答案:

更新:16/12/2015

由于这个答案似乎仍然有很多观点,我想重新审视这个问题,因为浏览器和JS引擎不断发展。

我没有使用JSPerf,而是使用原始问题中提到的两种方法,编写了一些代码来遍历数组。我已将代码放入函数中,以分解功能,如在实际应用程序中希望的那样:

function getTestArray(numEntries) {

  var testArray = [];

  for (var i = 0; i < numEntries; i++) {

    testArray.push(Math.random());

  }

  return testArray;

}



function testInVariable(testArray) {

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

    doSomethingAwesome(testArray[i]);

  }

}



function testInLoop(testArray) {

  var len = testArray.length;

  for (var i = 0; i < len; i++) {

    doSomethingAwesome(testArray[i]);

  }

}



function doSomethingAwesome(i) {

  return i + 2;

}



function runAndAverageTest(testToRun, testArray, numTimesToRun) {

  var totalTime = 0;

  for (var i = 0; i < numTimesToRun; i++) {

    var start = new Date();

    testToRun(testArray);

    var end = new Date();

    totalTime += (end - start);

  }

  return totalTime / numTimesToRun;

}



function runTests() {

  var smallTestArray = getTestArray(10000);

  var largeTestArray = getTestArray(10000000);



  var smallTestInLoop = runAndAverageTest(testInLoop, smallTestArray, 5);

  var largeTestInLoop = runAndAverageTest(testInLoop, largeTestArray, 5);

  var smallTestVariable = runAndAverageTest(testInVariable, smallTestArray, 5);

  var largeTestVariable = runAndAverageTest(testInVariable, largeTestArray, 5);



  console.log("Length in for statement (small array): " + smallTestInLoop + "ms");

  console.log("Length in for statement (large array): " + largeTestInLoop + "ms");

  console.log("Length in variable (small array): " + smallTestVariable + "ms");

  console.log("Length in variable (large array): " + largeTestVariable + "ms");

}



console.log("Iteration 1");

runTests();

console.log("Iteration 2");

runTests();

console.log("Iteration 3");

runTests();

为了尽可能公平地进行测试,每个测试运行5次并取平均值。我还运行了包括阵列生成在内的整个测试3次。在我的计算机上的Chrome上进行的测试表明,使用每种方法所花费的时间几乎相同。

重要的是要记住,该示例只是一个玩具示例,实际上,从您的应用程序上下文中提取的大多数示例可能会产生不可靠的信息,因为您的代码正在执行的其他操作可能会直接或间接影响性能。

底线

确定最适合您的应用程序的最佳方法是亲自对其进行测试!JS引擎,浏览器技术和CPU技术不断发展,因此必须始终在应用程序上下文中为自己测试性能。值得一问的是,您是否根本没有性能问题,如果您不花时间进行对用户而言微不足道的微优化,则最好花费时间来修复错误和添加功能,从而使用户更快乐:)。

原始答案:

后者会稍快一些。该length属性不会遍历数组以检查元素数,但是每次在数组上调用该属性时,都必须取消对该数组的引用。通过将长度存储在变量中,循环的每次迭代都不需要数组取消引用。



 类似资料:
  • 在循环中,我是否可以对循环使用相同的计数器变量? 或者这些变量会相互影响吗?以下代码应该为第二个循环使用不同的变量,例如,还是可以?

  • 问题内容: 以下两个循环之间的性能差异(如果有)是什么? 和 问题答案: 版本1.5中引入的for-each循环通过完全隐藏迭代器或index变量,消除了混乱和出错的机会。结果成语同样适用于集合和数组: 当你看到冒号(:)时,将其读为“ in”。因此,上面的循环读为“对于元素中的每个元素e”。请注意,即使对于数组,使用for-each循环也不会降低性能。实际上,在某些情况下,它可能只比普通的for

  • 问题内容: 我的目标是减少内存使用量。如果需要多次使用hashMap值,应该将其存储在变量中吗? 还是我应该始终使用hashMap的get()方法来避免冗余和不必要的内存使用? hashMap包含很多值ae:产品类型,产品价格等…许多方法都设置为可以使用这些值。所以我想知道最好的方法。谢谢! 问题答案: 这不是多余的,并且不需要占用很多额外的内存。额外的变量不会占用太多内存;就像这篇文章提到的那样

  • 问题内容: 在循环内部声明变量是否不好?在我看来,这样做,如下面的第一个代码块所示,将使用第二次的十倍的内存…由于在循环的每次迭代中都创建了一个新的字符串。这样对吗? 与 问题答案: 在循环内部声明变量是否不好? 一点也不!它将变量本地化到其使用点。 在我看来,如下面的第一个代码块所示,这样做将使用十倍于第二个内存的内存。 编译器可以优化内容以保持内存使用效率。仅供参考:如果您使用关键字告诉您变量

  • 我在写一段代码,其中有一个字符串[]和一个方法,该方法接受这个字符串[]并返回字节[],保持字符串-字节对的位置,其中很少有字节可以为空。最后,我必须对字节进行转换,并从string[]中获取一个键为string,值为转换返回值的映射。这就是我在Java 8流中实现相同功能的方式: 其中productReference是字符串[],ProductSpice[]是字节[]数组。 现在的问题是IntS

  • 问题内容: 当我的研究使我相信循环是PHP中最快的迭代构造…为了使它更清晰时,您认为以下哪个会更快? 示例一 示例二 我的逻辑是,在示例中的每次迭代中,在每次迭代中访问myLargeArray的长度比在示例二中访问简单的整数值要昂贵。那是对的吗? 问题答案: 第一种方法较慢,因为必须在循环的每次迭代中都调用该函数。该方法本身非常快,但是调用该函数仍然有一些开销。通过将其移动到循环之外,您正在执行所