通过原型还是直接引用JavaScript函数调用更快?
在JavaScript中,假设我想从bObj内部调用aObj.myMethod()。在我的应用程序中,从设计的角度来看,aObj是bObj的基类。JavaScript是一种后期绑定语言,这意味着myMethod应该在运行时解析。函数的分辨率更快吗 //////////如果 1-我自然地使用我的设计,说bObj.prototype=aObj,然后在运行时调用bObj.myMethod:通过原型还是直接引用JavaScript函数调用更快?,javascript,performance,late-binding,prototypal-inheritance,function-call,Javascript,Performance,Late Binding,Prototypal Inheritance,Function Call,在JavaScript中,假设我想从bObj内部调用aObj.myMethod()。在我的应用程序中,从设计的角度来看,aObj是bObj的基类。JavaScript是一种后期绑定语言,这意味着myMethod应该在运行时解析。函数的分辨率更快吗 //////////如果 1-我自然地使用我的设计,说bObj.prototype=aObj,然后在运行时调用bObj.myMethod: function bObj(){...}; bObj.prototype=aObj; //later va
function bObj(){...};
bObj.prototype=aObj;
//later
var myBObj=new bObj();
myBObj.myMethod();
////////////////////////或
2-在原型中,函数解析可能会很慢,因此我将aObj作为bObj中的一个属性,并从bObj内部调用aObj.myMethod()
我主要关心的是执行速度。在我的应用程序中,myMethod每秒被调用数百万次。我知道大多数浏览器都会缓存指向最近调用的函数的指针,因此在这两种情况下,函数解析过程都会加快。然而,有谁能提供这两种情况下函数解析机制的更多细节,并给出哪些方法可能更快的见解?解析机制在所有浏览器中都是相同的还是完全依赖于浏览器 就您引用的方式而言,您是对的,“函数解析可能很慢”。 让我们来看看 在proto-chaing查找之后,如果您将myMethod设置为原型方法,例如:aObj.prototype.myMethod=somemethod,那么第一种方法myBObj.myMethod()在第二次尝试时将在命中继承的原型方法时获得“resolution hit”,因为没有设置myBObj实例myMethod 第二种方法,myBObj.myAObj.myMethod(),在第二次尝试中命中原型方法时将获得“分辨率命中”,因为实例方法没有设置(myAObj=new aObj()没有设置myAObj.myMethod,但会设置myAObj.prototype.myMethod), 所以你这样做,没有区别 通过这两种方法中的任何一种获得性能增益 请确保设置了要调用的实例方法,然后引用它:
bObj.myMethod=bObj.prototype.myMethod;
bObj.myMethod();
或
在这两种情况下,第一次查找都会得到instance方法,并使用哪个更好
要获得最佳性能增益,请完全消除查找
并参考原型方法:
myBobj.prototype.myMethod();
或
在后两种情况下,不需要“功能解析”
虽然我们都知道函数每次使用时都会被解释
声明的函数只编译(解释)一次,因此速度更快。如果将声明的函数设置为对象的原型实际上使其执行更快,那么这就有点神秘了
如果你能找到这个,你就会知道如何得到一个函数,任何函数,
要以最快的速度执行:声明它或将它设置为原型函数(如果有的话,以最好的为准),如果原型方法更快,通过直接引用原型方法避免任何原型链查找。就您引用的方式而言,您是对的,“函数解析可能会很慢”。 让我们来看看 在proto-chaing查找之后,如果您将myMethod设置为原型方法,例如:aObj.prototype.myMethod=somemethod,那么第一种方法myBObj.myMethod()在第二次尝试时将在命中继承的原型方法时获得“resolution hit”,因为没有设置myBObj实例myMethod 第二种方法,myBObj.myAObj.myMethod(),在第二次尝试中命中原型方法时将获得“分辨率命中”,因为实例方法没有设置(myAObj=new aObj()没有设置myAObj.myMethod,但会设置myAObj.prototype.myMethod), 所以你这样做,没有区别 通过这两种方法中的任何一种获得性能增益 请确保设置了要调用的实例方法,然后引用它:
bObj.myMethod=bObj.prototype.myMethod;
bObj.myMethod();
或
在这两种情况下,第一次查找都会得到instance方法,并使用哪个更好
要获得最佳性能增益,请完全消除查找
并参考原型方法:
myBobj.prototype.myMethod();
或
在后两种情况下,不需要“功能解析”
虽然我们都知道函数每次使用时都会被解释
声明的函数只编译(解释)一次,因此速度更快。如果将声明的函数设置为对象的原型实际上使其执行更快,那么这就有点神秘了
如果你能找到这个,你就会知道如何得到一个函数,任何函数,
以最快的速度执行:声明它或将它设置为原型函数,以最好的为准,如果原型方法更快,则直接引用原型方法来避免任何原型链查找。我刚刚完成了此特定情况的几个性能测试。它是在优化模式下使用Mozilla Rhino 1.7R3运行的。> 您的问题实际上是关于属性查找的。一旦在可用作用域链中找到属性(在您的情况下,具有函数值),进一步的操作将在这两种情况下执行相同的操作 明显的结果是,在原型上定义的函数的查找速度较慢。平均而言,调用原型函数所花费的时间要多35%。直接调用本地函数与直接调用全局范围内的函数的结果相同 自有属性的解析速度更快,因为它们的作用域先于原型
做出决定。记住原型对于代码维护和对象重用非常有用。我刚刚完成了针对这个特定案例的几个性能测试。它是在Mozilla Rhino 1.7R3的优化模式下运行的 您的问题实际上是关于属性查找的。一旦在可用作用域链中找到属性(在您的情况下,具有函数值),进一步的操作将在这两种情况下执行相同的操作 明显的结果是定义了函数的查找
myBObj.myAObj.prototype.myMethod();