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クラス)の使い方
この記事では処理速度の時間計測の方法を解説しました。
日時やカレンダーを使う方法を知りたい場合は次の記事を参考にしてください。
まとめ
いかがでしたか?
今回はプログラムの処理にかかる時間計測の方法について解説しました。
ミリ秒単位や、ナノ秒単位など、必要に応じて精度変えて活用してください!
もし、処理時間を計測する方法を忘れてしまったらこの記事を確認してください!