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

时间:2018-04-06 16:09:42

标签: javascript ecmascript-6

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

编辑:this question他与此相关,对此也有帮助。

1 个答案:

答案 0 :(得分:5)

您列出的内容(mapforEach调用函数。所以比较

const updated = original.map(e => e * 2);

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;
}

对于100条目数组,第一个示例包含第二个示例 plus 的所有开销,即创建函数的开销,调用map的开销,以及100次调用回调的开销。当然,它的绝对值较慢。当然,这提供了JavaScript引擎无法优化远程调用。如果回调是微不足道的,那么引擎可以优化它,如果它将其识别为代码中的慢点。 scraaappy汇总了this benchmark,对我来说至少显示Chrome和Firefox优化mapfor更快,而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;
}

...为每个循环迭代创建了一个不同的i(因此在循环中创建的闭包可以关闭每个循环并且没有闭包循环问题)。