覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

com.google.common.base.Stopwatch

Guavacom.google.common.base.Stopwatchの利用サンプルです。

このクラスは名前の通りストップウォッチのように処理時間の計測などに用います。

■Stopwatchを使わない計測

Stopwatchを利用しない場合、以下のようなコードで処理時間を計測することが多いかもしれません。

long start = System.currentTimeMillis();
        
// 時間を計測したい処理
execBusinessLogic();
        
long end = System.currentTimeMillis();

System.out.println("Execution time1: " + (end - start) + "ms");


Stopwatchを使った計測

Stopwatchを用いた場合は処理時間の計測は以下のようになります。
基本的に、 Stopwatch#createStarted → 計測したい処理 → Stopwatch#stop の流れになります

Stopwatch stopwatch1 = Stopwatch.createStarted();

execBusinessLogic();

stopwatch1.stop();

System.out.println("Execution Stopwatch time1: " + stopwatch1);

■実行結果

Execution Stopwatch time1: 2.001 s


Stopwatchをリセットして計測を繰り返す

Stopwatchで計測した結果をStopwatch#resetでリセットして計測を何度も繰り返すことができます

Stopwatch stopwatch1 = Stopwatch.createStarted();
execBusinessLogic();
stopwatch1.stop();

System.out.println("Execution Stopwatch time1: " + stopwatch1);

// リセットすると0に戻る
stopwatch1.reset();
System.out.println("Execution Stopwatch time2: " + stopwatch1);


// リセット後の再測定を開始
stopwatch1.start();

execBusinessLogic();

stopwatch1.stop();

System.out.println("Execution Stopwatch time3: " + stopwatch1);

■実行結果

Execution Stopwatch time1: 2.001 s
Execution Stopwatch time2: 0.000 ns
Execution Stopwatch time3: 1.002 s


計測結果の出力単位を指定

Stopwatch#elapsedで、計測結果を出力するときの単位を指定できます。

Stopwatch stopwatch1 = Stopwatch.createStarted();
execBusinessLogic();
stopwatch1.stop();

// マイクロ秒で出力
System.out.println("Execution Stopwatch time3: " + stopwatch1.elapsed(TimeUnit.MICROSECONDS) + " usec");

// ミリ秒秒で出力
System.out.println("Execution Stopwatch time3: " + stopwatch1.elapsed(TimeUnit.MILLISECONDS) + " msec");

■実行結果

Execution Stopwatch time3: 1001550 usec
Execution Stopwatch time3: 1001 msec


試したソースコードの全体は以下の通りです

import java.util.Random;
import java.util.concurrent.TimeUnit;

import com.google.common.base.Stopwatch;

public class StopwatchClient {
    public static void main(String[] args) {

        // Stopwatchを使わない場合の計測
        long start = System.currentTimeMillis();
        
        // 時間を計測したい処理
        execBusinessLogic();
        
        long end = System.currentTimeMillis();

        System.out.println("Execution time1: " + (end - start) + "ms");

        System.out.println("---------------------");

        // Stopwatchを使うとこんな感じ
        Stopwatch stopwatch1 = Stopwatch.createStarted();
        execBusinessLogic();
        stopwatch1.stop();

        System.out.println("Execution Stopwatch time1: " + stopwatch1);

        // リセットすると0に戻る
        stopwatch1.reset();
        System.out.println("Execution Stopwatch time2: " + stopwatch1);

        // リセット後の再測定を開始
        stopwatch1.start();
        execBusinessLogic();
        stopwatch1.stop();

        System.out.println("Execution Stopwatch time3: " + stopwatch1);

        // 出力する単位を指定することもできる
        System.out.println("Execution Stopwatch time3: " + stopwatch1.elapsed(TimeUnit.MICROSECONDS) + " usec");
        System.out.println("Execution Stopwatch time3: " + stopwatch1.elapsed(TimeUnit.MILLISECONDS) + " msec");
    }

    /**
     * 何か業務処理の代わり
     */
    private static void execBusinessLogic() {
        Random r = new Random();
        try {
            Thread.sleep(1000 * r.nextInt(4));
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}