【问题标题】:JavaScript: Why is native Array.prototype.map faster than for loop in Chrome console?JavaScript:为什么原生 Array.prototype.map 比 Chrome 控制台中的 for 循环更快?
【发布时间】:2013-07-22 02:40:25
【问题描述】:

在此处查看示例: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

【问题讨论】:

  • 本地方法应该是最快的,因为它是用本地浏览器语言 (c++) 编写的。然而,结果并不是很一致(半年前,大多数原生 ES5 实现要慢得多)。我讨论过同样的问题:stackoverflow.com/questions/14647470/…

标签: javascript performance for-loop map


【解决方案1】:

首先,你的测试是不现实的,因为:函数“perform”和网页DOM的更新比循环和使用“map”的区别要慢得多。也就是说,如果跑者每走一步都需要喝杯咖啡写一本书,这就像比较100m的冲刺。

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

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

地图可以在内部实现为:

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

为什么原生实现更快

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

如果 map 是用本机代码实现的,则允许执行优化和比 JS 循环更快的代码(假设两种实现都是正确和最优的)。

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2019-10-28
    • 2011-10-04
    • 1970-01-01
    • 2017-10-04
    • 2015-11-27
    • 2018-04-15
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多