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

JavaScript:为什么原生Array.prototype.map比Chrome控制台中的for循环快?,javascript,performance,for-loop,map,Javascript,Performance,For Loop,Map,请参见此处的示例: 相反,在chrome控制台中,我得到了相反的结果(map有时比for loop快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);outpu

请参见此处的示例: 相反,在chrome控制台中,我得到了相反的结果(map有时比for loop快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
var输入=[];

对于(var i=0;i首先,您的测试是不现实的,因为:函数“perform”和网页DOM的更新要比循环和使用“map”之间的差异慢得多。也就是说,如果每一步跑步者都需要喝杯咖啡和写一本书,这就像比较100米跑一样

您应该在一个非常快速的函数上进行测试

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

Map可在内部实现为:

  • 一个带有优化功能的本机/二进制函数:在这种情况下,他的使用速度要快得多。Chrome可能会这样做
  • 就像循环一样,就像您所做的那样:在本例中,性能是相似的,但是对“map”的额外调用和内部检查可能需要更多的时间
为什么本机实现更快

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


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

本机方法应该是最快的,因为它是用本机浏览器语言(c++)编写的。但是,结果不是很一致(半年前,大多数本地ES5实现的速度要慢得多。)我也讨论过同样的问题: