繁体   English   中英

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

[英]Why are built in function calls (like map, forEach, ..etc) slower than a regular loop (for, while ..) in Javascript?

我在阅读《 Eloquent Javascript》一书时,在读《 Marjin Haverbeke》一书时指出,内置函数调用的运行速度比常规的for或while循环慢,但是为什么呢?

编辑: 这个问题这个问题有关,对这个问题也有帮助。

您列出的那些( 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个条目的数组,第一个示例具有第二个示例的所有开销加上创建函数的开销,对map的调用的开销以及对回调的100个调用的开销。 当然,从绝对角度来看,它要慢一些。 当然,前提是JavaScript引擎无法优化调用。 如果回调是微不足道的,则如果引擎其标识为代码中的慢点,则引擎可以对其进行优化。 scraaappy汇总了此基准测试 ,对我来说,至少表明Chrome和Firefox优化了map ,使其比for更快,而Edge却没有(这使我有些惊讶,Edge中的Chakra引擎非常出色)。 (如果IE11也没有,我不会感到惊讶,但是该基准站点似乎无法与IE11一起使用。)

在实践中有关系吗? 几乎从不。 现代JavaScript引擎中的函数调用非常快

写什么你清楚(没有被真的很傻)。 优化是否以及何时出现性能问题。 :-)


¹什么是过早的微优化? 如果我 for声明了i ,如下所示:

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

...为每次循环迭代创建了一个不同的i (因此,在循环中创建的闭包可以关闭它们中的每个闭包,而不会出现闭包在循环中的问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM