티스토리 뷰

반응형

Java에서 함수의 실행 시간을 측정하는 가장 보편적이고 정확한 방법은 System.currentTimeMillis() 또는 System.nanoTime()을 사용하는 것입니다. 밀리초(ms) 단위 측정이 목적이라면 currentTimeMillis()를 사용하면 됩니다.

실무에서 바로 활용하실 수 있도록 기본적인 방법부터 가독성을 높인 방법까지 단계별로 설명해 드릴게요.


1. 가장 기본적인 측정 방식

함수의 시작 직전과 종료 직후에 시간을 기록하여 그 차이를 계산하는 방식입니다.

Java
 
public class ExecutionTimeExample {
    public static void main(String[] args) {
        // 1. 시작 시간 기록 (밀리초 단위)
        long startTime = System.currentTimeMillis();

        // 2. 실행할 함수 호출
        performTask();

        // 3. 종료 시간 기록
        long endTime = System.currentTimeMillis();

        // 4. 차이 계산 (종료 시간 - 시작 시간)
        long duration = endTime - startTime;

        System.out.println("함수 실행 시간: " + duration + " ms");
    }

    public static void performTask() {
        try {
            // 예시를 위해 1.5초간 대기 (실제 로직이 들어가는 부분)
            Thread.sleep(1500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2. 정밀도가 필요한 경우 (nanoTime 활용)

밀리초 단위는 매우 빠르게 끝나는 함수(예: 단순 산술 연산)를 측정할 때 0ms로 나올 수 있습니다. 이때는 나노초 단위로 측정 후 밀리초로 변환하는 것이 더 정확합니다.

Tip: $1 \text{ ms} = 1,000,000 \text{ ns}$

Java
 
public void measuredTask() {
    long start = System.nanoTime();

    // 로직 실행
    doSomething();

    long end = System.nanoTime();
    
    // 나노초를 밀리초로 변환 (소수점까지 확인 가능)
    double executionTime = (end - start) / 1_000_000.0;
    System.out.printf("정밀 실행 시간: %.3f ms%n", executionTime);
}

3. Spring Framework를 사용 중이라면? (StopWatch)

만약 프로젝트 환경이 Spring이라면 StopWatch 클래스를 사용하여 훨씬 깔끔하고 구조적으로 측정할 수 있습니다. 여러 구간의 시간을 측정할 때 특히 유용합니다.

Java
 
import org.springframework.util.StopWatch;

public void springStopWatchExample() {
    StopWatch stopWatch = new StopWatch("성능 테스트");

    stopWatch.start("데이터 로딩");
    // 로딩 로직...
    stopWatch.stop();

    stopWatch.start("데이터 처리");
    // 처리 로직...
    stopWatch.stop();

    // 결과 요약 출력
    System.out.println(stopWatch.prettyPrint());
    System.out.println("총 소요 시간: " + stopWatch.getTotalTimeMillis() + "ms");
}

요약 및 주의사항

  • currentTimeMillis vs nanoTime:
    • currentTimeMillis()는 시스템의 현재 시각(Wall-clock time)을 기준으로 하므로, 실행 중에 시스템 시간이 변경되면 오차가 발생할 수 있습니다.
    • 순수 실행 시간 측정이 목적이라면 시스템 시각과 무관하게 흐른 시간만 계산하는 System.nanoTime() 사용을 권장합니다.
  • Warm-up: Java는 JVM의 JIT 컴파일러 특성상 함수가 처음 실행될 때보다 여러 번 반복 실행된 후의 속도가 더 빠릅니다. 정확한 벤치마킹을 원하신다면 함수를 여러 번 미리 실행(Warm-up)한 뒤 측정하는 것이 좋습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함
반응형