5

この問題に関するすべての既知のブログにもかかわらず、私は常にいくつかの結果を疑っています。私の個人的なテストでは、よく言われている標準が最善ではないことが示されています。

ループ内で変数を宣言して、変数をスコープに近づけ、メソッドからの到達を高速化しますが、より多くのメモリを割り当てるか、forスコープ外で宣言して、メモリ割り当てを節約しますが、処理を増やして、離れたインスタンスで反復します。

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

結果はさまざまであり、ビットブラッシャーの第一人者ではありません。

それで、皆さんはそれについてどう思いますか?

方法A

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;
}

また

方法B

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

2 に答える 2

11

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などの概念とは異なります。

于 2012-05-24T18:23:01.937 に答える
9

tldr; それらは意味的に同等であり、同じように機能します。

提示された両方の場合に呼び出される変数は1つだけです。JavaScriptのように、ActionScriptは宣言を「ホイスト」します。つまり、実際には単なる関数スコープのアノテーションです。これは、2番目のケースで新しいスコープ(したがって新しい変数)が作成されたCおよびJavaとは異なります。objectvar

ただし、ASに違いはありません。エンジンは、最初のコードと同じ2番目のコードを効果的に処理します。(そうは言っても、スコープとは関係がなく、パフォーマンスにはvar関係がないことを理解しながら、使用場所に「近づける」ことを好みます。)

アクションスクリプト3.0:変数および特にスコープセクションを参照してください。

変数のスコープは、字句参照によって変数にアクセスできるコードの領域です。ActionScript3.0では、変数には、宣言されている関数またはクラスのスコープが常に割り当てられます。

ハッピーコーディング。

于 2012-05-24T18:18:32.637 に答える