为什么大多数 JavaScript 原生函数都比它们的原始实现慢?

IT技术 javascript function optimization
2021-02-15 17:31:48

我注意到虽然一些 测试表明原生 JavaScript 函数通常比简单的实现慢得多。这背后的原因是什么?

1个回答

在查看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]

最后,重要的是要注意这些是非常基本的算法。当在庞大的数据集上或连续数千次运行此类算法时,似乎一个明显比另一个快。然而,即使在数千次迭代中执行一些额外的安全检查,也会使一种算法比不进行这些检查的算法慢得多。计算计算操作——如果您额外的错误处理和功能使循环中的代码行数加倍,那么它会变慢是很自然的。

@Derek 朕会功夫 嗨,Derek,感谢您的检查。似乎根据 ECMA-262,算法应该使用Object.defineProperty,但是我从 MDN 使用的 polyfill 有一条评论说它不是出于兼容性原因。更新 JSPerf 示例以使用Object.defineProperty它后,现在明显变慢了。:)
2021-04-19 17:31:48
如果您查看 jsPref 结果,在大多数情况下,实现仍然比本地方法快,因此也许这不是原因。:P
2021-04-20 17:31:48
另一个 jsPerf 链接,尘土飞扬:(
2021-04-21 17:31:48