for/while/for in/ for of 循环速度测试
最近一直在学算法,发现循环的时候不同的循环方式有不一样的速度。
下面用遍历数组这种典型的情况测试各循环 for/while/for in/for of
的速度差异。
for 循环
let array = new Array(20000000).fill(0)
let j = 0
const startTime = +new Date()
for (let i = 0; i < array.length; i++) {
j = array[i]
}
console.log((+new Date() - startTime))
结果 Node 12ms,Chrome 22ms。
while 循环
let array = new Array(20000000).fill(0)
let j = 0
const startTime = +new Date()
let i = 0
while (i < array.length) {
j = array[i]
i++
}=
console.log((+new Date() - startTime))
结果 Node 12ms, Chrome 45ms,Chrome 下比 for
循环慢,但 Node 中都差不多。
for in 循环
let array = new Array(20000000).fill(0)
let j = 0
const startTime = +new Date()
for (let i in array) {
j = array[i]
}
console.log((+new Date() - startTime))
结果 Node 6888ms, Chrome 8507ms,慢得令人发指。当然,他本来就不是为了遍历数组而生的,它的出现是为了遍历对象。
for of 循环
let array = new Array(20000000).fill(0)
let j = 0
const startTime = +new Date()
for (let val of array) {
j = val
}
console.log((+new Date() - startTime))
结果 Node 200ms,Chrome 250ms,比 for in
好太多了,但这种方法拿不到索引,实用性不强,这个方法在 Chrome 中测试差异比较大,测试时经常可以看到 50ms 左右的差异,也就是浮动在 25% 左右。
总结
结论 for > while > for of > for in。for/while
与其他循环的方法根本不在一个次元的产物。
最后也测试 forEach()
函数遍历的速度,结果是 Node 229ms,Chrome 180ms(浏览器中更快),比 for of
的速度慢了一点,但基本也可以接受,但适用性广。map()
函数结果是 Node 316ms,Chrome 260ms(浏览器更快),也稍慢一些,但也是可以接受的范围。
for > while > for of ≈ forEach ≈ map > for in (for in 真是慢得离谱,不要在遍历数组时用)。
lithoge (作者) 2022-08-07 12:34:02
测试