为什么内置的函数调用(如map,forEach,.. etc)比Javascript中的常规循环(for,while ..)慢?

Moh*_*man -1 javascript ecmascript-6

我正在阅读Eloquent Javascript这本书,Marjin Haverbeke一书的作者指出,内置函数调用比常规for或while循环运行得慢,但为什么会这样?

编辑:这个问题与他的相关,对这一个也有帮助.

T.J*_*der 5

你列出的(map,forEach)调用函数.所以比较

const updated = original.map(e => e * 2);
Run Code Online (Sandbox Code Playgroud)

const updated = [];
let i; // (Declaring these here is a premature micro-optimization¹ for effect)
const len = original.length;
for (i = 0; i < len; ++i) {
    updated[i] = original[i] * 2;
}
Run Code Online (Sandbox Code Playgroud)

对于100进入阵列,第一个例子中有第二个例子中的所有开销创建函数,调用的开销的开销map,以及100个电话给回调的开销.当然,它的绝对值较慢.当然,这提供了JavaScript引擎无法优化远程调用.如果回调很简单,如果引擎其识别为代码中的慢点,则引擎可以对其进行优化.scraaappy这个基准测试放在一起,这对我来说至少显示Chrome和Firefox的优化map速度要快for,而Edge不会(这让我感到惊讶,Edge中的Chakra引擎非常好).(如果IE11没有,我也不会感到惊讶,但该基准站点似乎不适用于IE11.)

在实践中重要吗?几乎从不.现代JavaScript引擎中的函数调用非常快.

写清楚你的内容(不是很傻).如果您遇到性能问题,请进行优化.:-)


¹过早的微优化是什么?如果我宣布i for,就像这样:

const updated = [];
for (let i = 0, len = original.length; i < len; ++i) {
    updated[i] = original[i] * 2;
}
Run Code Online (Sandbox Code Playgroud)

... i为每个循环迭代创建一个不同的获取(因此在循环中创建的闭包可以关闭它们中的每一个而不具有闭包循环问题).