시간 측정을 위한 메서드 로직
- 보통 시간을 측정하기 위해 System.currentTimeMills() 이나 System.nanoTime() 을 사용하여 측정하고자 하는 시간을 측정한다.
- 두 개의 차이점과 어떤 상황에 쓰는지 알아보자
System.currentTimeMills()
- 현재 시간과 UTC인 1970년 1월 1일 자정과의 차이로 밀리세컨드(1/1000 초) 값을 반환한다.
public class TimeMeasureMillis {
public static void main(String[] args) {
long start = System.currentTimeMillis(); // 시작 시각 (ms)
// 측정할 코드
for (int i = 0; i < 1_000_000; i++) {
Math.pow(i, 2);
}
long end = System.currentTimeMillis(); // 종료 시각 (ms)
System.out.println("실행 시간: " + (end - start) + "ms");
}
}
System.nanoTime()
- JDK 1.5 부터 추가되어 시간 측정을 위해 만들어진 메서드이다.
- 이 메서드는 현재 시간(시스템 시간)과 관계가 없다.
- 작동중인 JVM의 정밀한 시간 소스의 현재 값을 long 타입으로 나노세컨드(1/1000000000초)를 반환한다
- 따라서 절대적인 시간을 측정하거나 다른 JVM 서버간 시간 측정을 하지 않아야한다.
public class TimeMeasureNano {
public static void main(String[] args) {
long start = System.nanoTime(); // 시작 시각 (ns)
// 측정할 코드
for (int i = 0; i < 1_000_000; i++) {
Math.pow(i, 2);
}
long end = System.nanoTime(); // 종료 시각 (ns)
System.out.println("실행 시간: " + (end - start) / 1_000_000.0 + "ms");
}
}
두개의 성능 비교와 권장사항
- System.nanoTime() 의 성능이 훨 좋으며 표현할 수 있는 시간의 단위도 더 넓다.
- 하지만 nanoTime() 은 현재 시각과 같은 연산은 할 수 없다.(경과시간만 알 수 있음)
- 따라서 시간 측정 로직에는 nanoTime 을 사용하는 것을 권장한다.