자바로 스톱워치 만들기
아래에서 볼 몇 가지 방법을 사용하여 Java에서 특정 작업의 경과 시간을 얻을 수 있습니다. 작업이 중요한 시간일 때 Java 스톱워치가 필요하며 피보나치 수열 계산과 같이 오래 실행되는 작업에 걸리는 시간을 알고 싶습니다.
System.nanoTime()
을 사용하는 Java의 스톱워치
스톱워치 시간을 최대한 정확하게 유지하기 위해 시스템 타이머의 가장 정확한 값인 나노초 값을 반환하는 System.nanotTime()
클래스를 사용합니다.
프로그램에서 Stopwatch1
과 Stopwatch
라는 두 개의 클래스를 만듭니다. Stopwatch1
스톱워치를 시작 및 중지하는 두 가지 방법에서 start()
는 System.nanoTime()
을 사용하여 현재 나노초로 stopWatchStartTime
을 초기화하고 stopWatchRunning
값을 설정합니다(스톱워치가 실행 중)을 true
로 표시합니다.
stop()
은 stopWatchStopTime
을 초기화하고 stopWatchRunning
을 false
로 설정합니다. 그런 다음 네 가지 함수를 사용하여 총 경과 시간을 밀리초, 초, 분, 시간 단위로 계산할 수 있습니다. 각 메소드는 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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn