Post

java 성능 시간 측정은 System.nanoTime()

성능 시간은 System.nanoTime()을 사용해야한다.(currentTimeMillis() x)

Java에서 nanoTime()과 currentTimeMillis()의 차이점

Java에서 시간을 다룰 때 흔히 사용하는 두 가지 메서드가 있습니다.

바로 System.nanoTime()System.currentTimeMillis()인데요, 이 둘은 모두 시간을 측정하는 데 사용되지만, 사용 목적과 동작 방식이 다릅니다.

System.currentTimeMillis()

  • 현재 시간을 Unix Epoch(1970-01-01 00:00:00 UTC) 기준으로 밀리초 단위로 반환
  • 시스템 시계(Clock)에서 값을 가져오기 때문에 OS 시간 변경(예: NTP 동기화, 수동 시간 변경)에 영향을 받을 수 있음
  • 네트워크나 데이터베이스에서 타임스탬프 기록 시 주로 사용
1
2
3
4
5
6
7
public class CurrentTimeMillisExample {
    public static void main(String[] args) {
        long timestamp = System.currentTimeMillis();
        // 현재 시간 (ms): 1708881234567
        System.out.println("현재 시간 (ms): " + timestamp);
    }
}

주의사항!

  • 시스템 시간이 조정되면 값이 급격히 변할 수 있음 (예: NTP 동기화, 수동 조정)
  • millis 단위로 반환되므로 정밀도가 낮음

System.nanoTime()

  • JVM 실행 이후의 경과 시간을 나노초(ns) 단위로 반환
  • OS 시간 변경 영향을 받지 않음 -> 상대적인 시간 측정에 적합
  • 성능 테스트, 코드 실행 시간 측정 등 정밀한 시간 측정이 필요한 경우 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
public class NanoTimeExample {
    public static void main(String[] args) {
        long startTime = System.nanoTime();

        // .. doSomething

        long endTime = System.nanoTime();
        long elapsedTime = endTime - startTime;

        // 실행 시간 (ns): 123456789
        System.out.println("실행 시간 (ns): " + elapsedTime);
    }
}

주의사항!

  • nanoTime()은 절대적인 시간 측정에는 부적합 -> Date나 Timestamp로 변환할 수 없음
  • JVM 내부에서 사용하는 고해상도 타이머를 기반으로 하므로, 다른 시스템 간 비교가 불가능함

결론

  • System.currentTimeMillis() -> 현재 시각을 얻을 때 사용 (OS 시간 변경 영향을 받음)
  • System.nanoTime() -> 정밀한 시간 측정(실행 시간 등) 시 사용 (OS 시간 변경 영향을 받지 않음)
This post is licensed under CC BY 4.0 by the author.