【发布时间】:2019-03-26 02:22:24
【问题描述】:
在 JavaScript 中,我注意到 ES6 for ... of 循环的性能与传统的 for (start; stop; step) 循环有很大不同。
基准测试
const n = 10000;
const arr = Array(n).fill().map((e, i) => i); // [0, n)
console.log('n =', n);
let sum1 = 0;
console.time('for let i');
for (let i = 0; i < arr.length; i++) {
sum1 += arr[i];
}
console.timeEnd('for let i');
let sum2 = 0;
console.time('for of');
for (let v of arr) {
sum2 += v;
}
console.timeEnd('for of');
结果
n = 10
for let i: 0.350ms
for of: 0.015ms
-----
n = 100
for let i: 0.354ms
for of: 0.023ms
-----
n = 1000
for let i: 0.429ms
for of: 0.111ms
-----
n = 10000
for let i: 1.048ms
for of: 2.138ms
-----
n = 100000
for let i: 9.452ms
for of: 13.644ms
(使用 Node.js v10.11.0 测试)
如您所见,随着 n 的增加,for-of 循环的速度以比标准 for 循环更快的速度下降。为什么对于较小的数组,for-of 循环会更快,而对于较大的数组,for-of 循环会更慢?
【问题讨论】:
-
你的时间很可能是错的。
-
@Veedrac repl.it/@BrendenCampbell/ForOfPerfTest 考虑到 repl.it 上的可变 CPU 可用性,在大多数测试中,我的结果是可重复的。
-
尝试切换哪个循环是第一个。如果你的时间是真实的,这不会改变任何事情。
-
"ES6
for ... of loop的性能与传统的for (start; stop; step)循环有很大不同" - 在标准阵列上,they should perform exactly the same。请将其报告为错误。 -
@Veedrac 你是对的。切换顺序后,我看到完全相反。第一个循环(for-of)看起来更慢
标签: javascript arrays performance