【问题标题】:Why is prototype function 40x slower than the default declared function?为什么原型函数比默认声明的函数慢 40 倍?
【发布时间】:2012-03-02 04:40:55
【问题描述】:

我在 jsperf.com 上玩过,发现原型函数比“默认”声明的函数慢 40 倍

String.prototype.contains = function(s){ return !!~this.indexOf(s) } = 220K 操作/秒

对比

function isContains(str, s) { return !!~str.indexOf(s) } = 8.5KK ops/s

Here's a jsperf test case

附:我知道原型修改不是最好的情况,可以命名为“猴子补丁”:)

【问题讨论】:

标签: javascript performance prototype


【解决方案1】:

我认为这很慢,因为字符串原语会自动用一个临时对象包装每次调用一个方法。

这也解释了new Object("hi").foo()"hi".foo() 的性能提升。

来自MDN docs

字符串字面量(用双引号或单引号表示)和从非构造函数上下文中的 String 调用返回的字符串(即不使用 new 关键字)是原始字符串。 JavaScript 会自动转换原语和 String 对象,因此可以将 String 对象方法用于原语字符串。在原始字符串上调用方法或发生属性查找的上下文中,JavaScript 将自动包装字符串原始并调用方法或执行属性查找。

附近:

Why can't I add properties to a string object in javascript?

String object versus literal - modifying the prototype?

【讨论】:

  • 抱歉跑题了!但是,您制作了一个我喜欢的名为 decl 的东西,当我在玩它时,我注意到它似乎无法在 IE8 上运行(或者,detest 线束(很酷的名字!) t 工作,the page 在 IE8 上看起来很奇怪)。所以,是的,我做了一个聊天室,以防你有时间告诉我可能是什么原因(我愿意破解它),并且不污染这个评论区。 Here。和荣誉:)
【解决方案2】:

用猴子补丁版本中的 JavaScript 主体替换用 C/机器代码实现的原始函数很有可能。

【讨论】:

  • 我不明白你的意思。 "".contains 不存在……你认为他在遮蔽什么原生函数?
  • 我的猜测是原型调度阻碍了实现获得 indexOf() 的一些有效版本的能力。神奇之处在于 40 倍的差异——解释与编译代码的味道。
  • 您如何解释 CMS 的第 4 版和我的第 5 版性能?我在这里完全不知所措。
  • @CharlieMartin 如果我错了,请纠正我,但我认为“原始外部”在这里有点不同意这个理论:jsperf.com/outer-fn-vs-prototype/8
  • 你们不是说我是什么吗?有些东西阻碍了有效的实施。事实证明,原型版本将调用低级代码的内容封装在对象中,每次在解释器中创建一个新对象。
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 2021-03-17
  • 1970-01-01
  • 2011-09-24
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多