スライドショー

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

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

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

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


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

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

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メソッド」の方が処理速度が速いことがわかりました!

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

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

【Java入門】Stringの結合方法(concat)
更新日 : 2019年1月18日

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

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

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

【Java】Dateクラスで日付を扱う方法を5つのパターン別に解説
更新日 : 2019年10月14日

まとめ

いかがでしたか?

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

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

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

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

中沢 丈

中沢 丈

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

連絡先はこちらです。
[email protected]