자바로 스톱워치 만들기

Rupam Yadav 2023년10월12일
  1. System.nanoTime()을 사용하는 Java의 스톱워치
  2. Apache Commons Lang을 사용하는 Java의 스톱워치
  3. Instant를 사용하는 Java의 스톱워치
자바로 스톱워치 만들기

아래에서 볼 몇 가지 방법을 사용하여 Java에서 특정 작업의 경과 시간을 얻을 수 있습니다. 작업이 중요한 시간일 때 Java 스톱워치가 필요하며 피보나치 수열 계산과 같이 오래 실행되는 작업에 걸리는 시간을 알고 싶습니다.

System.nanoTime()을 사용하는 Java의 스톱워치

스톱워치 시간을 최대한 정확하게 유지하기 위해 시스템 타이머의 가장 정확한 값인 나노초 값을 반환하는 System.nanotTime() 클래스를 사용합니다.

프로그램에서 Stopwatch1Stopwatch라는 두 개의 클래스를 만듭니다. Stopwatch1 스톱워치를 시작 및 중지하는 두 가지 방법에서 start()System.nanoTime()을 사용하여 현재 나노초로 stopWatchStartTime을 초기화하고 stopWatchRunning 값을 설정합니다(스톱워치가 실행 중)을 true로 표시합니다.

stop()stopWatchStopTime을 초기화하고 stopWatchRunningfalse로 설정합니다. 그런 다음 네 가지 함수를 사용하여 총 경과 시간을 밀리초, 초, 분, 시간 단위로 계산할 수 있습니다. 각 메소드는 System.nanoTime()의 값에서 stopWatchStartTime을 뺀 값을 저장하는 elapsedTime이라는 로컬 변수를 가지고 있습니다. Stopwatch가 실행 중이고 실행 중이 아닌 경우 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 Commons Lang을 사용하는 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

Instant를 사용하는 Java의 스톱워치

‘Instant’는 ‘java.time’ 패키지의 일부입니다. 시스템 시계에서 현재 순간을 반환합니다. Instant.now()를 사용하는 두 개의 인스턴트 값은 먼저 Fibonacci() 실행 전이고 다른 하나는 실행 후입니다. 그런 다음 ’toMillis()‘와 같은 다른 시간 단위로 변환할 수 있는 ‘Duration’을 반환하는 ‘instatStarted’ 및 ‘instantStopped’ 값을 전달하는 ‘Duration.between()‘을 사용하여 두 값의 차이를 계산합니다. 밀리초, 초에는 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