読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

XMLリテラルを使った文字列生成の性能を測ってみた。

昨日の続き。XMLリテラルを使って文字列を生成した場合の性能を測ってみました。

  • 20文字程度の文字列を、「文字列連結」「XMLリテラル」「XMLリテラル+埋め込み」のそれぞれで50000回生成した場合の所用時間を計測。
  • それぞれ5回試行し、平均を取っています。

結果は以下。

生成方法 所要時間
文字列連結 59ms
XMLリテラル 287ms
XMLリテラル+埋め込み 700ms
  • XMLリテラルは文字列連結の5倍程度遅く、
  • 埋め込みを使うとさらに3倍程度遅くなっています。

生成する文字列にもよるのかもしれないけど、使いどころには注意が必要な感じですね。

検証に使用したコード

検証に使用したswfはここにあります。ソースは以下。

package {

  import mx.utils.*;
  import flash.display.*;
  import flash.text.*;
  
  public class Sample extends Sprite  {
    
    public function Sample(){

      // 結果を表示
      var stdout:TextField = new TextField();
      stdout.width = 500;
      stdout.height = 500;
      addChild(stdout);
      stdout.text = "";
      
      
      XML.ignoreWhitespace = false;
      
      // 文字列連結で作る。
      stdout.text += "\n\n--- 文字列連結\n"
      stdout.text += perf( function():void{
          var str:String = "\n" +
            " aaaa\n" + 
            " bbbb\n" +
            " cccc\n" +  
            " dddd\n"; 
      });
      
      // XMLリテラルを使う
      stdout.text += "\n\n--- XMLリテラル\n"
      stdout.text += perf( function():void{
          var str:String = <str>
 aaaa
 bbbb
 cccc
 dddd
</str>.toString()
      });
      
      // XMLリテラル+埋め込み
      stdout.text += "\n\n--- XMLリテラル+埋め込み\n"
      var a:String = "aaaa";
      var b:String = "bbbb";
      var c:String = "cccc";
      var d:String = "dddd";
      stdout.text += perf( function():void{
          var str:String = <str>
 {a}
 {b}
 {c}
 {d}
</str>.toString()
      });
      

    }
    
    /**
     * メソッドの実行時間を計る
     * メソッドを5回実行して、平均、最大、最小を返す
     */
    public function perf( f:Function ):Object {
        var loop:Number  = 50000; // 実行回数
        var count:Number = 5; // 試行回数
        var total:Number = 0;
        var max:Number = -1;
        var min:Number = -1;
        for ( var i:Number = 0; i < count; i++ ) {
          var start:Date = new Date();
          try {
            for ( var j:Number = 0; j < loop; j++ ) {
              f();
            }
          } finally {
            var time:Number = new Date().getTime() - start.getTime();
            total += time;
            if ( max == -1 || max < time ) { max = time; }
            if ( min == -1 || min > time ) { min = time; }
          }
        }
        return StringUtil.substitute( 
          "avg:{0}ms, max:{1}ms, min:{2}ms", int((total / count)), max, min);
    }
  }
}