这两种for循环使用方法之间是否有显著的性能差异?

is there any significant performance difference between this 2 methods of for-loop usage?

本文关键字:性能 for 两种 循环 使用方法 是否 之间      更新时间:2023-09-26

只是想知道以下两种方法的区别是什么?

var a = 0;
var b = 0;
var c = 0;
for(var i = 0; i < 6; i++ ){
    a+=i;
    b+=i;
    c+=i;  
}

var a = 0;
var b = 0;
var c = 0;
for(var i = 0; i < 6; i++ ){
    a+=i; 
}
for(var i = 0; i < 6; i++ ){
    b+=i;
}
for(var i = 0; i < 6; i++ ){
    c+=i;  
}

*编辑感谢locrizak更正

第二个程序的迭代次数是它需要的3倍。在第二个循环中有18次迭代,而第一个循环只有6次,这使得脚本运行得更快。(在这种情况下,您不会注意到差异,因为您在循环中没有做太多事情,但一旦您想做更多事情,这将是一个性能问题)

p。A +i没有做任何你可能想做的事情A +=i

当您对JavaScript性能有疑问时,请有一个客观的意见:

http://jsperf.com/testing-snippets

好吧,你做了3倍的工作。

从宏观的角度来看,你所做的18次迭代不会有太大的影响,但相比之下,它要糟糕得多。

在不了解javascript解释器的任何细节的情况下,假设第二个代码块比第一个代码块稍微差一些,但如果它使代码更难阅读,则肯定不值得重构。这样想:

for(var i = 0; i < 6; i += 1) {
    doSomeExpensiveThing();  // takes 500ms to process
    doSomeExpensiveThing();
    doSomeExpensiveThing();
}

:

for(var i = 0; i < 6; i += 1) {
    doSomeExpensiveThing();  // takes 500ms to process
}
for(var i = 0; i < 6; i += 1) {
    doSomeExpensiveThing();
}
for(var i = 0; i < 6; i += 1) {
    doSomeExpensiveThing();
}

这两者实际上是相同的,因为与执行内部计算的成本相比,运行循环的开销将消失。

我不同意locrizak的观点。第二个循环绝对不会做3倍的工作,因为每个循环的语句是第一个例子的三分之一。第二个示例的额外工作是,它需要运行循环迭代步骤的次数是第一个示例的2倍。

  • 初始化i(仅一次)
  • 增量i(每次迭代)
  • 检查i <6;(每次迭代)

因此,在任何循环有更多语句并且循环开销越来越小的实际示例中,您不太可能注意到差异。这意味着你应该使用多个循环,如果它使代码更具可读性。

我创建了这个更真实的例子来证明我的观点:对于大多数意图和目的,这两个循环是相同的:http://jsperf.com/testing-snippets/3

唯一的区别是变量i上的赋值,加法和比较的数量-除非你为20世纪70年代的嵌入式计算机编程(你不是,因为这是JavaScript),速度差异实际上是零;不要浪费时间去尝试纳米优化它(例如,计算机的速度使这不是问题,现代JS解释器无论如何都可以编译它,所以差异完全消失了)。

如果你在这些循环中做任何有意义的事情,那个将是你的瓶颈,而不是循环本身。

唯一重要的区别是维护-所以使用哪种形式对下一个继承它的人来说更容易理解。

将其粘贴到firebug控制台并计时。让它与大循环一起工作,您可以更容易地看到差异。

console.time("group");
for(var x = 0; x<1000; x++){
    var a = 0;
    var b = 0;
    var c = 0;
    for(var i = 0; i < 6; i++ ){
        a+i;
        b+i;
        c+i;  
    }
}
console.timeEnd("group");

console.time("sep");
for(var x = 0; x<1000; x++){
    var a = 0;
    var b = 0;
    var c = 0;
    for(var i = 0; i < 6; i++ ){
        a+i; 
    }
    for(var i = 0; i < 6; i++ ){
        b+i;
    }
    for(var i = 0; i < 6; i++ ){
        c+i;  
    }
}
console.timeEnd("sep");

我得到

group: 8ms
sep: 13ms