Java StopWatch 실행 시간 측정 방법 3가지

Apache Commons Java StopWatch 로고

Apache Stopwatch는?

Java StopWatch중 하나인, Apache StopWatch를 알아보고자한다. Apache StopWatch는 Java Apache Commons라이브러리의 일부로, Java 프로젝트에서 시간을 측정하고 기록하는 데 사용되는 유용한 도구입니다. 저 같은 경우에는 System.currentTimeMillis()로 주로 사용했으나, StopWatch의 다양한 기능이 마음에 들어서 사용을 시작했다. Apache Stopwatch의 세팅법과 사용법을 간략히 나누고자 한다.

설치 : 종속성(Dependecy) 추가

StopWatch를 사용하기 위해서는 먼저 Apache Commons 라이브러리를 프로젝트에 추가해야 합니다. Maven을 사용하는 경우 pom.xml에 다음과 같이 종속성(dependency)을 추가해야한다.

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

Gradle을 사용하는 경우에는 build.gradle에 아래와 같이 추가한다.

implementation 'org.apache.commons:commons-lang3:3.12.0'

StopWatch 에서 사용가능한 메소드

  • start(): 타이머를 시작합니다. 태스크 또는 메소드의 시작과 같이 타이밍을 시작해야 하는 경우 이 메소드를 호출하십시오.
  • stop(): 타이머를 중지합니다. 작업 또는 메소드의 끝과 같이 타이밍을 종료해야 하는 경우 이 메소드를 호출합니다.
  • reset(): 타이머를 재설정합니다. 타이머의 시간을 0으로 재 설정합니다. 다시 시간을 재야 하는 경우 이 메소드를 호출할 수 있습니다.
  • split(): 시간을 분할하여 기록합니다. 작업 또는 메소드의 여러 단계에서 이 메소드를 호출하면 각 단계의 실행 시간을 기록할 수 있습니다.
  • unsplit(): 마지막 분할한 시간을 취소합니다. 특정 단계에서 split() 메서드를 호출했지만 나중에 이 단계에서 실행 시간을 계산할 필요가 없는 것으로 확인되면 이 메소드를 호출하여 취소할 수 있습니다.
  • suspend(): 타이머를 일시 중지합니다. 인터럽트를 처리하거나 대기하는 동안과 같이 타이밍을 일시 중지해야 하는 경우 이 메서드를 호출할 수 있습니다.
  • resume(): 타이머를 다시 시작합니다. 타이머가 계속해서 시간을 계산할 수 있도록 일시 중지 후 시간을 계속 측정해야 하는 경우 이 메소드를 호출합니다.
  • getTime(): 총 경과 시간을 밀리초 단위로 가져옵니다. 타이밍 시작부터 getTime() 메서드가 호출될 때까지의 경과 시간을 나타냅니다.

    공식 Docs 링크

실제 사용 방법

StopWatch를 사용하기 위해 StopWatch 클래스를 import하고, 인스턴스를 생성합니다. StopWatch를 사용하는 일반적인 순서는 아래와 같습니다

기본 측정 방법

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

public class DevJStopWatchExample {
    public static void main(String[] args) {
        // 1. Stopwatch 인스턴스 생성
        Stopwatch stopWatch = Stopwatch.createStarted();
        //     아래가 일반적인 방법인데, 생성과 동시에 실행하는경우가 많을테니 createdStarted로 예시를 들었다.
        //     StopWatch stopWatch = new StopWatch();
        //     stopWatch.start();

        // 2. 시간을 측정하고자 하는 코드 작성

        // 3. 시간 측정 종료 및 출력
        stopWatch.stop();
        System.out.println("경과 시간: " + stopWatch.toString());
    }
}

일시 중지 방법

public class DevJStopWatchExample {
    public static void main(String[] args) throws InterruptedException {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();


        Thread.sleep(3000);  // 3초를 시간을 보낸다

        stopWatch.suspend(); // 스톱 워치를 일시 중지 시킨다

        Thread.sleep(2000);

        stopWatch.resume(); // 스톱워치를 재 실행한다

        Thread.sleep(2000);

        stopWatch.stop();
        log.info("실행시간:{} ms",stopWatch.getTime());
        log.info("실행시간:{} 초",stopWatch.getTime(TimeUnit.SECONDS));
    }
}
// 결과 예시
실행시간 : 5019 ms
실행시간 : 5 초

시간 분할 측정방법

public class DevJStopWatchExample {
    public static void main(String[] args) throws InterruptedException {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();


        Thread.sleep(2000);  // 2초를 시간을 보낸다

        stopWatch.split();   // 시간을 분할 한다.
        log.info("실행시간:{} ms",stopWatch.getTime()); //20XXms 표시

        Thread.sleep(1000);
        stopWatch.split();   // 시간을 분할 한다.
        log.info("실행시간:{} ms",stopWatch.getTime()); //30XXms 표시


        Thread.sleep(3000);
        stopWatch.stop();
        log.info("실행시간:{} ms",stopWatch.getTime()); // 60XXms 표시
    }
}
// 결과 예시
실행시간 : 2019 ms
실행시간 : 3022 ms
실행시간 : 6025 ms

Java StopWatch VS System.currentTimeMillis() 분석

  • 정확도: StopWatch는 더 높은 정확도를 제공합니다. currentTimeMillis() 는 아주 간단하고, 대략적인 시간 측정 방법이지만 밀리초(Millis) 수준 미만의 시간 정밀도를 제공할 수 없습니다. StopWatch는 더 작은 시간 간격을 측정 및 기록하고 더 정확한 시간 소모 정보를 제공할 수 있는 더 정확한 타이밍 메커니즘을 사용합니다.
  • 가독성: StopWatch는 보다 친숙하고 시간 소모적인 정보를 제공합니다. 현재 밀리초의 차이는 종종 직관적으로 이해하기 어려운 숫자로 표시됩니다. StopWatch는 밀리초, 초, 분 및 기타 단위를 포함하여 더 읽기 쉽고 시간이 많이 걸리는 정보를 제공할 수 있으며 개발자가 이해하고 분석할 수 있도록 출력 형식을 지정할 수 있습니다.
  • 다중 세그먼트 타이밍: StopWatch는 다중 세그먼트 타이밍을 지원합니다. 현재 밀리초 수의 차이를 사용하면 전체 시간 소비만 얻을 수 있으며 다른 단계의 실행 시간을 구분할 수 없습니다. StopWatch는 여러 단계에서 소요된 시간을 기록하고 개발자가 작업 또는 메서드의 실행 성능을 보다 자세히 분석할 수 있도록 세그먼트화된 타이밍 기능을 제공합니다.
  • 다양한 기능: StopWatch는 더 많은 기능과 제어 옵션을 제공합니다. 타이밍 및 인쇄 시간이 많이 걸리는 것 외에도 StopWatch는 타이머의 일시 중지, 다시 시작 및 재 설정과 같은 작업도 지원합니다. 이를 통해 개발자는 더 복잡한 타이밍 프로세스를 제어하고, 필요할 때 보다 세분화된 시간 관리를 허용할 수 있습니다.

결론

  • 좋은 currentTimeMillis는 간단히 찍을때만 쓰고, 정밀한 StopWatch를 사용하는게 모두에게 좋다.
  • 아파치가 마음에 안든다면, Spring StopWatch도 좋다.
  • Spring StopWatch처럼 Spring에서도 종속성만 추가하면 사용가능

연관 포스팅 – 함께 보면 좋아요

2 thoughts on “Java StopWatch 실행 시간 측정 방법 3가지”

Leave a Comment