0

オブジェクト属性を反復するときと配列を反復するときのパフォーマンス ヒットはありますか?

オブジェクトを使用した例:

var x:Object = {one: 1, two: 2, three: 3};
for (var s:String in x) {
 trace(x[s]);
}

対配列の使用

var a:Array = [1, 2, 3];
var len:Number = a.length;
for (var i:Number = 0; i < len; ++i) {
 trace(a[i]);
}

では、どちらがより速く、最も重要なことでしょうか?

IIRC、一部の JavaScript 実装では、オブジェクト属性を反復処理すると最大 20 倍遅くなりますが、ActionScript2 でそのような測定値を見つけることができませんでした。

4

2 に答える 2

1

非常によく似たテストを試しましたが、200k 要素を 1 回だけ繰り返したところ、反対の結果になりました。

Task build-arr: 2221ms
Task iter-arr: 516ms

Task build-obj: 1410ms
Task iter-obj: 953ms

Luke のテストはループ オーバーヘッドに支配されているのではないかと思います。また、最初に配列を作成するのにかなり長い時間がかかることに注意してください。そのため、タスクが挿入が多い場合は ymmv.

また、私のテストでは、arr.length をローカル変数に格納すると、測定可能なパフォーマンスが約 15% 向上しました。

アップデート:

ご要望にお応えして、私が使用したコードを掲載します。

var iter:Number = 200000;
var time:Number = 0;
var obj:Object = {};
var arr:Array = [];

time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
  arr[i] = i;
}
trace("Task build-arr: " + (getTimer() - time) + "ms");

time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
  arr[i] = arr[i];
}
trace("Task iter-arr: " + (getTimer() - time) + "ms");

time = getTimer();
for (var i:Number = 0; i < iter; ++i) {
  obj[String(i)] = i;
}
trace("Task build-obj: " + (getTimer() - time) + "ms");

time = getTimer();
for (var i:String in obj) {
  obj[i] = obj[i];
}
trace("Task iter-obj: " + (getTimer() - time) + "ms");
于 2009-01-27T22:32:17.393 に答える
0

わかった。簡単な測定をしてみませんか?

var time : Number;

time = getTimer();

var x:Object = {one: 1, two: 2, three: 3};

for( i = 0; i < 100000; i++ )
{
    for (var s:String in x) 
    {
        // lets not trace but do a simple assignment instead. 
        x[s] = x[s];
    }
}

trace( getTimer() - time + "ms");

time = getTimer();

var a:Array = [1, 2, 3];
var len:Number = a.length;

for( i = 0; i < 100000; i++ )
{
    for ( var j : Number = 0; j < len; j++) 
    {
        a[j] = a[j];
    }
}

trace( getTimer() - time + "ms");

私のマシンでは、配列の反復がやや遅くなります。これは、ActionScript 2に「実際の」配列がなく、連想配列(マップ)しかないことが原因である可能性があります。どうやら配列を操作するには、コンパイラはコードのオーバーヘッドを生成する必要があります。私はこれの詳細を調べていませんが、そうなる可能性があると想像できます。

ところで。このテストを実行すると、配列の長さの値を変数に入れても、実際にはパフォーマンスが向上しないことも示される場合があります。ただそれを手放す...

更新:ActionScriptとJavaScriptは構文的に関連していますが、基盤となる実行メカニズムは完全に異なります。たとえば、FireFoxはSpiderMonkeyを使用し、IEはおそらくMicrosoftの実装を使用しますが、AS2はAdobeのAVM1によって実行されます。

于 2009-01-27T21:11:06.887 に答える