2019.04.05
ストップウォッチ その1
ストップウォッチのクラス
ナノ秒単位で時間を測定できるストップウォッチのクラスを作成しました。
StopWatch1.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092
// ストップウォッチクラスを作成 class MyStopWatch1 { // 開始時間に初期値-1を代入 private long ts = -1; // 終了時間に初期値-1を代入 private long te = -1; // 計測時間に初期値0を代入 private long tresult = 0; // 開始メソッド public void start() { // 計測時間に初期値0を代入 tresult = 0; // 開始時間を代入 ts = System.nanoTime(); } // 停止メソッド public void stop() { // start()が呼ばれているか? if ( 0 > ts ) return; // 終了時間を代入 te = System.nanoTime(); // 計測時間を代入 tresult = te - ts; } // クリアメソッド public void clear() { // 開始終了時間に初期値-1を代入 ts = -1; te = -1; // 計測時間に初期値0を代入 tresult = 0; } // 計測時間をナノ秒で返す public long nanotime() { return tresult; } } // メイン public class StopWatch1 { public static void main( String[] args ) { // ストップウォッチクラスを作成 MyStopWatch1 sw = new MyStopWatch1(); // スタート sw.start(); // 一定時間プログラムを停止 try { // 1234ミリ秒を指定 Thread.sleep( 1234 ); } catch( InterruptedException e ) { return; } // ストップ sw.stop(); // 時間計測結果を表示 // 計測時間をナノ秒で取得 long tnsec = sw.nanotime(); // 処理時間 ミリ秒 double tmsec = (double)tnsec / 1000000.0; // 処理時間 秒 double tsec = tmsec / 1000.0; System.out.println( "時間 : " + tnsec + "ナノ秒 " + tmsec + "ミリ秒 " + tsec + "秒" ); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis StopWatch1.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac StopWatch1.java
実行
C:\talavax\javasample>java StopWatch1
実行結果
時間 : 1234013682ナノ秒 1234.013682ミリ秒 1.234013682秒
この結果から1234ミリ秒に近い値が出力されていることがわかります。これは、Thread.sleep( 1234 )でプログラムを一時停止している時間とほぼ同じです。
Javaソースコードの解説
それでは、ここからストップウォッチのソースコードを解説していきます。
001 002
// ストップウォッチクラスを作成 class MyStopWatch1 {
クラス名を、StopWatch1としています。
003 004 005 006 007 008 009 010
// 開始時間に初期値-1を代入 private long ts = -1; // 終了時間に初期値-1を代入 private long te = -1; // 計測時間に初期値0を代入 private long tresult = 0;
メンバ変数を宣言しています。tsとteは、それぞれ時間計測の開始時間と終了時間を代入するlong型の変数で、初期値はどちらも-1です。tresultは、計測結果を代入するlong型の変数で、初期値は0です。
013 014 015 016 017 018 019 020 021
// 開始メソッド public void start() { // 計測時間に初期値0を代入 tresult = 0; // 開始時間を代入 ts = System.nanoTime(); }
start()は、開始メソッドでStartボタンを意味します。計測時間tresultに0を代入し、開始時間tsにシステムタイマーの値を代入しています。System.nanoTime()でナノ秒単位のシステムタイマーを取得することができます。
System.nanoTimeメソッド
public static long nanoTime()
・システムタイマーの値をナノ秒単位で返します。 パラメータ なし 戻り値 システムタイマーの現在の値をナノ秒単位で返します。
023 024 025 026 027 028 029 030 031 032 033 034
// 停止メソッド public void stop() { // start()が呼ばれているか? if ( 0 > ts ) return; // 終了時間を代入 te = System.nanoTime(); // 計測時間を代入 tresult = te - ts; }
stop()は、終了メソッドでStopボタンを意味します。開始時間tsが0未満であればstart()メソッドが呼ばれていないのでメソッドをreturn文で抜けます。結果として計測時間tresultは0となります。開始時間tsが0以上の場合、終了時間teにシステムタイマーの値を代入し、計測時間tresultに( te - ts )を代入します。
036 037 038 039 040 041 042 043 044 045
// クリアメソッド public void clear() { // 開始終了時間に初期値-1を代入 ts = -1; te = -1; // 計測時間に初期値0を代入 tresult = 0; }
clear()は、クリアメソッドでResetボタンを意味します。開始時間tsと終了時間teに-1を代入し、計測結果tresultに0を代入しています。
048 049 050 051 052
// 計測時間をナノ秒で返す public long nanotime() { return tresult; }
056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092
// メイン public class StopWatch1 { public static void main( String[] args ) { // ストップウォッチクラスを作成 MyStopWatch1 sw = new MyStopWatch1(); // スタート sw.start(); // 一定時間プログラムを停止 try { // 1234ミリ秒を指定 Thread.sleep( 1234 ); } catch( InterruptedException e ) { return; } // ストップ sw.stop(); // 時間計測結果を表示 // 計測時間をナノ秒で取得 long tnsec = sw.nanotime(); // 処理時間 ミリ秒 double tmsec = (double)tnsec / 1000000.0; // 処理時間 秒 double tsec = tmsec / 1000.0; System.out.println( "時間 : " + tnsec + "ナノ秒 " + tmsec + "ミリ秒 " + tsec + "秒" ); } }
startメソッドとstopメソッドの間で、Thread.sleep( 1234 )を実行し、123ミリ秒(1.234秒)の間プログラムを停止しています。stopメソッドを呼んだ後、nanotimeメソッドで取得した値を表示しています。
以上です。