测试代码如下,分别在不同内存情况、不同循环次数下的执行耗时情况。 执行环境为 Mac M3芯片的 nodejs 环境。
const max = 100000000
const timeTestForIn = () => {
let str = ''
let arr = new Array(max).fill(1)
let start = Date.now();
for (let i = 0; i<arr.length;i++) {
str += '1';
}
let end = Date.now();
console.log('forin:', end - start, str.length)
}
const timeTestMap = () => {
let str = ''
let arr = new Array(max).fill(1)
let start = Date.now();
arr.map(i => str += 'i')
let end = Date.now();
console.log('map: ', end - start, str.length)
}
const timeTestForEach = () => {
let str = ''
let arr = new Array(max).fill(1)
let start = Date.now();
arr.forEach(i => str += 'i')
let end = Date.now();
console.log('foreach: ', end - start, str.length)
}
/*
执行的时候可能会爆内存溢出,需手动指定内存使用量
node --max-old-space-size=10240
*/
timeTestForIn(); // 7852ms
timeTestForEach(); // 7598ms
timeTestMap(); // 7212ms
当内存为10G的时候,循环耗时 map < foreach < forin
当内存为5G的时候,循环耗时 foreach < forin < map
其中最后使用3072M内存的时候直接内存溢出了,没有结果
当内存为10G的时候,循环耗时 forin < foreach < map
当内存为5G的时候,循环耗时 forin < foreach < map
当内存为3G的时候,循环耗时 forin < foreach < map
可以看出此内存环境下,三者耗时情况一样
当内存为10G的时候,循环耗时 foreach < forin < map
当内存为5G的时候,循环耗时 foreach < forin < map
当内存为3G的时候,循环耗时 foreach < forin < map
可以看出此内存环境下,三者耗时情况一样
当内存为10G的时候,循环耗时 foreach < map < forin
当内存为5G的时候,循环耗时 foreach = map < forin
当内存为3G的时候,循环耗时 foreach = map < forin
此环境下耗时成了个位数了,foreach和map差不多,forin耗时稍微大一点。
forin、foreach、map 三个循环耗时在数据量不大的时候大体来说相差不是很多。 数据量非常大的时候耗时又跟内存情况有关系,这个还真不好下结论。
不过对于日常开发来说也用不到那么大量的循环,个人感觉怎么方便怎么来吧,易读性和可维护性比这点性能更加重要。