1

在JavaScript中,我们假设我想从bObj中调用aObj.myMethod()。在我的应用程序中,从设计角度来看,aObj是bObj的基类。 JavaScript是一种晚期绑定语言,这意味着myMethod应该在运行时解决。是函数解析更快通过原型或直接引用可以更快地调用JavaScript函数吗?

////////// IF

1 - 我与我的设计自然地去说bObj.prototype = aObj,然后在运行时我叫bObj.myMethod:

function bObj(){...}; 

bObj.prototype=aObj; 


//later 
var myBObj=new bObj(); 
myBObj.myMethod(); 
////////////////////////

OR

2-功能分辨率可以通过原型慢,所以我保持aObj作为bObj中的一个属性,并从bObj中调用aObj.myMethod()

function bObj() 
{ 
    this.myAObj=new aObj(); 
    ... 
}  

//later: 
var myBObj=new bObj(); 
myBObj.myAObj.myMethod(); 

我主要关心的是执行速度。在我的应用程序中,myMethod每秒被调用数百万次。我知道大多数浏览器缓存指向最近调用函数的指针,所以在这两种情况下,函数解析过程都会加速。然而,任何人都可以在这两种情况下提供关于函数解析机制的更多细节,并让我们了解哪种方法可能会更快?所有浏览器的解析机制是否相同,或者完全依赖于浏览器?

+7

*每秒*的百万倍* *?哇,这真是太棒了! – 2011-04-05 00:15:30

+1

您是否尝试过在不同浏览器中分析这两种方式? – Cameron 2011-04-05 00:22:37

+2

您可以在http://jsperf.com/上设置您的两个场景并自行测试 – 2011-04-05 00:23:39

回答

1

只要你引用你的方式是正确的,“功能分辨率可能会很慢”。 因此,让我们来看看..

继原chaing查找,如果你做myMethod的原型方法,如:aObj.prototype.myMethod =的someMethod,那么第一种方式,myBObj.myMethod(),将获得自从myBObj实例myMethod未设置以来,当它击中继承的原型方法时,在第二次尝试中“解析命中”。第二种方法myBObj.myAObj.myMethod()在第二次尝试击中原型方法时将得到'解析命中',因为再一次没有设置实例方法(myAObj = new aObj()不设置myAObj.myMethod尚未将设置myAObj.prototype.myMethod, 所以,你这样做的方式,没有任何区别。

从任你这样做 方式获得的性能增益要么确保你要调用实例方法设置,然后引用它:

bObj.myMethod=bObj.prototype.myMethod; 
bObj.myMethod(); 

myAObj.myMethod=myAObj.prototype.myMethod; 
bObj.myMethod(); 
在这两种情况下

第一查找获取实例方法,它的使用哪个更好。

为了获得最佳的性能增益,完全消除了查找 并引用原型方法:

myBobj.prototype.myMethod(); 

myBObj.myAObj.prototype.myMethod(); 

没有“函数解析”,在这些后两种情况需要。

尽管我们都知道每次使用函数函数时都会被解释,并且已声明的函数被编译(解释)一次,并且速度如此之快,但如果将声明的函数设置为对象的原型实际上会使其更加神秘执行得更快。

如果你能找到这个,那么你会确切地知道如何让一个功能,任何功能, 执行在它的速度最快:声明它或将其设置为原型功能,无论是最好的,如果有的话,如果原型方法更快,通过直接引用原型方法避免任何原始链查找。

0

我刚刚完成了这个特定情况下的几个性能测试。它在Mozilla Rhino 1.7R3上以优化模式运行。

你的问题实际上是关于财产查询。一旦在可用范围链中找到一个属性(在您的情况下,具有函数值),则进一步的操作在两种情况下都会以相同的方式执行。

显而易见的结果是,在原型上定义的函数查找速度较慢。平均来说,调用一个原型函数花费了35%的时间。直接调用本地函数和直接调用全局范围内的函数的结果相同。

自己的属性解析速度更快,因为它们的范围在原型之前。

做出您的决定。请记住,原型非常适合代码维护和对象重用。

相关问题