Erstellen einer Stoppuhr in Java

Rupam Yadav 12 Oktober 2023
  1. Stoppuhr in Java mit System.nanoTime()
  2. Stoppuhr in Java mit Apache Commons Lang
  3. Stoppuhr in Java mit Instant
Erstellen einer Stoppuhr in Java

Wir können die verstrichene Zeit einer bestimmten Aufgabe in Java mit verschiedenen Methoden abrufen, die wir unten sehen werden. Eine Java-Stoppuhr wird benötigt, wenn die Aufgabe zeitkritisch ist und wir die Zeit wissen möchten, die eine lang andauernde Aufgabe wie die Berechnung einer Fibonacci-Reihe benötigt.

Stoppuhr in Java mit System.nanoTime()

Wir möchten die Stoppuhrzeit so genau wie möglich halten und verwenden dazu die Klasse System.nanotTime(), die den Nanosekundenwert zurückgibt, der der genaueste Wert des Systemtimers ist.

Im Programm erstellen wir zwei Klassen, Stopwatch1 und Stopwatch. In den beiden Methoden Stopwatch1 zum Starten und Stoppen der Stoppuhr initialisiert start() die stopWatchStartTime mit den aktuellen Nanosekunden mittels System.nanoTime() und setzt den Wert von stopWatchRunning (überprüft, ob die Stoppuhr läuft) als true.

stop() initialisiert die stopWatchStopTime und setzt stopWatchRunning auf false. Dann können wir vier Funktionen verwenden, um die gesamte verstrichene Zeit in Millisekunden, Sekunden, Minuten und Stunden zu berechnen. Jede Methode hat eine lokale Variable namens elapsedTime, die den Wert speichert, der dem Wert von System.nanoTime() entspricht, subtrahiert von stopWatchStartTime, wenn die Stoppuhr läuft und nicht läuft, dann tun wir stopWatchStopTime - stopWatchStartTime.

Da der Wert von elapsedTime in jeder Funktion in Nanosekunden angegeben ist, wandeln wir seinen Wert in verschiedene Zeiteinheiten um, indem wir elapsedTime durch die darin enthaltenen Nanosekunden dividieren.

In der Klasse Stopwatch erstellen wir ein Objekt von Stopwatch1 und rufen die Methode start() auf. Dann rufen wir die Methode auf, die die Fibonacci-Reihe mit der Rekursionsmethode berechnet, und schließlich rufen wir die Funktion stop() auf. Die Zeit zwischen den Funktionen start() und stop() ist die verstrichene Zeit, die in der Ausgabe angezeigt wird.

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));
  }
}

Ausgabe:

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

Stoppuhr in Java mit Apache Commons Lang

Für dieses Beispiel verwenden wir die Apache Commons-Bibliothek. Unten ist die Abhängigkeit, um es in unser Projekt aufzunehmen.

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

Wir erstellen ein Objekt der StopWatch-Klasse stopWatch, das mit der Bibliothek geliefert wird, und rufen dann die Funktion start() auf. Nach dem Start der Stoppuhr rufen wir die Funktion Fibonacci() auf und stoppen dann die Uhr mit stop(). Um nun die verstrichene Zeit zu erhalten, rufen wir stopWatch.getTime() auf, das die verstrichene Zeit zurückgibt und in getTime() können wir verschiedene Zeiteinheiten übergeben.

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));
  }
}

Ausgabe:

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

Stoppuhr in Java mit Instant

Instant ist Teil des java.time-Pakets. Es gibt den aktuellen Zeitpunkt aus der Systemuhr zurück. Wir zwei Instant-Werte, die Instant.now() verwenden, sind zuerst vor der Ausführung von Fibonacci() und einer nach der Ausführung. Dann berechnen wir die Differenz zwischen den beiden Werten mit Duration.between(), wobei wir die Werte instatStarted und instantStopped übergeben, die eine Duration zurückgeben, die wir in verschiedene Zeiteinheiten wie toMillis() umwandeln können Millisekunden, toSeconds() für Sekunden und für Minuten verwenden wir 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));
  }
}

Ausgabe:

Get elapsed time in milliseconds: 3510
Get elapsed time in seconds: 3
Get elapsed time in minutes: 0
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