我可以加快JavaScript中对本机方法的调用吗?

Can I speed up calls to native methods in JavaScript?

本问题已经有最佳答案,请猛点这里访问。

根据这个答案,"物体是空的吗?"以下内容:

1
2
// Speed up calls to hasOwnProperty
var hasOwnProperty = Object.prototype.hasOwnProperty;

我在小型JavaScript库中看到过类似的一些实现,比如:

1
2
3
4
5
6
7
var slice = Array.prototype.slice;

//or

function slice(collection) {
    return Array.prototype.slice.call(collection);
}

我做了一个快速的JSPerf来测试这类事情,缓存总体上比不缓存要快一些,但是我的测试可能有缺陷。

(我使用"cache"一词表示将方法存储在变量中。)

这个问题的上下文是开发人员何时需要多次调用本机方法,以及可观察到的差异是什么。

缓存本机方法是否会阻止引擎在每次调用该方法时都必须在对象内部查找该方法,从而使缓存成为在开发人员需要多次调用同一本机方法时更快地调用本机方法的方法?


当你在一个库中大量使用Array.prototype.slice时,创建一个保存该函数的变量(var slice = Array.prototype.slice;是有意义的,因为变量可以通过一个javascript小型化器进行小型化,否则它不能。

将函数赋给变量还可以避免遍历对象的原型链,这可能会导致性能稍好一些。

请注意,这是一个微优化,您(一般来说)不应该太在意它——将它留给一个现代的JavaScript引擎。


将值保存在变量中会带来一些优化机会,因为如果它是局部变量,则解释器可以进行分析以认识到变量永远不会发生变化。另一方面,您总是需要取消引用数组之类的全局变量,因为每个人都可能随时更改它们。

也就是说,我不知道这是否会影响性能,尤其是考虑到JIT优化之后。

通常,人们使用var slice的最大原因是保持源代码简短。