XMLリテラルを使った文字列生成の性能を測ってみた。
昨日の続き。XMLリテラルを使って文字列を生成した場合の性能を測ってみました。
結果は以下。
生成方法 | 所要時間 |
---|---|
文字列連結 | 59ms |
XMLリテラル | 287ms |
XMLリテラル+埋め込み | 700ms |
生成する文字列にもよるのかもしれないけど、使いどころには注意が必要な感じですね。
検証に使用したコード
検証に使用した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); } } }