複数回参照している数レベルの深さでネストされたオブジェクトがあります。そのオブジェクトへの参照を作成して設定する方が速いですか、それとも重要ですか?
コンテキストローカル参照を作成する方が速いと聞きました。これは何年も前のことであり、VisualBasicプロジェクトの場合です。しかし、これはフラッシュです。そして、出力はSWF/バイトコードです。そして、コンパイラーはその参照を調べて、オブジェクトを毎回検索する必要がないように、私が行っていることを実行できます。
例えば:
public function doStuff():void {
Model.instance.view1.button1 = button1;
Model.instance.view1.button2 = button2;
Model.instance.view1.button3 = button3;
Model.instance.view1.button4 = button4;
Model.instance.view1.button5 = button5;
Model.instance.view1.button6 = button6;
// more fake code referencing more something.something.something like things
for (var i:int;i<something.something.something.length;i++) {
var result:Object = Controller.staticMethod(button1);
var result2:Object = Controller.staticMethod(button1);
}
}
対:
public function doStuff():void {
var view1:View = Model.instance.view1;
view1.button1 = button1;
view1.button2 = button2;
view1.button3 = button3;
view1.button4 = button4;
view1.button5 = button5;
view1.button6 = button6;
}
。
バリスの提案を受けて、私はそれを自分でテストしました。以下に結果を示します(実際の違いに解釈する方法はわかりませんが、「メソッド1はメソッド2よりも.000001高速です」)。
結果
テスト1
var instance:Model = Model.instance;
var startTime:int = getTimer();
for(var i:int = 0; i<10000000; i++){
instance.url = "";
}
trace(getTimer()-startTime); // 826, 929, 823
var startTime:int = getTimer();
for(var i:int = 0; i<10000000; i++){
Model.instance.url = "";
}
trace(getTimer()-startTime); // 3483, 3976, 3539
テスト2
var instance:Model = Model.instance;
var localLogo:BitmapImage = Model.instance.logo;
var startTime:int = getTimer();
for(var i:int = 0; i<10000000; i++){
localLogo = logo;
}
trace(getTimer()-startTime); // 2070, 2083, 2110
var startTime:int = getTimer();
for(var i:int = 0; i<10000000; i++){
instance.logo = logo;
}
trace(getTimer()-startTime); // 2028, 2509, 2154