性能計測のちょっとしたツール?
性能計測するときにいちいちlong型の変数作って
System.currentTimeMillis()を呼び出してたら
無性にキラッ☆イラッ☆と来たので作ってました。
もっと萌えるエレガントな実装が出来ないかな…。
誰でも思いつくようなライブラリなのでほかを当たったら
もっと使いやすいのあるかもしれません。
あんまりbugfixしてないけど、動くんじゃないかなと思います。
コレ使ってなんか悪影響及ぼしても責任追及はしないでね☆
import java.io.*; import java.util.*; /** * 性能を計測するためのクラス。<br> * 実装には使用しないでください。<br> * @author Crimson_Apple * @version 0.01 */ public class PMKit{ /** 時間保存用Map */ private static Map<Integer, Long> timeMap = new HashMap<Integer, Long>(); /** 出力ストリーム */ public static PrintStream out = System.out; /** * デフォルトコンストラクタ */ protected PMKit(){} /** * 現在時刻取得 * @return 現在の時刻を返す。<br> * System#currentTimeMillisを短縮したメソッドです。 */ private final static Long getTime(){ return System.currentTimeMillis(); } /** * 性能計測開始 * @param Integer key */ public final static void begin(Integer key){ if(timeMap.get(key)!=null){ throw new RuntimeException("begin("+key+")はすでに指定されています。"); } timeMap.put(key, getTime()); } /** * 性能計測終了<BR> * 性能計測終了と同時に処理時間を出力します<BR> * @param Integer key */ public final static void end(Integer key){ end(key,""); } /** * 性能計測終了<BR> * 性能計測終了と同時に処理時間と指定されたメッセージを出力します<BR> * @param Integer key * @param String message */ public final static void end(Integer key,String message){ Long endTime =getTime(); Long startTime = timeMap.get(key); if(startTime==null){ throw new IllegalStateException("begin("+key+")が実行されていません。"); } // 処理時間計算 Long calcTime =endTime-startTime; if(calcTime<0){ throw new IllegalStateException("begin("+key+")とend("+key+")の実行順序が逆です"); } out.println(createMessage(message)+"区間「"+key+"」の処理時間は"+calcTime+"ミリ秒です。"); // 使用したマップの開放 timeMap.remove(key); } /** * メッセージ構築 * @param String message */ private final static String createMessage(String message){ if(message==null) throw new IllegalArgumentException("messageがnullです。"); if(message.isEmpty()){ return message; } return message += ":"; } }
- 使い方
public class AutoBoxingBenchMarkTest{ // Auto-Boxingのテスト public static void main(String[] args) { int loopFrequency = 200000; // こんな書き方も出来た。 for(Integer i = 0;i<5;i++){ // 区間1性能計測開始 PMKit.begin(1); nomal(loopFrequency); // 区間2性能計測開始 PMKit.begin(2); // 区間1性能計測終了 PMKit.end(1); AutoBox(loopFrequency); // 区間2性能計測終了 PMKit.end(2,i+1+"回目。ループを"+loopFrequency+"回まわした場合"); loopFrequency *= 10; } } // ベンチマークテスト private static void nomal(int loopFrequency){ int integer = 0; for(int i =0; i < loopFrequency; i++){ integer=integer+integer; } } private static void AutoBox(int loopFrequency){ Integer integer = 0; for(int i =0; i < loopFrequency; i++){ integer=integer+integer; } } }
- 実行結果
区間「1」の処理時間は0です。 1回目。ループを200000回まわした場合:区間「2」の処理時間は15です。 区間「1」の処理時間は0です。 2回目。ループを2000000回まわした場合:区間「2」の処理時間は16です。 区間「1」の処理時間は15です。 3回目。ループを20000000回まわした場合:区間「2」の処理時間は94です。 区間「1」の処理時間は235です。 4回目。ループを200000000回まわした場合:区間「2」の処理時間は984です。 区間「1」の処理時間は2391です。 5回目。ループを2000000000回まわした場合:区間「2」の処理時間は9687です。
要はPMKit#begin(Integer)とPMKit#end(Integer)で
はさんだところが処理結果として出ます。
beginとendは入れ子に使用が互い違いにしようが
ちゃんとkeyのつじつまさえ合っていれば出るはずです。
簡単なメッセージもあわせて出せたりもします。
publicフィールドのout#PrintStreamにFileWriter仕込むと
ファイルに出力できたりもします。
需要ないかもしれませんが色々使ってみてください。
ってかほかの人がやってるみたいな
ソースのテーブル表示ってどうやってやるんだろう?
アレが出来ると読みやすくなるのに…。
java-jaのSourceForgeお借りしようかな…。