Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで経過時間を測定する4つの方法|currentTimeMillisからStopWatchまで徹底解説

経過時間(Elapsed Time)とは、ある処理やイベントの開始時点から終了時点までにかかった時間のことです。アプリケーションのパフォーマンスチューニングやボトルネックの特定において、処理時間を正確に測定することは非常に重要です。

Javaで経過時間を測定する方法はいくつかありますが、本記事では代表的な以下の4つの方法を、サンプルコードと実行結果付きで解説します。

  • System.currentTimeMillis()メソッドを使う方法
  • System.nanoTime()メソッドを使う方法
  • Instantクラス+Durationクラスを使う方法
  • Apache CommonsのStopWatchクラスを使う方法

1. currentTimeMillis()メソッドを使う方法

System.currentTimeMillis()メソッドは、UNIXエポック(1970年1月1日00:00:00 UTC)からの経過時間をミリ秒単位で返します。測定したいメソッドの実行前と実行後にこのメソッドを呼び出し、両者の差分を求めることで経過時間を取得できます。

サンプルコード

public class Example {
    public void test(){
        int num = 0;
        for(int i=0; i<=50; i++){
            num = num + i;
            System.out.print(num + ", ");
        }
    }
    public static void main(String args[]){
        // 開始時刻を取得
        long begin = System.currentTimeMillis();
        // 測定対象のメソッドを実行
        new Example().test();
        // 終了時刻を取得
        long end = System.currentTimeMillis();
        long time = end - begin;
        System.out.println();
        System.out.println("Elapsed Time: " + time + " milli seconds");
    }
}

実行結果

0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275,
Elapsed Time: 4 milli seconds

2. nanoTime()メソッドを使う方法

System.nanoTime()メソッドは、時刻をナノ秒単位という高精度で返します。こちらも実行前後の時刻値の差分を計算することで経過時間を求められます。currentTimeMillis()はシステムの壁時計に基づくため時刻変更の影響を受けますが、nanoTime()は任意の起点からの経過時間を表すため、時間間隔の測定により適しています。

サンプルコード

public class Example {
    public void test(){
        int num = 0;
        for(int i=0; i<=50; i++){
            num = num + i;
            System.out.print(num + ", ");
        }
    }
    public static void main(String args[]){
        // 開始時刻を取得
        long begin = System.nanoTime();
        // 測定対象のメソッドを実行
        new Example().test();
        // 終了時刻を取得
        long end = System.nanoTime();
        long time = end - begin;
        System.out.println();
        System.out.println("Elapsed Time: " + time);
    }
}

実行結果

0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275,
Elapsed Time: 1530200

3. Instantクラスを使う方法

Java 8で導入された日時API(java.timeパッケージ)を利用する方法です。Instantクラスのnow()メソッドで現在時刻を取得し、Duration.between()メソッドに開始時刻と終了時刻を渡すことで、2つの時刻の差分(期間)を取得できます。toMillis()を呼び出せば、結果をミリ秒単位のlong値として受け取ることも可能です。

サンプルコード

import java.time.Duration;
import java.time.Instant;

public class Example {
    public void test(){
        int num = 0;
        for(int i=0; i<=50; i++){
            num = num + i;
            System.out.print(num + ", ");
        }
    }
    public static void main(String args[]) {
        // 開始時刻を取得
        Instant start = Instant.now();
        new Example().test();
        // 終了時刻を取得
        Instant end = Instant.now();
        long time = Duration.between(start, end).toMillis();
        System.out.println();
        System.out.println(time + " Milli seconds");
    }
}

実行結果

0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275,
3 Milli seconds

4. StopWatchクラスを使う方法

Apache Commons Langライブラリが提供するStopWatchクラスを使うと、実際のストップウォッチのように直感的に時間を計測できます。start()メソッドで計測を開始し、stop()メソッドで停止、getTime()メソッドで経過時間を取得します。

Mavenプロジェクトで利用する場合は、pom.xmlに以下の依存関係を追加してください。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>

サンプルコード

import org.apache.commons.lang3.time.StopWatch;

public class Example {
    public void test(){
        int num = 0;
        for(int i=0; i<=50; i++){
            num = num + i;
            System.out.print(num + ", ");
        }
    }
    public static void main(String args[]) {
        // StopWatchクラスのインスタンスを生成
        StopWatch obj = new StopWatch();
        // 計測開始
        obj.start();
        new Example().test();
        // 計測終了
        obj.stop();
        System.out.println();
        System.out.println("Elapsed Time: " + obj.getTime() + " milli seconds");
    }
}

実行結果

0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275,
Elapsed Time: 1 milli seconds

まとめ:目的に応じた使い分け

それぞれの方法には特徴があるため、用途に応じて使い分けるのがおすすめです。

  • 手軽におおよその時間を測りたい場合:System.currentTimeMillis()
  • 短い処理を高精度に測定したい場合:System.nanoTime()
  • モダンな日時APIで統一的に扱いたい場合:Instant+Duration
  • 可読性を重視したい場合や、一時停止・再開など柔軟な制御が必要な場合:StopWatch

なお、これらの方法は簡易的な計測に向いています。より厳密なパフォーマンス分析を行いたい場合は、JMH(Java Microbenchmark Harness)などのベンチマークツールの利用も検討するとよいでしょう。

  1. 【Python入門】プログラムの実行時間(経過時間)を測定する方法

    プログラムの実行中に経過した時間を測定するには、timeモジュールの関数を利用します。かつてはtime.clock()やtime.time()がよく使われていましたが、clock()はPython 3.8以降で非推奨となり削除されているため、現在は高精度なtime.perf_counter()の使用が推奨されています。 perf_counter() を使った経過時間の測定 まずは基本となるシンプルな計測方法を見てみましょう。 import time t0 = time.perf_counter() print(Hello) t1 = time.perf_counter() - t0 pr

  2. Pythonで高精度に時間を測定する方法とは?time.clock()とtime.time()の使い方

    Pythonで高精度に時間を測定したい場合、time.clock() または time.time() 関数を使用します。特にベンチマーク(処理速度の計測)を目的とする場合は、公式ドキュメントでも time.clock() の使用が推奨されていました。基本的な使用例以下は、処理にかかった時間を計測するシンプルなコード例です。import time t0 = time.clock() print(Hello) t1 = time.clock() - t0 print(Time elapsed: , t1) # 経過したCPU秒(浮動小数点数)実行結果このコードを実行すると、次のような出力が得られ