1

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は1秒間に何百万回も呼び出されています。ほとんどのブラウザーは最近呼び出された関数へのポインターをキャッシュするので、どちらの場合も関数解決プロセスが高速化されることを私は知っています。しかし、これら2つのケースでの関数解決メカニズムの詳細を誰かが提供し、どちらの方法がおそらくより高速であるかについての洞察を与えることができますか?解決メカニズムはすべてのブラウザで同じですか、それとも完全にブラウザに依存していますか?

4

2 に答える 2

1

あなたが参照している限りでは、「関数の解決が遅くなる可能性があります」。それでは見てみましょう..

プロト チェイン ルックアップに続いて、たとえば aObj.prototype.myMethod=somemethod のように myMethod をプロトタイプ メソッドにした場合、最初の方法である myBObj.myMethod() は、2 回目の試行で「解決ヒット」を取得します。 myBObj インスタンス myMethod が設定されていないため、継承されたプロトタイプ メソッド。

2 番目の方法である myBObj.myAObj.myMethod() は、2 回目の試行でプロトタイプ メソッドにヒットしたときに「解決ヒット」を取得します。 .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();

これらの最後の 2 つのケースでは、「関数の解決」は必要ありません。

Function 関数は、使用されるたびに解釈され、宣言された関数が 1 回コンパイル (解釈) されるため、高速であることは誰もが知っていますが、宣言された関数をオブジェクトのプロトタイプに設定すると実際に実行が高速になるかどうかは、やや謎のままです。

これを見つけることができれば、関数を取得する方法、任意の関数を最速で実行する方法を正確に知ることができます。それを宣言するか、プロトタイプ関数として設定するか、もしあれば最良の方法であり、プロトタイプメソッドがより高速である場合、プロトタイプ メソッドを直接参照することで、プロト チェーン ルックアップを回避します。

于 2012-01-06T22:57:02.203 に答える
0

この特定のケースについて、いくつかのパフォーマンス テストを終了しました。Mozilla Rhino 1.7R3 を最適化モードで実行しました。

あなたの質問は、実際にはプロパティの検索に関するものです。使用可能なスコープのチェーンでプロパティ(この場合は関数値を持つ)が見つかると、その後の操作はどちらの場合も同じように実行されます。

明らかな結果は、プロトタイプで定義された関数のルックアップが遅くなることです。プロトタイプ関数の呼び出しには、平均で 35% 長い時間がかかりました。ローカル関数を直接呼び出すのと、グローバル スコープで関数を直接呼び出すのとでは、同じ結果が得られました。

独自のプロパティは、そのスコープがプロトタイプの前にあるため、より速く解決されます。

あなたの決断をしてください。プロトタイプは、コードのメンテナンスとオブジェクトの再利用に最適であることを忘れないでください。

于 2012-01-18T03:22:26.350 に答える