LITTLE CLAP
開発中メモ 2011/11/--
 FlashDevelop、ActionScript3.0(AS3)、VisualC++、Java等で開発中に起きたことの覚書。必ずしも正確な情報ではないため注意が必要。
int型の割り算
 C系では整数型同士で割り算を行えば結果も整数になるが、AS3では整数型で受け取らない限り浮動小数型となった。
var a:int = 3;
var b:int = 2;
trace(a / b);
出力:1.5
int型の掛け算
 x86系CPUは乗算の入力・出力両方に2つのレジスタを使用するが、C系では下位レジスタのみを演算結果として使用する。
 AS3でも同様だが、結果を即座に整数型で受け取らずにその後の演算を続けると自動的に浮動少数型へキャストされた。
var a:int = 0x12345678;
var b:int = 0xabcdef01;
var c:int;
c = a * b + a;

C++ 出力:1731900672 [0x673AB500]
AS3 出力:1731900656 [0x673AB4F0]
明示的なキャストによる負荷
 キャストを明示的に行うと基本型ですら異様に負荷が高い。そもそもAS3には基本型という概念がないのかもしれないが。
・暗黙のキャスト
var a:Number; for (var i:int = 0; i < 1000000; i++) { a = i * i; }
8ms

var a:Number; for (var i:int = 0; i < 1000000; i++) { a = i; a = a * a; }
12ms

var a:Number; for (var i:int = 0; i < 1000000; i++) { a = i; i = a; }
8ms

・明示的なキャスト
var a:Number; for (var i:int = 0; i < 1000000; i++) { a = (Number)(i) * i; }
55ms

var a:Number; for (var i:int = 0; i < 1000000; i++) { a = (Number)(i) * (Number)(i); }
90ms

var a:Number; for (var i:int = 0; i < 1000000; i++) { a = i; i = (int)(a); }
67ms
関数のオーバーヘッドによる負荷
 当然だが演算より負荷が高い。これだけ高いと単純な関数を気軽に作成できない。
var a:int; for (var i:int = 0; i < 1000000; i++) { a = i * i; }
8ms

for (var i:int = 0; i < 1000000; i++) { dummy(i); }
private function dummy(src:int):Number{ return src; }
113ms
Mathクラス
 絶対値や最小値を求めるのに便利でソースコード上も分かりやすいのだが、インライン展開はされていないように見える。
var a:Number; for (var i:int = 0; i < 1000000; i++) { a = Math.random() - 0.5; }
168ms

var a:Number; for (var i:int = 0; i < 1000000; i++) { a = Math.random() - 0.5; if (a < 0) { a = -a } }
176s

var a:Number; for (var i:int = 0; i < 1000000; i++) { a = Math.random() * 500000; if (a > i) { a = i; } }
172ms

var a:Number; for (var i:int = 0; i < 1000000; i++) { a = Math.abs(Math.random() - 0.5); }
305ms

var a:Number; for (var i:int = 0; i < 1000000; i++) { a = Math.min(Math.random() * 500000, i); }
316ms
Vector配列の負荷
 Point型等のオブジェクトをVector配列にし、配列のインデックスを指定してそのままメンバへアクセスすると異様な負荷がかかる。
 Rect型の例では10倍以上の負荷が発生しているが、原因が思い当たらない。
var i:int;
var x:int;
var points:Vector.<Point> = new Vector.<Point>(1000000);
var p:Point;

for (i = 0; i < 1000000; i++) { x = points[i].x; }
195ms
for (i = 0; i < 1000000; i++) { points[i] = new Point(Math.random(), Math.random()); }
42ms

var i:int;
var x:int;
var rects:Vector.<Rectangle> = new Vector.<Rectangle>(1000000);
var r:Rectangle;
for (i = 0; i < 1000000; i++) { rects[i] = new Rectangle(Math.random(), Math.random(), Math.random(), Math.random()); }

for (i = 0; i < 1000000; i++) { x = rects[i].x; }
506ms
for (i = 0; i < 1000000; i++) { r = rects[i];  x = r.x; }
49ms
inserted by FC2 system