【发布时间】:2011-04-05 00:13:25
【问题描述】:
在 JavaScript 中,假设我想从 bObj 内部调用 aObj.myMethod()。在我的应用程序中,从设计的角度来看,aObj 是 bObj 的基类。 JavaScript 是一种后期绑定语言,这意味着 myMethod 应该在运行时解析。函数解析是否更快
//////////如果
1-我很自然地使用我的设计并说 bObj.prototype=aObj 然后在运行时我调用 bObj.myMethod:
function bObj(){...};
bObj.prototype=aObj;
//later
var myBObj=new bObj();
myBObj.myMethod();
/////////////////////或
2- 原型中的函数解析可能很慢,所以我将 aObj 作为属性保留在 bObj 中,并从 bObj 内部调用 aObj.myMethod()
function bObj()
{
this.myAObj=new aObj();
...
}
//later:
var myBObj=new bObj();
myBObj.myAObj.myMethod();
我主要关心的是执行速度。在我的应用程序中,myMethod 每秒被调用数百万次。我知道大多数浏览器都会缓存指向最近调用的函数的指针,因此在这两种情况下,函数解析过程都会加快速度。然而,任何人都可以提供有关这两种情况下函数解析机制的更多细节,并提供一些见解,即哪种方法可能更快?解析机制在所有浏览器中都相同还是完全依赖于浏览器?
【问题讨论】:
-
百万次/秒?哇,这么多!
-
您是否尝试过在不同的浏览器中同时分析两种方式?
-
你可以在jsperf.com设置你的两个场景并自己测试一下
-
从逻辑上讲,属性解析链越短访问速度越快,但现实中不一定如此。在您发布的代码中,在这两种情况下都有两个查找 myMethod() ,因此您没有获得任何东西。此外,调用 myMethod 的方式会影响其 this 关键字的值,在第一种情况下它将是 myBObj,在第二种情况下是 myAObj。因此,请彻底考虑您的设计 - 有效的代码比(略微)更快的错误代码更好。
-
@user680999:我的 cmets 是关于性能的。这是一个测试用例来证明我的观点:jsperf.com/lookupperf。短链在所有浏览器(包括 iOS 上的 Safari)中较慢,但 IE 6 除外,IE 6 的短链要快 3 倍 - 但较新版本的 IE 可能会改变这一点。鉴于与短链的 1 相比,长链是 7 次查找,我认为这已经足够证明了。你的继承链长于 7 吗?底线是,不要仅仅为了性能而优化查找链。
标签: javascript performance late-binding prototypal-inheritance function-call