基本的に次のようなオブジェクト呼び出し Counter があります。
private long count;
private long errors;
private long duration;
private long errorDuration;
何かを返すメソッドと無効な他のメソッドをタイミングするための2つの「時間」メソッドがあります。
public <T> T time(ReturningRunnable<T> runnable) {
long start = currentTimeMillis();
T result = null;
try {
result = runnable.run();
} catch (Throwable ex) {
errorDuration += currentTimeMillis() - start;
errors++;
throw runtime(ex);
}
duration += currentTimeMillis() - start;
count++;
return result;
}
public void time(Runnable runnable) {
time(new RunnableRunner(runnable));
}
私は実行時例外として例外を再スローすることにしました (私はチェック例外のファンではないため) が、カスタム MyRunnable インターフェイスで例外をスローし、それらをキャッチして再スローすることもできます。上記の使用法は次のとおりです。
counter.time(new Runnable() {
@Override
public void run() {
// Do something
});
または、戻り値の場合は次のようになります。
return counter.time(new ReturningRunnable<Integer>() {
@Override
public Integer run() {
return 1; // You get the idea
});
カウンター オブジェクトを JMX 経由で公開し、必要な場所に挿入できるため、これが気に入っています。リフレクションで要求したことを実行できますが、それは面倒だと思います(IMHO)。