Java - 코드 실행 시간 측정

Java에서 코드 수행 시간을 측정하는 방법을 소개합니다.

  • System.currentTimeMillis() : 가장 간단한 실행 시간 측정 방법
  • System.nanoTime() : 정밀하게 실행 시간을 측정하는 방법
  • Instant.now() : Java8에서 도입된 클래스로 실행 시간 측정
  • StopWatch : Apache 라이브러리로 실행 시간 측정

1. System.currentTimeMillis() : 가장 간단한 실행 시간 측정 방법

currentTimeMillis()는 UTC 시간을 ms 단위로 리턴합니다. UTC는 1970년 1월 1일을 기준으로 현재의 시간을 측정한 것입니다.

다음과 같이 반복문의 수행시간을 측정할 수 있습니다. 시간 단위를 초로 변경하려면 1000으로 나누어야합니다.

public class PerformanceTime {

    public static void main(String[] args) {

        long startTime = System.currentTimeMillis();

        for (long i = 0; i < 1000000000; i++) {
            long a = i * i;
        }

        long finishTime = System.currentTimeMillis();
        long elapsedTime = finishTime - startTime;

        System.out.println("startTime(ms) : " + startTime);
        System.out.println("finishTime(ms) : " + finishTime);
        System.out.println("elapsedTime(ms) : " + elapsedTime);
    }
}

Output:

startTime(ms) : 1643599980239
finishTime(ms) : 1643599980559
elapsedTime(ms) : 320

2. System.nanoTime() : 정밀하게 실행 시간을 측정하는 방법

System.nanoTime()는 시스템(JVM) 시간을 nano second 단위로 리턴합니다. currentTimeMillis() 보다 더 정밀한 시간 측정이 필요하다면 nanoTime()를 사용하라고 합니다.

public class PerformanceTime2 {

    public static void main(String[] args) {

        long startTime = System.nanoTime();

        for (long i = 0; i < 1000000000; i++) {
            long a = i * i;
        }

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

        System.out.println("startTime(ns) : " + startTime);
        System.out.println("finishTime(ns) : " + finishTime);
        System.out.println("elapsedTime(ns) : " + elapsedTime);
    }
}

Output:

startTime(ns) : 7024993821201
finishTime(ns) : 7025312387342
elapsedTime(ns) : 318566141

Java doc을 보면 nanoTime()가 nano second 단위의 정확한 시간을 보장하진 않지만, currentTimeMillis()보다 더 정밀한 시간을 리턴하는 것은 보장한다는 것 같습니다.

3. Instant.now() : Java8에서 도입된 클래스로 실행 시간 측정

Instant는 Java8부터 도입된 클래스입니다. 아래와 같이 코드 실행 시간을 측정할 수 있습니다.

import java.time.Duration;
import java.time.Instant;

public class PerformanceTime3 {

    public static void main(String[] args) {

        Instant start = Instant.now();

        for (long i = 0; i < 1000000000; i++) {
            long a = i * i;
        }

        Instant finish = Instant.now();
        long elapsedTime = Duration.between(start, finish).toMillis();
        System.out.println("elapsedTime(ms) : " + elapsedTime);
    }
}

Output:

elapsedTime(ms) : 320

4. StopWatch : Apache 라이브러리로 실행 시간 측정

StopWatch는 Apache에서 제공하는 클래스입니다. 다음과 같이 코드 실행 시간을 측정할 수 있습니다.

import org.apache.commons.lang3.time.StopWatch;

public class PerformanceTime4 {

    public static void main(String[] args) {

        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        for (long i = 0; i < 1000000000; i++) {
            long a = i * i;
        }

        stopWatch.stop();
        System.out.println("startTime : " + stopWatch.getStartTime());
        System.out.println("elapsedTime(ms) : " + stopWatch.getTime());
        System.out.println("elapsedTime(ns) : " + stopWatch.getNanoTime());
    }
}

Output:

startTime : 1643600535260
elapsedTime(ms) : 376
elapsedTime(ns) : 376264647

References

Loading script...
codechachaCopyright ©2019 codechacha