为什么大多数JavaScript本机函数比它们的朴素实现慢?

Mai*_*tor 21 javascript optimization function

我注意到一些 测试,本机JavaScript函数通常比简单的实现慢得多.这背后的原因是什么?

Pet*_*ter 20

看完ECMA-262之后.看来,本机实现只是做更多的错误处理方面和功能比简单的自我实现.

例如,查看mapMDN上的polyfill实现:Array.prototype.map().它基于ECMA-262中指定的相同算法.现在更新您的示例以使用此算法可以使本机实现更快 - 尽管只是稍微:map-native-vs-implemented.

此外,map可能不是最好的测试示例,因为它在本机代码和提供的lambda函数之间来回反弹.

我本来期望本机concat功能的性能更好.然而,看看ECMA-262我们可以看到它也做得更多.查看第15.4.4.4节中的算法,我们可以看到它处理了一些额外的情况.例如,组合多个参数 - 一些是数组,一些是其他类型:

[1, 2, 3].concat([4, 5, 6], "seven", 8, [9, 10]);

回报

[1, 2, 3, 4, 5, 6, "seven", 8, 9, 10]

最后,重要的是要注意这些是非常基本的算法.当在大型数据集上运行这样的算法,或者连续数千次运行时,看起来一个比另一个快得多.但是,在数千次迭代中执行甚至几次额外的安全检查可能会使一种算法明显慢于不执行这些检查的算法.计算计算操作 - 如果你的额外错误处理和功能使循环中的代码行加倍,那么它自然会慢一些.