AS3 パフォーマンス測定

とりあえずパフォーマンス測定のためにこんなコードを書いた。

package {
  import flash.display.*;
  public class Test extends Sprite {
    private var t:Number;
    public function Test(){
      var N:int = 10000000;
      log(N);
      var d:Date = new Date();
      for(var j:int=0; j < 5; j++){
        getTime();
        for(var i:int=0; i < N; i++){
            
        }
        log(getDiff());
      }
    }
    
    public function getTime():Number{
      t = new Date().time;
      return t;
    }

    public function getDiff():Number{
      var t2:Number = new Date().time;
      var result:Number = t2 - t;
      t = t2;
      return result;
    }
  }
}

一千万回の空ループは78 47 46 47 47って感じ。
x++;を入れると94 47 47 62 63って感じ。

        • -
var x:Array = [0, 0];
getTime();
for(var i:int=0; i < N; i++){
  x[0] = 0;
  x[1] = 0;
}

485 484 469 563 469

  x = [0, 0];

5219 5203 5141 5109 5063

当たり前だけどArrayの破壊的書き換えに比べて新しく生成するコストは高い。
でも一千万個作って5秒だったら思ったより軽いんじゃないか。

        • -
var x:Array = [0.1, 0.5];
getTime();
for(var i:int=0; i < N; i++){
  var x0:Number = x[0];
  var x1:Number = x[1];
  x0 * x0 + x1 * x1;
}

406 375 375 391 375

  x[0] * x[0] + x[1] * x[1];

625 594 609 891 593

Arrayの参照コストは高い。2回参照するなら面倒でもローカル変数に割り付けた方が速い。
実際の所どういうインストラクションが走っているのか見て何が遅いのか確認したいが、flasmはAS3未対応だった。

        • -

とりあえずこまめに変数を作る方針で行くと言うことで、vって打って保管したらvar ...:... = ...;が入るようにした。

        • -

一文字の変数と100文字の変数で実行時のパフォーマンスに差はない。AS3では読みやすい長い名前をつけた方がいい。

        • -

パフォーマンスを調べつつ自分のAS3でのコーディングスタイルを定めていってるんだけど、割と僕好みの読みやすいコードが書けそうでうれしい。