【问题标题】:Performance issues when adding many functions to object prototypes in Javascript?在 Javascript 中向对象原型添加许多函数时的性能问题?
【发布时间】:2011-04-06 21:12:58
【问题描述】:

我目前正在为许多不同的 Javascript 对象编写扩展方法库。例如,如果我在同一个源文件中(通过它们的原型)向不同对象添加超过 200 种方法,是否有任何性能考虑?

编辑:仅供参考,我正在扩展内置对象。

【问题讨论】:

  • 您是否扩展了内置对象,如 Array、Function、Object?
  • 你考虑过某种动态加载系统吗?
  • 你有这方面的在线例子吗?

标签: javascript performance object prototype


【解决方案1】:

不,几乎不会对性能造成影响。即使将函数附加到原型上也应该只需要几毫秒(可能是 5 毫秒),超过 200 个函数位于内存中的一个位置,永远不会被复制,你永远不会注意到任何事情。当然,假设您要附加到某个东西的 .prototype 上。

至于为什么没有速度命中:为了解决对对象的函数调用:foo.doSomething(),内部引擎需要遍历该对象的对象范围和原型链。基本上,它是这样做的:

  • if(Object.hasOwnProperty('doSomething')){ // run Object.doSomething
  • if(Object.__proto__.hasOwnProperty('doSomething')){ // run Object.__proto__.doSomething
  • while(Object.__proto__.__proto__.__proto__.....){ // repeat

每一层都是一个哈希,所以查找是恒定的时间。 就查找速度而言,原型链中有 2 或 200 万个函数并不重要(尽管如果有 200 万个函数,您将消耗大量内存)。

供参考:jQuery 内部有 511 个函数。 200根本不算多

旁注:不要扩展Object.prototype——只是不要。如果你这样做,你会打破 for-in 循环,或者如果人们不使用明确的if(obj.hasOwnProperty(foo)) 检查,至少会非常接近于打破它们。您还将在对象哈希上使 for-in 循环变慢,这是您在扩展原型时会遇到的唯一潜在变慢。

请不要扩展Array.prototype——这让我很恼火。但是很多其他人都这样做,所以它不是那么糟糕......争论是你不应该在数组上使用for-in循环,现在很多人不因为 Prototype.js,但如果你愿意,你仍然应该被允许!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2020-08-13
    • 2020-05-09
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多