【Java入門】処理時間をナノ秒・マイクロ秒で計測する方法

Javaには処理時間を計測するための「System.currentTimeMillisメソッド」と「System.nanoTimeメソッド」があります。

処理にどのくらい時間がかかるのかをミリ秒単位、ナノ秒単位で計測することができます。

この記事では、時間を計測する方法について、以下の内容で解説していきます!


・処理時間を計測する方法
・ミリ秒単位で処理時間を計測する方法
・マイクロ秒単位で処理時間を計測する方法
・ナノ秒単位で処理時間を計測する方法
・メソッドの処理速度を比較する方法

今回はこれらの方法を覚えるために、時間計測のさまざまな使い方をわかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

Javaで処理時間を計測するには?

Javaで処理時間を計測するには、処理を開始した時刻と終了した時刻を記録して、その差を求めることで計測します。

処理速度を計測することで、プログラムを実行するのにどのくらいの時間がかかるのかを調べたり、似たようなメソッドが用意されているときにどちらのメソッドを使った方が速いのかを比較することができます。

ミリ秒単位で処理時間を計測する方法(currentTimeMillis)

ミリ秒単位で処理時間を計測するには「System.currentTimeMillisメソッド」を使います。

「System.currentTimeMillisメソッド」の戻り値はlong型エポック秒から経過した時間を返します。

そのため、戻り値はlong型の変数に格納します。

ミリ秒単位で処理時間を計測する方法を次のプログラムで確認してみましょう。

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

        // 処理前の時刻を取得
        long startTime = System.currentTimeMillis();

        // 時間計測をしたい処理
        int result = 0;
        for (int i = 0; i < 1000000; i++) {
            result += 1;
        }

        // 処理後の時刻を取得
        long endTime = System.currentTimeMillis();

        System.out.println("開始時刻:" + startTime + " ms");
        System.out.println("終了時刻:" + endTime + " ms");
        System.out.println("処理時間:" + (endTime - startTime) + " ms");
    }
}

実行結果

開始時刻:1519706138082 ms
終了時刻:1519706138084 ms
処理時間:2 ms

このプログラムでは、初めに処理前の時刻を取得して、時間計測をしたい処理が終わった後の時刻から引いた差を処理時間として表示してきます。

このように「System.currentTimeMillisメソッド」を使うことで処理時間を計測することができました!

ナノ秒単位で処理時間を計測する方法(nanoTime)

ナノ秒単位で処理時間を計測するには「System.nanoTimeメソッド」を使います。

「System.nanoTimeメソッド」の戻り値はlong型プログラムを実行しているマシンの時間を返します。

「System.currentTimeMillisメソッド」のエポック秒のように基準となる時間があるわけではないので、現在の時間を調べることはできません。

ナノ秒単位で処理時間を計測する方法を次のプログラムで確認してみましょう。

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

        // 処理前の時刻を取得
        long startTime = System.nanoTime();

        // 時間計測をしたい処理
        int result = 0;
        for (int i = 0; i < 1000000; i++) {
            result += 1;
        }

        // 処理後の時刻を取得
        long endTime = System.nanoTime();

        System.out.println("開始時刻:" + startTime + " ナノ秒");
        System.out.println("終了時刻:" + endTime + " ナノ秒");
        System.out.println("処理時間:" + (endTime - startTime) + " ナノ秒");
    }
}

実行結果

開始時刻:273055141549347 ナノ秒
終了時刻:273055143207351 ナノ秒
処理時間:1658004 ナノ秒

このプログラムでは、初めに処理前の時刻を取得して、時間計測をしたい処理が終わった後の時刻から引いた差を処理時間として表示してきます。

このように「System.currentTimeMillisメソッド」を使うことで処理時間を計測することができました!

マイクロ秒単位で処理時間を計測する方法

マイクロ秒はナノ秒の1000倍なので、ナノ秒単位で処理時間を計測した後に1000で割ることで計測できます。

次のプログラムで確認してみましょう。

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

        // 処理前の時刻を取得
        long startTime = System.nanoTime();

        // 時間計測をしたい処理
        int result = 0;
        for (int i = 0; i < 1000000; i++) {
            result += 1;
        }

        // 処理後の時刻を取得
        long endTime = System.nanoTime();

        System.out.println("開始時刻:" + startTime + " ナノ秒");
        System.out.println("終了時刻:" + endTime + " ナノ秒");
        System.out.println("処理時間:" + ((endTime - startTime) / 1000) + " マイクロ秒");
    }
}

実行結果

開始時刻:274092960709977 ナノ秒
終了時刻:274092962681910 ナノ秒
処理時間:1971 マイクロ秒

メソッドの処理速度を比較する方法

ここでは実際にメソッドの処理速度を比較する方法を解説します。

Javaには似たようなメソッドがあるので、どちらを使えばいいのか悩むことがあります。

そんなときには処理速度を比較して速い方を選ぶといいでしょう!

次のプログラムでは、文字列を結合する「concatメソッド」「appendメソッド」の処理速度を比較しています。

public class Main {
    public static void main(String[] args) throws Exception {

        // 1. concat
        long start1 = System.nanoTime();
        String strcon = "";
        for (int val = 0; val < 100; val++) {
            strcon = strcon.concat("strcon : " + Integer.toString(val) + "n");
        }

        // concat終了時間
        long end1 = System.nanoTime();
        System.out.println("concat:" + (end1 - start1) / 1000000f + "ms");

        // 2. append
        long start2 = System.nanoTime();

        StringBuilder sb = new StringBuilder();
        for (int val = 0; val < 100; val++) {
            sb.append("sb : " + Integer.toString(val) + "n");
        }

        // append終了時間
        long end2 = System.nanoTime();
        System.out.println("append:" + (end2 - start2) / 1000000f + "ms");

    }
}

実行結果

concat:0.287305ms
append:0.091575ms

このプログラムでは、文字列を結合する「concatメソッド」と「appendメソッド」の処理速度を比較しています。

実行結果から、「appendメソッド」の方が処理速度が速いことがわかりました!

このようにメソッドの使い分けで悩んだときは処理速度で比較してみてください!

このプログラムで使用した文字列の結合については次の記事で詳しく解説しているので、興味のある方はぜひ確認してみてください。

日時(Dateクラス)の使い方

この記事では処理速度の時間計測の方法を解説しました。

日時やカレンダーを使う方法を知りたい場合は次の記事を参考にしてください。

まとめ

いかがでしたか?

今回はプログラムの処理にかかる時間計測の方法について解説しました。

ミリ秒単位や、ナノ秒単位など、必要に応じて精度変えて活用してください!

もし、処理時間を計測する方法を忘れてしまったらこの記事を確認してください!

この記事を書いた人

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
ntakeshi@sejuku.net

目次