Hatena::ブログ(Diary)

Yasu Log::Flash/Flex/AIR::ブログ このページをアンテナに追加 RSSフィード

2007-02-11

ループ文速度比較


ActionScriptでのループ文、

皆さんはどのように書きますか?

for文、while分、Iterator走査、

配列のループ速度を試してみました。




今回おこなってみたのは、10万の数字要素を持つ配列を

一個一個トレースさせるベンチマークテストです。



その一、For文でループ

//my_arrは配列
for( var i:Number=0 ; i<my_arr.length ; i++ )
{
	trace( my_arr[ i ] );
}

処理時間 : 3.660秒




その二、while文でループ

//my_arrは配列
var i:Number = my_arr.length;
while( i-- )
{
	trace( my_arr[ i ] );
}

処理時間 : 3.287秒

この書き方がシンプルで好き。

早くて良かった。





その三、デザインパターン(Iterator)で走査

import com.clockmaker.utils.*; //イテレータクラスをインポート
var iterator:Iterator = new ArrayIterator( my_arr );
while( iterator.hasNext() )
{
	trace( iterator.next() );
}

処理時間 : 8.450


えっ、Iteratorって使い物にならないじゃんw


上の二つと比べて遅くなることは分かっていましたが、

こんなに結果が開くなんてあんまりでした。

カッコつけて今までOOPといってIteratorを使ってきましたが、

速度の遅いASでIteratorは無理があったようです。。

Flashではスムーズな操作感を大切にしたいので

これからはあまり無理はさせないようにします。




(参考)ベンチテストで使ったコード

var my_arr:Array = [];
for( var n=0; n<100000; n++)
	my_arr.push( Math.random()*1000 );

var start_date:Date = new Date();
	
//ここに比較する配列のループ文を記述===================== s

var i:Number = my_arr.length;
while( i-- )
{
	trace( my_arr[ i ] );
}

//========================================== e

var end_date:Date = new Date();
trace( "処理時間 : " + ( end_date.getTime() - start_date.getTime() ) );

関連記事

タイムラインに配置したMCを確認する方法 - Yasu Log::Flash/Flex/AIR::ブログ

日本語のAcrionScript1.0/2.0【 3Dサンプル 】 - Yasu Log::Flash/Flex/AIR::ブログ

ActionScript Editor - Yasu Log::Flash/Flex/AIR::ブログ

yasu-logyasu-log 2007/05/15 01:53 追記:ActionScript3で試してみると
forもwhileもIteratorもほとんど変わりませんでした。

もしかしたら検証方法が悪いだけかもしれないので、
いい方法が見つかったら再度テストしてみます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証