性能計測のちょっとしたツール?

性能計測するときにいちいち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-jaSourceForgeお借りしようかな…。