Javaコードの実行時間を求める(時間測定)
Javaコードの実行時間を測定する3つの方法について説明します。
概要
コーディングをしていると、遅延が発生したり、どの区間が遅いのか実行時間を求めたい場合があります。また、自分が作成したアルゴリズムやロジックの速度を求めたい場合もあります。
そのほかにもさまざまな理由で、特定区間のコード実行時間を知る必要がある場合に使える3つの方法について見ていきます。
System.currentTimeMillis()
Javaで標準提供されているSystem.currentTimeMillis()メソッドを利用すると、現在時刻をミリ秒単位で出力できます。
これは、1970年1月1日UTC時刻を基準として、現在までの時間差をミリ秒単位で出力した値です。
このメソッドを使用して、開始区間と終了区間でそれぞれ時間を取得し、2つの時間の差を計算すると、ms単位の時間差を求められます。
long beforeTime = System.currentTimeMillis(); // コード実行前に時間を取得
// 測定したいコード...
long afterTime = System.currentTimeMillis(); // コード実行後に時間を取得
long diffTime = afterTime - beforeTime; // 2つの実行時間
System.out.println("실행 시간(ms): " + diffTime); // 秒単位へ変換
msを秒(s)に変換したい場合は1000で割ります。さらに秒(s)を分(m)で求めたい場合は、追加で60で割ります。
使用例は次のとおりです。
package com.devkuma.basic.executetime;
public class ExecuteTime {
public static void main(String[] args) {
long beforeTime = System.currentTimeMillis(); // コード実行前に時間を取得
int sum = 0;
for (int i = 0; i < 100000; i++) {
for (int j = 0; j < 50000; j++) {
sum += i * j;
}
}
System.out.println(sum);
long afterTime = System.currentTimeMillis(); // コード実行後に時間を取得
long diffTimeSec = (afterTime - beforeTime) / 1000; // 2つの実行時間
System.out.println("실행 시간(sec): " + diffTimeSec); // 秒単位へ変換
}
}
実行結果:
실행 시간(sec) : 1
Instant
InstantはJava 8からjava.timeパッケージに追加されたクラスで、EPOCHから経過した時間をナノ秒単位で表します。
Instant beforeTime = Instant.now(); // コード実行前に時間を取得
// 測定したいコード...
Instant afterTime = Instant.now();
long diffTime = Duration.between(beforeTime, afterTime).toMillis(); // 2つの実行時間
System.out.println("실행 시간(ms): " + diffTime);
StopWatch - Spring
もう一つの方法は、Spring Frameworkに含まれているStopWatchを利用する方法です。
SpringのStopWatchを使用するには、まずGradleまたはMavenにdependencyを追加する必要があります。
gradle
implementation 'org.springframework:spring-core:6.0.7'
maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.0.7</version>
</dependency>
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 測定したいコード...
stopWatch.stop();
System.out.println("실행 시간(ms): " + stopWatch.getTotalTimeMillis());
System.out.println(stopWatch.prettyPrint());