2

リンクされたエンティティのコレクションを格納するリンクリストクラスがあります。私の匿名機能はどのように処理されますか?

私はこのクラスにiterate()メソッドを追加しました。これは私が懐疑的です。それはEntityのインスタンスだけを受け入れるはずの唯一の引数として関数を受け入れます。

すなわち

list.iterate(function(entity:Entity) 
{ 
    trace(entity.id); 

}); 

私はこのケースでiterate()に与えてくれた関数に何が起こるかわからないので、私はこの方法が心配です。そのように手動で私の反復を行うことと比較すると、私がやっていることは全く私のゲームのパフォーマンスやメモリ使用量を傷つけるでしょう?:

var i:Entity = list.first; 
while(i != null) 
{ 
    trace(i.id); 

    i = i.next; 
} 

この上の任意の情報が認識されます。

+0

変更前と変更後のベンチマークはありましたか? – jweyrich

+0

たとえば、各方法を100万回実行してベンチマークを行い、時間を比較することができます。私はテストを実行するためにFlash Builderを持っていませんが、反復メソッドがもっと遅くなることは間違いありません。 – sch

+0

反復はどのように実装されていますか? – sch

答えて

1
list.iterate(function(entity:Entity) 
{ 
    trace(entity.id); 

}); 

が悪化より

var i:Entity = list.first; 
while(i != null) 
{ 
    trace(i.id); 

    i = i.next; 
} 

場合でありますネストされた関数を呼び出すオーバーヘッドを追加するので、反復関数に似たwhileループがあります。

そして、whileループは、私がこのようなものを使用するよりもパフォーマンスを推測されます:

list.iterate(nonStaticNonNestedFunction); 

関数を呼び出すのオーバーヘッドがまだあるので、それはネストされた関数のオーバーヘッドよりも少ない場合でも、 。

1

ネストされた関数はクロージャであり、クロージャは呼び出しが遅くなります。あなたはパフォーマンスが必要な場合は、あなたの最善の策である非静的非入れ子関数(あなたはジャクソンダンスタンテストを信じていない場合getTimerでそれをテストします。)

0

多くの言語では無名関数が一般的ですが、それらを使用しないことが一般的です。彼らはコードをあまり明確にせず、デバッグが難しく、地獄のように遅いです。

ネストされた関数を呼び出すことさえありません。関数を呼び出さないよりも遅いのですが、本当の理由はクラスメソッドに匿名関数宣言があるからです。AS3コンパイラはバイトコードで特別なアクティベーションオブジェクトを作成し、仮想マシンはすべてのローカル変数を保存してこの関数にアクセスできるようにする必要があります。これは、この特定の方法を遅くする。内部で匿名関数を呼び出さずに宣言したとしても

すべての最適化手法として、正しく従う必要があります。あなたがフレームごとに一度のように呼ばれる閉鎖を得たなら、あなたはどんな減速にも気付かないでしょう。しかし、私が見るように、あなたはリンクされたリストを持っており、それは長いかもしれませんし、フレームごとに複数回反復されます。これにより、パフォーマンスが低下する可能性があります。

関連する問題