JavaScript:为什么原生Array.prototype.map比Chrome控制台中的for循环快



请在此处查看示例:http://jsperf.com/map-vs-for-basic相反,在chrome控制台中,我得到了相反的结果(map有时比for循环快6-10倍)。我猜情况会相反。

 var input = [];
 for(var i=0;i<10000;i++)input[i]=new Date(i);
    var output = [];
function perform(value,index){
    return value.toString()+index*index
}
console.time(1);output = input.map(perform);console.timeEnd(1);
// 1: 45.000ms
console.time(1);for(var i=0;i<input.length;i++)output[i]=perform(input[i],i);console.timeEnd(1);
// 1: 68.000ms

首先,您的测试是不现实的,因为:函数"perform"和网页DOM的更新比循环和使用"map"之间的差异慢得多。也就是说,如果每一步跑步者都需要喝一杯咖啡并写一本书,这就像是在比较100米冲刺。

你应该对一个非常快的函数进行测试。

为什么浏览器之间存在差异

Map可以在内部实现为:

  • 具有优化功能的本机/二进制函数:在这种情况下,他的使用速度要快得多。Chrome可能会做到这一点
  • 就像循环一样:在这种情况下,性能是相似的,但对"映射"的额外调用和内部检查可能需要更多的时间

为什么本机实现更快

Javascript是解释代码,也就是说,可执行文件获取源代码并尝试执行请求的操作,但这意味着解析代码并执行结果树(大量工作)。本机代码总是更快、更优化。

如果map是用本机代码实现的,那么它可以执行优化,并且代码比JS循环快得多(假设这两种实现都是正确和优化的)。