Javaでメソッドの実行時間を測定する4つの方法を徹底解説
一般に「経過時間」とは、ある処理やイベントの開始時点から終了時点までにかかった時間のことを指します。Javaでは、メソッドの実行にかかる時間を測定するための手段が複数用意されており、目的や必要な精度に応じて使い分けることができます。
本記事では、Javaでメソッドの実行時間を計測する代表的な4つの方法を、実際のコード例とともにわかりやすく解説します。
1. System.currentTimeMillis()メソッドを使う
currentTimeMillis()メソッドは、現在の時刻をミリ秒単位で返します。対象のメソッドを実行する前と後でそれぞれ時刻を取得し、その差分を求めることで、メソッドの実行にかかった時間を算出できます。
2. System.nanoTime()メソッドを使う
nanoTime()メソッドは、現在の時刻をナノ秒単位で返します。currentTimeMillis()と同様に、メソッド実行前後の時刻の差分から経過時間を求めます。ミリ秒では精度が足りない場合や、より高精度なパフォーマンス計測を行いたい場合に適した方法です。
3. InstantクラスとDurationクラスを使う
Date-Time APIのInstantクラスのnow()メソッドは現在時刻を返し、Duration.between()メソッドは指定した2つの時刻の差分を表すDurationオブジェクトを返します。メソッド実行前後でInstant.now()を呼び出して時刻を取得し、Duration.between()で差分を求めることで、経過時間を取得できます。
4. Apache CommonsのStopWatchクラスを使う
Apache Commons Langライブラリには、時間計測に特化したStopWatchクラスが用意されています。start()で計測開始、stop()で計測終了、getTime()で経過時間の取得といった直感的なメソッドが提供されており、シンプルなコードでメソッドの実行時間を測定できます。
サンプルコード
以下の例では、上記の4つの方法を使って、同じメソッドの実行時間をそれぞれ測定しています。
import java.time.Duration;
import java.time.Instant;
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[]){
Example obj = new Example();
long start1 = System.nanoTime();
obj.test();
long end1 = System.nanoTime();
System.out.println("Elapsed Time in nano seconds: "+ (end1-start1));
long start2 = System.currentTimeMillis();
obj.test();
long end2 = System.currentTimeMillis();
System.out.println("Elapsed Time in milli seconds: "+ (end2-start2));
Instant inst1 = Instant.now();
obj.test();
Instant inst2 = Instant.now();
System.out.println("Elapsed Time: "+ Duration.between(inst1, inst2).toString());
StopWatch stopWatch = new StopWatch();
stopWatch.start();
obj.test();
stopWatch.stop();
System.out.println("Elapsed Time in minutes: "+ stopWatch.getTime());
}
}実行結果
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 in nano seconds: 1882300 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 in milli seconds: 1 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: PT0.001S 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 in minutes: 1
まとめ:用途に応じた計測方法の選び方
- 手軽に大まかな時間を知りたい場合: System.currentTimeMillis()が最もシンプルです。
- 高精度な計測が必要な場合: System.nanoTime()を使用しましょう。ナノ秒単位での計測が可能です。
- モダンなDate-Time APIを使いたい場合: InstantとDurationの組み合わせが推奨されます。可読性が高く、ISO-8601形式での出力にも対応しています。
- 複数箇所の計測を管理したい場合: Apache CommonsのStopWatchが便利です。一時停止・再開などの機能も備えています。
パフォーマンスチューニングやボトルネックの特定において、正確な実行時間の計測は重要な第一歩です。それぞれの特徴を理解し、目的に合った方法を選択してください。
-
JavaのRMIでリモートメソッドを介してデータを送信する方法を徹底解説
RMI(Remote Method Invocation)とは?RMI(Remote Method Invocation、リモートメソッド呼び出し)とは、あるシステム(JVM)上に存在するオブジェクトが、別のJVM上で動作しているオブジェクトにアクセスしたり、そのメソッドを呼び出したりできるようにするJavaの仕組みです。RMIは分散アプリケーションを構築するための技術で、Javaプログラム同士のリモート通信を実現します。java.rmiパッケージとして標準提供されており、ネットワーク越しでもあたかもローカルのメソッドを呼び出すかのような感覚でコードを書けるのが大きな特徴です。本記事では、RM
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。