Java でストップウォッチを作る

Rupam Yadav 2023年10月12日
  1. System.nanoTime() を使用した Java のストップウォッチ
  2. Apache CommonsLang を使用した Java のストップウォッチ
  3. インスタントを使用した Java のストップウォッチ
Java でストップウォッチを作る

以下に示すいくつかの方法を使用して、Java で特定のタスクの経過時間を取得できます。タスクが時間的に重要であり、フィボナッチ数列の計算などの長時間実行されるタスクにかかる時間を知りたい場合は、Java ストップウォッチが必要です。

System.nanoTime() を使用した Java のストップウォッチ

ストップウォッチ時間をできるだけ正確に保ちたいので、そのために、システムタイマーの最も正確な値であるナノ秒値を返す System.nanotTime() クラスを使用します。

プログラムでは、Stopwatch1Stopwatch の 2つのクラスを作成します。ストップウォッチを開始および停止する Stopwatch1 の 2つのメソッドで、start()System.nanoTime() を使用して stopWatchStartTime を現在のナノ秒で初期化し、stopWatchRunning の値を設定します(ストップウォッチが実行中)true として。

stop()stopWatchStopTime を初期化し、stopWatchRunningfalse に設定します。次に、4つの関数を使用して、合計経過時間をミリ秒、秒、分、および時間で計算できます。各メソッドには elapsedTime というローカル変数があり、ストップウォッチが実行されていて実行されていない場合は、System.nanoTime() の値から stopWatchStartTime を引いた値を格納し、stopWatchStopTime - stopWatchStartTime を実行します。

ここで、すべての関数の elapsedTime の値はナノ秒単位であるため、elapsedTime を保持しているナノ秒で割ることにより、その値をさまざまな時間単位に変換します。

Stopwatch クラスでは、Stopwatch1 のオブジェクトを作成し、start() メソッドを呼び出します。次に、再帰メソッドを使用してフィボナッチ数列を計算するメソッドを呼び出し、最後に stop() 関数を呼び出します。start() 関数と stop() 関数の間の時間は、出力に表示される経過時間です。

import java.math.BigInteger;

class Stopwatch1 {
  private final long nanoSecondsPerMillisecond = 1000000;
  private final long nanoSecondsPerSecond = 1000000000;
  private final long nanoSecondsPerMinute = 60000000000L;
  private final long nanoSecondsPerHour = 3600000000000L;

  private long stopWatchStartTime = 0;
  private long stopWatchStopTime = 0;
  private boolean stopWatchRunning = false;

  public void start() {
    this.stopWatchStartTime = System.nanoTime();
    this.stopWatchRunning = true;
  }

  public void stop() {
    this.stopWatchStopTime = System.nanoTime();
    this.stopWatchRunning = false;
  }

  public long getElapsedMilliseconds() {
    long elapsedTime;

    if (stopWatchRunning)
      elapsedTime = (System.nanoTime() - stopWatchStartTime);
    else
      elapsedTime = (stopWatchStopTime - stopWatchStartTime);

    return elapsedTime / nanoSecondsPerMillisecond;
  }

  public long getElapsedSeconds() {
    long elapsedTime;

    if (stopWatchRunning)
      elapsedTime = (System.nanoTime() - stopWatchStartTime);
    else
      elapsedTime = (stopWatchStopTime - stopWatchStartTime);

    return elapsedTime / nanoSecondsPerSecond;
  }

  public long getElapsedMinutes() {
    long elapsedTime;
    if (stopWatchRunning)
      elapsedTime = (System.nanoTime() - stopWatchStartTime);
    else
      elapsedTime = (stopWatchStopTime - stopWatchStartTime);

    return elapsedTime / nanoSecondsPerMinute;
  }

  public long getElapsedHours() {
    long elapsedTime;
    if (stopWatchRunning)
      elapsedTime = (System.nanoTime() - stopWatchStartTime);
    else
      elapsedTime = (stopWatchStopTime - stopWatchStartTime);

    return elapsedTime / nanoSecondsPerHour;
  }
}

public class Stopwatch {
  public static void main(String[] args) {
    Stopwatch1 stopwatch1 = new Stopwatch1();
    stopwatch1.start();
    Fibonacci(45);
    stopwatch1.stop();

    System.out.println("Elapsed time in milliseconds: " + stopwatch1.getElapsedMilliseconds());

    System.out.println("Elapsed time in seconds: " + stopwatch1.getElapsedSeconds());

    System.out.println("Elapsed time in minutes: " + stopwatch1.getElapsedMinutes());

    System.out.println("Elapsed time in hours: " + stopwatch1.getElapsedHours());
  }

  private static BigInteger Fibonacci(int n) {
    if (n < 2)
      return BigInteger.ONE;
    else
      return Fibonacci(n - 1).add(Fibonacci(n - 2));
  }
}

出力:

Elapsed time in milliseconds: 31161
Elapsed time in seconds: 31
Elapsed time in minutes: 0
Elapsed time in hours: 0

Apache CommonsLang を使用した Java のストップウォッチ

この例では、Apache Commons ライブラリを使用します。以下は、それをプロジェクトに含めるための依存関係です。

 <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-lang3</artifactId>
     <version>3.11</version>
 </dependency>

ライブラリに付属する StopWatch クラス stopWatch のオブジェクトを作成してから、start() 関数を呼び出します。ストップウォッチを開始した後、Fibonacci() 関数を呼び出し、stop() を使用してウォッチを停止します。ここで、経過時間を取得するために、経過時間を返す stopWatch.getTime() を呼び出し、getTime() でさまざまな時間単位を渡すことができます。

import java.math.BigInteger;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang3.time.StopWatch;

public class Stopwatch {
  public static void main(String[] args) {
    StopWatch stopWatch = new StopWatch();

    stopWatch.start();
    Fibonacci(40);
    stopWatch.stop();

    System.out.println(
        "Get elapsed time in milliseconds: " + stopWatch.getTime(TimeUnit.MILLISECONDS));
    System.out.println("Get elapsed time in seconds: " + stopWatch.getTime(TimeUnit.SECONDS));
    System.out.println("Get elapsed time in minutes: " + stopWatch.getTime(TimeUnit.MINUTES));
    System.out.println("Get elapsed time in hours: " + stopWatch.getTime(TimeUnit.HOURS));
  }

  private static BigInteger Fibonacci(int n) {
    if (n < 2)
      return BigInteger.ONE;
    else
      return Fibonacci(n - 1).add(Fibonacci(n - 2));
  }
}

出力:

Get elapsed time in milliseconds: 3483
Get elapsed time in seconds: 3
Get elapsed time in minutes: 0
Get elapsed time in hours: 0

インスタントを使用した Java のストップウォッチ

Instantjava.time パッケージの一部です。システムクロックから現在の瞬間を返します。最初に Instant.now() を使用する 2つのインスタント値は、Fibonacci() の実行前と実行後です。次に、Duration.between() を使用して両方の値の差を計算します。ここで、instatStartedinstantStopped の値を渡して、toMillis() のような異なる時間単位に変換できる Duration を返します。ミリ秒、秒は toSeconds()、分は toMinutes() を使用します。

import java.math.BigInteger;
import java.time.Duration;
import java.time.Instant;

public class Stopwatch {
  public static void main(String[] args) {
    Instant instantStarted = Instant.now();
    Fibonacci(40);
    Instant instantStopped = Instant.now();

    Duration durationBetween = Duration.between(instantStarted, instantStopped);

    System.out.println("Get elapsed time in milliseconds: " + durationBetween.toMillis());
    System.out.println("Get elapsed time in seconds: " + durationBetween.toSeconds());
    System.out.println("Get elapsed time in minutes: " + durationBetween.toMinutes());
  }

  private static BigInteger Fibonacci(int n) {
    if (n < 2)
      return BigInteger.ONE;
    else
      return Fibonacci(n - 1).add(Fibonacci(n - 2));
  }
}

出力:

Get elapsed time in milliseconds: 3510
Get elapsed time in seconds: 3
Get elapsed time in minutes: 0
著者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn