【问题标题】:Can I speed up calls to native methods in JavaScript? [duplicate]我可以加快对 JavaScript 中本机方法的调用吗? [复制]
【发布时间】:2014-03-11 12:47:14
【问题描述】:

根据this answer to 'Is object empty?'

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

我在小型 JavaScript 库中看到了几个类似的实现,例如:

var slice = Array.prototype.slice;

//or

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

我做了一个快速的jsperf 来测试这种事情,缓存看起来比不缓存快一点,但我的测试可能有缺陷。

(我使用“缓存”这个词来表示将方法存储在变量中。)

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

缓存本机方法是否可以防止引擎在每次调用方法时都必须在对象内部查找该方法,从而使缓存成为一种更快的方式来调用本机方法,无论何时开发人员需要调用同一个本机方法不止一次?

【问题讨论】:

  • 是什么让您认为这与方法的原生性有关?正在优化的部分,重复的属性查找,应该是完全不可知的 w.r.t。正在查找什么(事实上,我无法想象一个非人为的方案可能会有所作为)。
  • 这节省的是搜索属性的嵌套原型链。
  • @delnan 对于简单的原生方法,优化的影响可能更为显着,因为它们的实现速度很快,而且名称查找占调用时间的比例更大。
  • 看看那些 jsPerf 结果,性能提升几乎是不存在的。

标签: javascript


【解决方案1】:

当您在库中大量使用 Array.prototype.slice 时,创建一个包含该函数的变量 (var slice = Array.prototype.slice;) 是有意义的,因为该变量可以缩小 JavaScript 缩小器,否则它不能。

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

请注意,这是微优化,您(一般而言)不应该过多关注 - 将其留给现代 JavaScript 引擎。

【讨论】:

  • GZIP 破坏了使用变量引用符号的缩小优势,这样做实际上可以增加 GZIP 之后的大小。然而,不必执行属性查找的性能优势是有效的。
【解决方案2】:

将值保存在变量中提供了一些优化机会,因为如果它是局部变量,解释器可以进行分析以实现变量永远不会发生变异。另一方面,您总是需要取消引用像 Array 这样的全局变量,因为每个人都可能随时更改它们。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多