2012-05-24 9 views
5

この問題に関するすべての既知のブログにもかかわらず、私はいつもいくつかの結果を疑っています。私の個人的なテストは、よく言われた標準が最良ではないことを示しています。Actionscriptのループでの変数宣言のパフォーマンス3

その範囲に近いそれらを維持し、それが速い方法で行くことができるようにすること、ループ内の変数を宣言するが、より多くのメモリを割り当てるか、メモリの割り当てを保存して、反復する処理を高めるためにスコープに対して外で宣言遠くのインスタンスで。

私の結果は、方法Bがより速く(時には)、これについての背景を知りたいことを示しています。

結果はさまざまで、裕福な教祖でもありません。

あなたはそれについてどう思いますか?

方法

var object:Object = new Object(); 
var loop:int = 100000 
for (var i:int = 0; i < loop; i++) 
{ 
    object = new Object(); 
    object.foo = foo; 
    object.bar = bar; 
} 

OR

方法B

var loop:int = 100000 
for (var i:int = 0; i < loop; i++) 
{ 
    var object:Object = new Object() 
    object.foo = foo; 
    object.bar = bar; 
} 
+0

彼らが再現性、有効であるかどうかを確認するために行わ*実際の*テストを見て、アサートされているかを示すために興味深いものになるだろう。マイクロベンチマークを正しく取得するのは難しいです(上記のスニペットは適切ではありません)。一般的に、inconsequentail入れ子のスコープ内の変数を宣言するための引数(例:*ネストされた関数*)と[[スコープ]]チェーンを検索避けるために、それらに値を割り当てるが、それは*異なる*であるとはいえ、いくつかは、* *あり新しい[[スコープ]]が必要なケース。 –

+0

方法Bの方が新しい方法が1つ少ないので、方法Bは高速です。ここに時間を費やしているのは新しい声明です。 –

答えて

8

tldr。それらは意味的に同等であり、同一に機能する。

提示objectの両方の例と呼ばれるだけ変数があります。 ActionScriptは、JavaScriptのように、宣言を「ホイスト」します。つまり、varであり、実際には機能スコープの注釈です。これは、新しいスコープ(したがって、新しい変数)になるCおよびJavaと2番目のケースで作成されています。

しかし、ASに違いはありません。エンジンは、の2番目のコードを最初のコードと同じように扱います。 (それを理解することがスコープに関連していないとパフォーマンスとは関係ありませんしながら、言われていること、私は、それが使用されている場所に「近いvarを保つ」ことを好む。)

Action Script 3.0: Variablesと、スコープセクションを参照してください。特に:

変数のスコープは、変数が字句参照によってアクセスすることができるコードの領域である... ActionScript 3.0では、変数は常に関数又はクラスの範囲が割り当てられています彼らは宣言されています。

ハッピーコーディング。

+0

は、私は*** VAR ***宣言が間違っているループレース –

+0

@ConradoSouzaの内側にあるので、変数インスタンスの数は、ループの数に等しいような方法で参照してください。リンクを参照してください。 'var' **はAS/JavaScriptの宣言**(C/Javaの意味で)ではありません。関数全体のアノテーションです。つまり、それは「持ち上げられ」、関数スコープに適用されます。 –

+0

@ConradoSouzaこの動作はループの外(たとえ 'VARの上、として見ることができます。(ただし、私はその「行が実行された」とき、それは何かを「宣言」しないという点を作ることは技術的に宣言と呼ばれています。)オブジェクト 'line!)、' object'はアクセス可能で最後に割り当てられた値を持ちます。 –

10

AS3コンパイラは、すべての変数宣言を変数ホイストと呼ばれるメソッドの先頭に移動します。変数の最小スコープは完全なメソッドです。あなたのメソッドBは、次のものと同等です:

var loop:int = 100000; 
var i:int; 
var object:Object; 
for (i = 0; i < loop; i++) { 
    object = new Object(); 
    object.foo = foo; 
    object.bar = bar; 
} 

これに関連する代入ではなく、宣言だけを上に移動することに注意してください。これは、変数を使用した後で変数を宣言できる理由です。たとえば、次のコードを試してください:

trace(a); 
var a:int = 10; 
trace(a); 

これはコンパイルされます。このコードは同等であるので、それはです:

var a:int; 
trace(a); 
a = 10; 
trace(a); 

これはまた、次のコードで重複した変数宣言の警告が表示されます理由です:

for (var i:int = 0; i < m; i++) { 

} 
for (var i:int = 0; i < n; i++) { // i is already declared once 

} 

AS3での変数のスコープの概念は、JS等のC、C++、Javaのとは異なっている

+1

Taskinoor、あなたの答えは右のように多くのPST 1はあるが、しかし、彼の答えは、より多くの技術的な知識が含まれていますし、それは私が探していた、おそらくこの質問に来る誰もそれを探しています何。 –

+5

@Conrado Souzaは、お互いの助けを借りて知識と学習を共有することを約束しています。それは決して受け入れられたり、評判が高くなることはありません。ただの副産物です。私はベストを尽くしました。それは最高の答えを提供したわけではありません。 – taskinoor

+2

私はこの答えが私のものよりも好きです。 +1しました。 –

関連する問題