在前端,我们需要将一个数组加工成另一个数组时,最常见的做法有两个:1. Array的成员方法map;2. 用for做循环。
两种方式的性能差异有多大?我们做个小实验。
方案1:
var foo = ['a','b'];
var bar = foo.map(function(v){return v + "_bar";});
方案2:
var foo = ['a','b'];
var bar = [];
for (k=0; k< foo.length; k++) {
var bar_o= foo[k]+'_bar';bar.push(bar_o);
}
测试环境:
Chrome @ Windows 版本 104.0.5112.102(正式版本) (64 位)
利用Chrome的调试工具提供的Performance监控,重复1000000次后,检查耗时和内存。取3次测试的平均值。
项目 | 方案1:map | 方案2:for |
---|---|---|
执行时间 | 66 | 111 |
JS HEAP增长 | 1.9 | 2.0 |
从数据上看,执行时间差异较大,内存增量没有显著差异。为什么呢?
问题出在for中,使用push将对象添加到数组中,动态调整数组的长度。而map则是在调用之初直接创建出尺寸足够的数组,然后再分别更新各个对象的引用。后者的性能显然更快一些。
所以,是不是该检查一下那些运行较慢的代码,看看有哪些地方该换成map了?