- 2009年10月10日 02:04
- ActionScript 3.0 | Flash
ついさっき何かとお世話になる配列についていろいろ調べてました
せっかくなのでここにまとめておきます。
相変わらず、アウトプットとかが全然ない地味な検証系blogだww
しかもJS書く人ならだいたい知ってそうなノウハウという・・・
まあ、というわけで久々の記事でございます。
せっかくなのでここにまとめておきます。
相変わらず、アウトプットとかが全然ない地味な検証系blogだww
しかもJS書く人ならだいたい知ってそうなノウハウという・・・
まあ、というわけで久々の記事でございます。
◆ 生成速度
実は new Array() するよりも [] のほうが3倍速い
型とか、挙動に差があると思ったら全くない(検証した範囲内では)
◆ push
push するより array[array.length] = value; のほうが10〜20%早い
ちなみにVectorでもこの記述方式が 10〜20%早い
(1000000アイテムの追加で検証)
あと Array と Vector のpush実行の差は約20% Vector が早いです。
◆ 配列へのアクセス
配列のアクセス方法は多々あり悩みますが
結論から言うと速度は
for > for each > while > for( key in arr ) > forEach > map
となりました。その速度は1000000アイテムの処理に対して平均
50ms, 65ms, 95ms, 100ms, 140ms, 195ms
となりました。(PCの環境によっては若干の違いがあるかもしれません)
また、Vector に関しては以下の順で早いです。
for > while > for( key in vec ) > forEach > map
その速度は1000000アイテムの処理に対して平均
20ms, 90ms, 90ms, 140ms, 320ms
となり、Vectorのmap関数は相当おそいという事になります。
にしてもfor文だけで比べた場合、やはりVectorは早いですね。
あと、細かい話ですが配列へ for文 でアクセスする際に 結構こう書いちゃう人が居たりします。
for( var i:uint = 0; i < arr.length; i++ ){
arr[i] = ....;
}
こう書くと、 i < arr.length のと記述すると、 for文内が1度処理されるたびに
arr.length を調べるためかなり無駄が多いです。
面倒でも、以下のように記述する事をお勧めします。
var len:uint = arr.length;
for( var i:uint = 0; i < len; i++ ){
arr[i] = ....;
}
ちなみに速度差は Array で2倍、Vector だと4倍違います。
けっこうでかいので、大きな配列をまわすときは注意です。
◆ おまけ
文字列連結も、+ 使うより、配列使う方が若干速いです。
var str:String = [
"hoge","fuga",............,"nemui"
].join("");
みたいな書き方です。まあ本当に若干ですけども。
◆ まとめ
まあここら辺に書いた事って、今くらいのPCスペックになると
気にするほどの事じゃないんですが、でもちょっとえぐい処理をやろうとすると
やはり細かな事の積み重ねで、パフォーマンスが変わるので
覚えておいて損はないかと。あと、やっぱ Vector 速いね
さて、今日はこの辺で。
- Newer: AS3.0 パフォーマンス検証用のWonderflを作った
- Older: AS3.0 バグ発見、と思ったけど仕様だった