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

2019/04/05 公開

・ストップウォッチ その1

ナノ秒単位で時間を測定できるストップウォッチのクラスを作成しました。

ここで紹介しているものは、開始メソッドと終了メソッドを呼び出して時間計測するクラスです。一時停止/再開メソッドはありません。

以下が、ストップウォッチクラスと、そのクラスを呼び出すJavaソースコードの例です。

StopWatch1.java ← クリックしてダウンロードページに移動
001:    // ストップウォッチクラスを作成
002:    class MyStopWatch1 {
003:    	// 開始時間に初期値-1を代入
004:    	private long ts = -1;
005:    
006:    	// 終了時間に初期値-1を代入
007:    	private long te = -1;
008:    
009:    	// 計測時間に初期値0を代入
010:    	private long tresult = 0;
011:    
012:    
013:    	// 開始メソッド
014:    	public void start()
015:    	{
016:    		// 計測時間に初期値0を代入
017:    		tresult = 0;
018:    
019:    		// 開始時間を代入
020:    		ts = System.nanoTime();
021:    	}
022:    	
023:    	// 停止メソッド
024:    	public void stop()
025:    	{
026:    		// start()が呼ばれているか?
027:    		if ( 0 > ts ) return;
028:    
029:    		// 終了時間を代入
030:    		te = System.nanoTime();
031:    
032:    		// 計測時間を代入
033:    		tresult = te - ts;
034:    	}
035:    
036:    	// クリアメソッド
037:    	public void clear()
038:    	{
039:    		// 開始終了時間に初期値-1を代入
040:    		ts = -1;
041:    		te = -1;
042:    
043:    		// 計測時間に初期値0を代入
044:    		tresult = 0;
045:    	}
046:    
047:    
048:    	// 計測時間をナノ秒で返す
049:    	public long nanotime()
050:    	{
051:    		return tresult;
052:    	}
053:    }
054:    
055:    
056:    // メイン
057:    public class StopWatch1 {
058:    	public static void main( String[] args ) {
059:    		// ストップウォッチクラスを作成
060:    		MyStopWatch1 sw = new MyStopWatch1();
061:    
062:    		// スタート
063:    		sw.start();
064:    
065:    		// 一定時間プログラムを停止
066:    		try {
067:    			// 1234ミリ秒を指定
068:    			Thread.sleep( 1234 );
069:    		}
070:    		catch( InterruptedException e )
071:        		{
072:    			return;
073:        		}
074:    
075:    		// ストップ
076:    		sw.stop();
077:    
078:    
079:    		// 時間計測結果を表示
080:    		// 計測時間をナノ秒で取得
081:    		long tnsec = sw.nanotime();
082:    
083:    		// 処理時間 ミリ秒
084:    		double tmsec = (double)tnsec / 1000000.0;
085:    
086:    		// 処理時間 秒
087:    		double tsec = tmsec / 1000.0;
088:    
089:    		System.out.println( "時間 : " + tnsec + "ナノ秒   "
090:    					+ tmsec + "ミリ秒   " + tsec + "秒" );
091:    	}
092:    }

StopWatch1.javaの出力結果

時間 : 1234013682ナノ秒   1234.013682ミリ秒   1.234013682秒

この結果から1234ミリ秒に近い値が出力されていることがわかります。これは、Thread.sleep( 1234 )でプログラムを一時停止している時間とほぼ同じです。

それでは、ここからストップウォッチのソースコードを解説していきます。

001:    // ストップウォッチクラスを作成
002:    class MyStopWatch1 {

クラス名を、StopWatch1としています。

003:    	// 開始時間に初期値-1を代入
004:    	private long ts = -1;
005:    
006:    	// 終了時間に初期値-1を代入
007:    	private long te = -1;
008:    
009:    	// 計測時間に初期値0を代入
010:    	private long tresult = 0;

メンバ変数を宣言しています。tsとteは、それぞれ時間計測の開始時間と終了時間を代入するlong型変数で、初期値はどちらも-1です。tresultは、計測結果を代入するlong型変数で、初期値は0です。

013:    	// 開始メソッド
014:    	public void start()
015:    	{
016:    		// 計測時間に初期値0を代入
017:    		tresult = 0;
018:    
019:    		// 開始時間を代入
020:    		ts = System.nanoTime();
021:    	}

start()は、開始メソッドでStartボタンを意味します。計測時間tresultに0を代入し、開始時間tsにシステムタイマーの値を代入しています。System.nanoTime()でナノ秒単位のシステムタイマーを取得することができます。

System.nanoTimeメソッド

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

  パラメータ なし

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

023:    	// 停止メソッド
024:    	public void stop()
025:    	{
026:    		// start()が呼ばれているか?
027:    		if ( 0 > ts ) return;
028:    
029:    		// 終了時間を代入
030:    		te = System.nanoTime();
031:    
032:    		// 計測時間を代入
033:    		tresult = te - ts;
034:    	}

stop()は、終了メソッドでStopボタンを意味します。開始時間tsが0未満であればstart()メソッドが呼ばれていないのでメソッドreturn文で抜けます。結果として計測時間tresultは0となります。開始時間tsが0以上の場合、終了時間teにシステムタイマーの値を代入し、計測時間tresultに( te - ts )を代入します。

036:    	// クリアメソッド
037:    	public void clear()
038:    	{
039:    		// 開始終了時間に初期値-1を代入
040:    		ts = -1;
041:    		te = -1;
042:    
043:    		// 計測時間に初期値0を代入
044:    		tresult = 0;
045:    	}

clear()は、クリアメソッドでResetボタンを意味します。開始時間tsと終了時間teに-1を代入し、計測結果tresultに0を代入しています。

048:    	// 計測時間をナノ秒で返す
049:    	public long nanotime()
050:    	{
051:    		return tresult;
052:    	}

nanotime()は、計測時間をナノ秒で返すメソッドです。計測結果tresultをlong型で返します。

056:    // メイン
057:    public class StopWatch1 {
058:    	public static void main( String[] args ) {
059:    		// ストップウォッチクラスを作成
060:    		MyStopWatch1 sw = new MyStopWatch1();
061:    
062:    		// スタート
063:    		sw.start();
064:    
065:    		// 一定時間プログラムを停止
066:    		try {
067:    			// 1234ミリ秒を指定
068:    			Thread.sleep( 1234 );
069:    		}
070:    		catch( InterruptedException e )
071:        		{
072:    			return;
073:        		}
074:    
075:    		// ストップ
076:    		sw.stop();
077:    
078:    
079:    		// 時間計測結果を表示
080:    		// 計測時間をナノ秒で取得
081:    		long tnsec = sw.nanotime();
082:    
083:    		// 処理時間 ミリ秒
084:    		double tmsec = (double)tnsec / 1000000.0;
085:    
086:    		// 処理時間 秒
087:    		double tsec = tmsec / 1000.0;
088:    
089:    		System.out.println( "時間 : " + tnsec + "ナノ秒   "
090:    					+ tmsec + "ミリ秒   " + tsec + "秒" );
091:    	}
092:    }

startメソッドとstopメソッドの間で、Thread.sleep( 1234 )を実行し、123ミリ秒(1.234秒)の間プログラムを停止しています。stopメソッドを呼んだ後、nanotimeメソッドで取得した値を表示しています。

■一時停止/再開ができるストップウォッチ

ストップウォッチ その2 ストップウォッチクラスの作り方を解説

■関連コンテンツ

時間計測 時間を計測する方法を解説

■新着情報

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

■広告

 

 

 

 

 

スッキリわかるJava入門第3版 [ 中山清喬 ]

価格:2,860円
(2021/6/18 14:32時点)
感想(6件)

 

 

 

 

Topへ