ゆるゆるプログラミング

・ストップウォッチ その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 ストップウォッチクラスの作り方を解説

■関連コンテンツ

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

■新着情報

2019.06.14 円模様1 円の縦横整列模様の画像作成方法を紹介
2019.05.24 ニュートン法で平方根 その3 ニュートン法で平方根(メソッド化)
2019.05.23 ニュートン法で平方根 その2 ニュートン法で平方根(数値微分)
2019.05.22 ニュートン法 ニュートン法について
2019.05.22 ニュートン法で平方根 ニュートン法で平方根を計算

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

Topへ