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 真是慢得离谱,不要在遍历数组时用)。

评论

0/500

全部评论 (1)

  • lithoge (作者) 2022-08-07 12:34:02

    测试

    0
    /