Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过原型还是直接引用JavaScript函数调用更快?_Javascript_Performance_Late Binding_Prototypal Inheritance_Function Call - Fatal编程技术网

通过原型还是直接引用JavaScript函数调用更快?

通过原型还是直接引用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

在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()



我主要关心的是执行速度。在我的应用程序中,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();