为什么total = total + i比total + = i快得多?

时间:2016-05-20 23:28:36

标签: javascript performance google-chrome

为什么total = total + i比total + = i快得多?这是我多次运行的代码:

var iterations = 1000000;
console.time('Operation total += i');
var total = 0;
for(var i = 0; i < iterations; i++ ){
    total += i;
};
console.timeEnd('Operation total += i');

console.time('Operation total = total + i');
var total = 0;
for(var i = 0; i < iterations; i++ ){
    total = total + i;
};
console.timeEnd('Operation total = total + i');

以下是一些示例输出:

  • 操作总数+ = i:11.196ms
  • 操作总数=总+ i:9.561ms
  • 操作总数+ = i:15.135ms
  • 操作总数=总+ i:8.936ms

2 个答案:

答案 0 :(得分:11)

我运行代码10次,使用相同的迭代次数和更多的迭代次数。

1 Millon迭代

1º时间

我得到了这个结果:

  

操作总数+ = i:23.000ms
  操作总数=总+ i:19.000ms

在这种情况下,总+ i比总数+ = i

2º时间

我得到了这个结果:

  

操作总数+ = i:25.000ms
  操作总数=总+ i:31.000ms

在这种情况下,总+ i慢于总数+ = i

我运行代码的次数增加了10倍,结果类似:

total+=i | total+i | diff  
71             76    -5  
23             19     4  
28             19     9  
23             18     5  
72             76    -4  
29             60    -31  
35             23     12  
72             74    -2  
23             19     4  
78             76     2  

enter image description here

10亿次迭代

1º时间

  

操作总数+ = i:17324.000ms
  操作总数=总+ i:15669.000ms

3º时间

  

操作总数+ = i:15306.000ms
  操作总数=总+ i:15401.000ms

我也执行了10次代码。我得到了相同的结果,有时第一个更快,有时第二个是。

因此,在我看来,没有证据表明总+ +比总数+ = i快。

答案 1 :(得分:2)

我使用以下基准测试代码在Benchmark.js库上运行Node.js的基准测试:

var iterations = 1000000;
suite.add('+= i', function() {
    var total = 0;
    for(var i = 0; i < iterations; i++ ){
            total += i;
    };
})
.add('= total +i', function() {
    var total = 0;
    for(var i = 0; i < iterations; i++ ){
            total = total + i;
    };
})

我根本没有任何性能差异。由于Node.js和谷歌Chrome都使用V8 JS引擎,可能还有别的东西在继续。或许特定于V8的特定版本?或者我们的任何一个基准测试都出了问题?

C:\test>node bench.js
+= i x 253 ops/sec ±1.37% (68 runs sampled)
= total +i x 254 ops/sec ±1.33% (70 runs sampled)
Fastest is = total +i,+= i

C:\test>node bench.js
+= i x 241 ops/sec ±3.03% (63 runs sampled)
= total +i x 246 ops/sec ±1.52% (67 runs sampled)
Fastest is = total +i,+= i

C:\test>node bench.js
+= i x 249 ops/sec ±2.04% (67 runs sampled)
= total +i x 249 ops/sec ±1.45% (68 runs sampled)
Fastest is = total +i,+= i

话虽如此,基于我的多重结果,我会说性能没有差异。