Java 코드의 실행 시간 구하기(시간 측정)
Java 코드의 실행 시간을 측정하는 3가지 방법에 대해서 알아본다.
개요
코딩을 하다 보면, 지연 시간이 발생하거나 어느 구간이 느린지 실행 시간을 구하고 싶은 경우가 발생한다. 또는 내가 작성한 알고리즘이나 로직의 속도를 구하고 싶은 경우도 있다.
그 밖에 여러 이유로 특정 구간의 코드 실행 시간을 알아야 할 때 사용할 수 있는 3가지 방법에 대해 알아보겠다.
System.currentTimeMillis()
Java에서 기본적으로 제공하는 System.currentTimeMillis() 메소드를 이용하면 현재 시간을 밀리세컨드 단위로 출력할 수 있다.
1970년 1월 1일 UTC 시간 기준으로 현재까지의 시간 차이를 밀리 세컨드 단위로 출력한 값이다.
이 메소드를 사용하여 시작 구간과 끝나는 구간에 각각 해당 함수를 써서 시간을 받아오고, 두 시간 간의 차이를 계산하면 ms 단위의 시간차를 구할 수 있다.
long beforeTime = System.currentTimeMillis(); // 코드 실행 전에 시간 받아오기
// 측정하려는 코드...
long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
long diffTime = afterTime - beforeTime; // 두 개의 실행 시간
System.out.println("실행 시간(ms): " + diffTime); // 세컨드(초 단위 변환)
ms를 초(s)로 변환하고 싶다면 1000으로 나누면 된다. 추가로 초(s)를 분(m)으로 구하고 싶다면 60으로 한 번 더 나누면 된다.
사용 예시는 아래와 같다.
package com.devkuma.basic.executetime;
public class ExecuteTime {
public static void main(String[] args) {
long beforeTime = System.currentTimeMillis(); // 코드 실행 전에 시간 받아오기
int sum = 0;
for (int i = 0; i < 100000; i++) {
for (int j = 0; j < 50000; j++) {
sum += i * j;
}
}
System.out.println(sum);
long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
long diffTimeSec = (afterTime - beforeTime) / 1000; // 두 개의 실행 시간
System.out.println("실행 시간(sec): " + diffTimeSec); // 세컨드(초 단위 변환)
}
}
실행 결과:
실행 시간(sec) : 1
Instant
Instant는 자바 8부터 java.time 패키지에 추가된 클래스로 EPOCH부터 경과된 시간을 나노초 단위로 표현한다.
Instant beforeTime = Instant.now(); // 코드 실행 전에 시간 받아오기
// 측정하려는 코드...
Instant afterTime = Instant.now();
long diffTime = Duration.between(beforeTime, afterTime).toMillis(); // 두 개의 실행 시간
System.out.println("실행 시간(ms): " + diffTime);
StopWatch - Spring
또 다른 방법은 Spring Framework에 포함되어 있는 StopWatch를 이용하는 방법이다.
Spring의 StopWatch를 사용하기 위해서는 dependency에 먼저 Gradle이나 Maven을 추가해 줘야 한다.
gradle
implementation 'org.springframework:spring-core:6.0.7'
maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.0.7</version>
</dependency>
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 측정하려는 코드...
stopWatch.stop();
System.out.println("실행 시간(ms): " + stopWatch.getTotalTimeMillis());
System.out.println(stopWatch.prettyPrint());