Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 메소드 실행 시간을 측정하는 4가지 방법

일반적으로 경과 시간(elapsed time)이란 하나의 작업이 시작된 시점부터 종료된 시점까지 걸린 시간을 의미합니다. Java에서는 다양한 방법으로 특정 메소드의 실행 시간을 측정할 수 있으며, 상황에 따라 적합한 도구를 선택하는 것이 중요합니다.

Java에서 실행 시간을 측정하는 대표적인 방법

  • System.currentTimeMillis() — 현재 시간을 밀리초(1/1000초) 단위로 반환합니다. 측정하려는 메소드 실행 전과 후의 시간 값을 구한 뒤, 두 값의 차이를 계산하면 해당 메소드의 실행 시간을 알 수 있습니다.
  • System.nanoTime() — 현재 시간을 나노초(1/10억초) 단위로 반환합니다. 밀리초보다 훨씬 정밀한 측정이 필요할 때 유용하며, 역시 실행 전후의 시간 값 차이로 경과 시간을 구합니다.
  • Instant.now()와 Duration.between() — java.time 패키지의 Instant 클래스 now() 메소드로 현재 시각을 얻고, Duration.between() 메소드로 주어진 두 시점 사이의 차이를 계산합니다. 메소드 실행 전후의 시각을 구한 뒤 Duration.between()으로 경과 시간을 손쉽게 확인할 수 있습니다.
  • Apache Commons Lang의 StopWatch — Apache Commons 라이브러리에서 제공하는 StopWatch 클래스를 사용하면 start(), stop(), getTime() 메소드를 통해 별도의 시간 계산 없이 간편하게 메소드 실행 시간을 측정할 수 있습니다.

예제 코드

다음 예제는 위에서 소개한 네 가지 방법을 사용해 메소드의 실행 시간을 측정하는 과정을 보여줍니다.

import java.time.Duration;
import java.time.Instant;
import org.apache.commons.lang3.time.StopWatch;
public class Example {
   public void test(){
      int num = 0;
      for(int i=0; i<=50; i++){  
         num =num+i;
         System.out.print(num+", ");
      }  
   }
   public static void main(String args[]){
      Example obj = new Example();
      long start1 = System.nanoTime();
      obj.test();
      long end1 = System.nanoTime();      
      System.out.println("Elapsed Time in nano seconds: "+ (end1-start1));      
      long start2 = System.currentTimeMillis();
      obj.test();
      long end2 = System.currentTimeMillis();      
      System.out.println("Elapsed Time in milli seconds: "+ (end2-start2));
      Instant inst1 = Instant.now();
      obj.test();
      Instant inst2 = Instant.now();      
      System.out.println("Elapsed Time: "+ Duration.between(inst1, inst2).toString());
      StopWatch stopWatch = new StopWatch();
      stopWatch.start();
      obj.test();
      stopWatch.stop();      
      System.out.println("Elapsed Time in minutes: "+ stopWatch.getTime());
   }
}

실행 결과

0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, Elapsed Time in nano seconds: 1882300
0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, Elapsed Time in milli seconds: 1
0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, Elapsed Time: PT0.001S
0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210, 231, 253, 276, 300, 325, 351, 378, 406, 435, 465, 496, 528, 561, 595, 630, 666, 703, 741, 780, 820, 861, 903, 946, 990, 1035, 1081, 1128, 1176, 1225, 1275, Elapsed Time in minutes: 1

실행 결과에서 확인할 수 있듯이, 같은 메소드라도 측정 방식에 따라 결과가 나노초, 밀리초 등 서로 다른 단위로 출력됩니다. 짧은 연산의 정밀한 성능 분석에는 nanoTime(), 일반적인 시간 측정에는 currentTimeMillis() 또는 Instant/Duration, 그리고 코드의 가독성과 편의성을 중시한다면 StopWatch를 활용하는 것이 좋습니다.