我正在阅读Eloquent Javascript这本书,Marjin Haverbeke一书的作者指出,内置函数调用比常规for或while循环运行得慢,但为什么会这样?
编辑:this question他与此相关,对此也有帮助。
答案 0 :(得分:5)
您列出的内容(map
,forEach
)调用函数。所以比较
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优化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;
}
...为每个循环迭代创建了一个不同的i
(因此在循环中创建的闭包可以关闭每个循环并且没有闭包循环问题)。