关于for、foreach、map、filter、forin循环实际运行效率的比较
为了准确for、foreach、map、filter、for in这些循环的效率,我写了下面的方法。
为了避免单次运行的随机性,让每个循环都跑100次,然后取平均值。得出的平均值跟单次结果存在误差(单次运行远大于平均后的值),但可以对比使用。
完整代码:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <script> // 数组初始化 var testData = []; var x = 10000; for(var i = 0; i < x; i++){ testData[i] = i; } var time1=new Date; //for循环 for(var m=0;m<100;m++){ for(var i = 0; i < testData.length; i++){ testData[i]++; } } var time2=new Date; console.log((time2-time1)/100+"ms(for)"); //foreach for(var m=0;m<100;m++){ testData.forEach(function(value, item, arr){ arr[item]++; }); } var time3=new Date; console.log((time3-time2)/100+"ms(foreach)"); //map for(var m=0;m<100;m++){ testData.map(function(value, item, arr){ arr[item]++; }); } var time4=new Date; console.log((time4-time3)/100+"ms(map)"); //filter for(var m=0;m<100;m++){ testData.filter(function(value, item, arr){ arr[item]++; }); } var time5=new Date; console.log((time5-time4)/100+"ms(filter)"); //forin for(var m=0;m<100;m++){ for(i in testData){ testData[i]++ }; } var time6=new Date; console.log((time6-time5)/100+"ms(for in)"); </script> </body> </html>
测试环境:chrome 84.0
测试结果:
当x=1万次时,平均时间
当x=10万次时,平均时间
当X=100万次时,平均时间
x=100万次,单独运行的时间
当X=1000万次,单独运行时间
当X=1亿次,单独运行时间(放弃for in)
结论:
从测试结果来看,1万次左右,大家基本差别不大;
10万次开始到100万次,整体效率 for>filter>foreach≈map>for in;
可见for循环的效率最高(50ms以内),且前四种循环在时间上接近(200ms以内),for in的效率最低(超过1.5s);
当循环达到1000万次时,其他循环在1s内均可完成,for in 则接近13s。
当达到1亿次时,性能有非常明显了。