efficient as3の続きのエントリです。
Tips on how to write efficient AS3 – part 2の簡単な意訳。
Array push vs. Array index
pushを使ってはいけない。値をセットする時はlist[list.length] = data;のようにしよう。配列の長さは外部変数に保存して、要素を追加/削除した時はその変数をインクリメント/デクリメント。
//コメント欄でのBlizzさんの指摘:list[list.length – 1] = data;だよね?
//返事:Blizzが正しいよ。ありがとう!
Array emptying – length 0 vs. A new Array
配列を空にするにはlengthプロパティを0にするのが、新しく配列を生成する必要もなくてかつメモリも節約できて良い方法だと考えるかもしれない。でもそれは(ほとんどのケースで)速くないよ。lengthプロパティを使って速くなるのは、一度に510個以上の配列をクリアする必要がある時だ。
Var declarations on multiple lines vs. Var declarations on a single line
数個の変数を宣言する時は、一行で書いた方が少しだけ効率的だよ。
1 2 3 4 5 |
var a:int=0, b:int=0, c:int=0; vs. var a:int=0; var b:int=0; var c:int=0; |
※この項目については、コメント欄や外部リンクにてバイトコードやメモリ使用量にまで話が及んだ熱いやり取りが行われていました。追いかけて読んでみると楽しいです。
Using Xor to swap variables
値を交換する時に3つ目の変数を作りたくない時は、
1 2 3 |
a = a^b; b = a^b; a = a^b; |
のようにすると、
1 2 3 |
var oldB:int = b; b = a; a = oldB; |
よりも300%ほど速くなるよ。
Multiplication vs. Division
割り算より掛け算の方が約130%速いよ。5000/1000 より 5000*0.001。
Type casting comparison
型をキャストする時はasを使った方がType(item)よりも250%速いよ。でもどちらも使わなければ1400%ほど速くてビビった。
Long vs Short variable names
この項目は論争の余地がある。なぜならこれを実践すると可読性の低いコードになるからね。短い変数は1つのループ内で1000回反復して1ミリ秒速くなる程度。でも僕はこれがコード最適化の最後の切り札だと考えてるよ。
※この元の記事ではコメント欄も併せて読むといいと思います。
ちなみに最初の項目は僕も試してみました。
ヒルベルト曲線のクラスでは、drawPath()を使うためにVectorにひたすら値をpushしてましたが、
1 2 3 4 5 |
data.push(pt.x + dx); data.push(pt.y + dy); ↓↓↓ data[iter++] = pt.x + dx; data[iter++] = pt.y + dy; |
のように変更して10次のヒルベルト曲線を書いてみると、
・data.push():2142ms
・data[iter++]:1837ms
となり少し高速化しました。(関連:Hilbert Curve – Flex(AS3.0))
とりあえず参考までに。
//コメント欄でのBlizzさんの指摘:
以下の訳が違うよう
“…list[list.length – 1] = data;”
これって単に”list[list.length] = data;” だよね?
本文は修正済みで,正しい。
> aoさん
指摘ありがとうございます。
length – 1 にセットしたら追加(push)じゃなくて上書きになるよってことですね;