読者です 読者をやめる 読者になる 読者になる

Flash9の演算速度の話

ActionScript3


Flash10では,今まで散々キモがられてきたArrayの代わりにVectorが登場して,ようやくマトモになった感じ.
で,そこで言われている「ArrayおっそーVectorはぇー」について思ったこと.

var a:Array = new Array(999999);
for (var i:int=0; i<999999; i++) { a[i] += i; }

は,

var a:Array = new Array(999999);
var n:int;
for (var i:int=0; i<999999; i++) { n=a[i]; n+=i; a[i]=n; }

とすると環境によっては高速化します.自分の環境では,850ms->500msになりました.id:keim_at_Si:20071106より,int型加算/ビット演算はNumberに変換せずに計算するみたいなので,コンパイラ内で計算式全体がint型だと判断できれば,int型として計算するみたいです.
Flash10を試してる時間が無いので憶測でしか判りませんが,Vectorでの計算は,コンパイラ内で計算式全体の型を判断できるため高速になってる可能性があります.どちらにせよ,代入によるコストが減るし,コードの見通しが良くなるので,Vector型大歓迎なのは間違いないですが.
ちなみに,

for (var i:int=0; i<999999; i++) { a[i] = int(a[i]) + i; }

は高速化しませんでした.キャストも計算式のひとつとして扱われてるんでしょうか...


あと,

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

var n:Number;
for (var i:Number=0; i<999999; i++) { n=a[i]; n+=i; a[i]=n; }

で有意差が見られませんでした.これは,Arrayを含む計算がデフォルトでNumberで計算されるためじゃないかなと思います.
【訂正】嘘.配列の初期化をミスってた.有意差有りました.そもそもインデックスにNumberって時点でどうかしてるけど.

var n:Number = 1;
for (var i:int=0; i<999999; i++) { a[i] += n; }

から

var t:Number, n:Number = 1;
for (var i:int=0; i<999999; i++) { t=a[i]; t+=n; a[i]=t; }

で951ms->624msに高速化.id:keim_at_Si:20071106でint型とNumber型の計算速度に大差無いって言っといて,この考察は明らかにおかしい.


http://www.unbland.net/blog/archives/2008/05/flash-player-10-3-shader-vecto.html
そんなことより,シェーダーを利用した加算が素敵過ぎる件.