Javaプログラミング学習サイト ゆるゆるプログラミング

2015/12/16 公開

・時間計測

プログラムの中で時間を計測する方法を紹介します。

時間計測は、主に作成したプログラム処理の速度の確認に使用します。

プログラムの速度は、動作環境(OS,CPU,メモリ,HDDなど)・データ構造・アルゴリズムなどによって変わります。プログラムの中に時間計測を埋め込むことで、どの処理にどれくらいの時間はかかっているかを調べることができるので、改善するべき処理を見つけ易くなります。

時間の計測方法は、処理を開始した時刻と処理を終了した時刻との差で求めます。時刻を取得するメソッドにはcurrentTimeMillisがあります。これは現在の時刻をミリ秒単位で取得できるもので、この時刻の差を計算することでミリ秒単位の処理時間の計測が行えます。

System.currentTimeMillisメソッド

public static long currentTimeMillis()
■現在時刻をミリ秒単位で返します。

  パラメータ なし

  戻り値     エポック※からのミリ秒を返します。
             ※1970年1月1日午前0時0分0秒(世界標準時)

さらに短い処理時間を計測したい場合は、システムのタイマーを取得するnanoTimeというものがあります。これはナノ秒単位(1億分の1秒)で値を取得できるもので、この値の差を計算することでナノ秒単位の処理時間の計測が行えます。

System.nanoTimeメソッド

public static long nanoTime()
■システムタイマーの値をナノ秒単位で返します。

  パラメータ なし

  戻り値     システムタイマーの現在の値をナノ秒単位で返します。

以下は、それぞれのメソッド使ったソースコードです。参考にしてください。

ミリ秒単位で処理時間を計測する例です。このプロプログラムでは、for文を使ってdouble型変数totalと、int型変数idouble型型キャストした値の足し算を100000000回行っています。for文の前で開始時刻ts、for文を抜けた後で終了時刻teを取得し、その差を処理時間tmsecに代入しています。

TimeMeasurement1.java ← クリックしてダウンロードページに移動
001:    public class TimeMeasurement1 {
002:    	public static void main( String[] args ) {
003:    		// 開始時間をミリ秒で取得
004:    		long ts = System.currentTimeMillis();
005:    
006:    		// 時間のかかる処理(サンプル)
007:    		double total = 0.0;
008:    		for ( long i = 1; i <= 100000000; ++ i ) {
009:    			total += (double)i;
010:    		}
011:    
012:    		// 終了時間をミリ秒で取得
013:    		long te = System.currentTimeMillis();
014:    
015:    		// 処理時間 ミリ秒
016:    		long tmsec = te - ts;
017:    
018:    		// 処理時間 秒
019:    		double tsec = (double)tmsec / 1000.0;
020:    
021:    		System.out.println( "処理時間 : " + tmsec + "ミリ秒   " + tsec + "秒" );
022:    	}
023:    }

TimeMeasurement1.javaの出力結果

処理時間 : 1181ミリ秒   1.181秒

ナノ秒単位で処理時間を計測する例です。このプロプログラムでも、TimeMeasurement1.javaと同様にfor文を使って100000000回の足し算を行っています。

TimeMeasurement2.java ← クリックしてダウンロードページに移動
001:    public class TimeMeasurement2 {
002:    	public static void main( String[] args ) {
003:    		// 開始時間をナノ秒で取得
004:    		long ts = System.nanoTime();
005:    
006:    		// 時間のかかる処理(サンプル)
007:    		double total = 0.0;
008:    		for ( long i = 1; i <= 100000000; ++ i ) {
009:    			total += (double)i;
010:    		}
011:    
012:    		// 終了時間をナノ秒で取得
013:    		long te = System.nanoTime();
014:    
015:    		// 処理時間 ナノ秒
016:    		long tnsec = te - ts;
017:    
018:    		// 処理時間 ミリ秒
019:    		double tmsec = (double)tnsec / 1000000.0;
020:    
021:    		// 処理時間 秒
022:    		double tsec = tmsec / 1000.0;
023:    
024:    		System.out.println( "処理時間 : " + tnsec + "ナノ秒   "
025:    						  + tmsec + "ミリ秒   " + tsec + "秒" );
026:    	}
027:    }

TimeMeasurement2.javaの出力結果

処理時間 : 1171189711ナノ秒   1171.189711ミリ秒   1.171189711秒

■新着情報

2022.07.07 外部プログラムの実行 exeファイル実行
2022.07.06 完全数 6=1+2+3

■広告

Topへ