가끔 코드를 작성하다 보면 "이 코드가 실행되는 데는 얼마나 시간이 걸릴까?"라는 생각이 든다.
최근 회사에서 어떤 코드가 테스트할 때 1, 2개 정도를 대상으로는 문제가 없었는데 실제로 사용할 때 그 대상이 늘어나니 파이썬이 처리를 하는데 엄청나게 오래 걸렸다 라는 일이 있었다.
그래서 갑자기 Java와 Python의 코드 실행시간을 측정하는 방법은 어떻게 되는지 궁금해져 찾아보고 정리하게 되었다.
1. System.currentTimeMillis() 이용하기
System.currentTimeMillis()은 현재 시간을 ms 단위로 가져오는 함수다.
UTC 시간인 1970년 1월 1일 자정부터 현재까지 흐른 시간을 ms 단위로 반환하는 것이다.
long startTime = System.currentTimeMillis();
// 작업 코드
long endTime = System.currentTimeMillis();
System.out.println(String.format("코드 실행 시간: %20dms", endTime - startTime));
단순하게 이렇게 시작 시 long 타입 변수에 System.currentTimeMillis()를 호출해서 값을 저장하고, 작업이 끝난 뒤 long 타입 변수에 한 번 더 호출해서 값을 저장한 후 빼주면 실행 시간을 구할 수 있다.
ms 단위로 되어있기 때문에 초 단위로 계산하고 싶으면 그냥 결괏값을 / 1000 해주면 초 단위로 계산할 수 있다.
다만 System.currentTimeMillis()는 외부 데이터인 시스템 시간을 참조하기 때문에 작업 중 시스템 시간이 변경되면 올바른 실행시간을 구할 수 없게 된다.
2. System.nanoTime() 이용하기
System.nanoTime()은 JVM의 시간을 ns 단위로 반환하는 함수이기 때문에 시스템 시간과 무관하게 실행 시간을 계산할 수 있다.
long startTime = System.nanoTime();
// 작업 코드
long endTime = System.nanoTime();
System.out.println(String.format("코드 실행 시간: %20dns", endTime - startTime));
System.nanoTime()으로 구한 시간은 결과 역시 ns 단위이기 때문에 결괏값을 / 1000000000 해주면 초 단위로 계산할 수 있다.
3. 라이브러리 (StopWatch) 이용하기
또 다른 방법은 apache의 commons-lang3 라이브러리에 포함되어 있는 StopWatch를 이용하는 방법이다.
apache commons-lang3 라이브러리를 직접 불러와 주거나 gradle 혹은 maven 프로젝트를 사용하고 있다면 dependency를 추가해주면 사용할 수 있다.
// gradle
implementation 'org.apache.commons:commons-lang3:3.12.0'
// maven
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
Spring 프로젝트에서 작업 중이었다면 따로 commons-lang3을 불러오지 않아도 Spring 프레임워크에 StopWatch가 포함되어 있다고 한다.
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 작업 코드
stopWatch.stop();
System.out.println(String.format("코드 실행 시간: %20dms", stopWatch.getTime()));
사용 방법은 매우 간편하다.
코드 시작 전에 StopWatch를 생성해주고, start를 한 뒤 작업이 끝나면 stop을 해주면 끝이 난다.
결과는 getTime()을 사용하여 얻을 수 있으며 ms 단위를 사용한다.
아마 Java에서 코드 실행 시간을 측정할 때는 StopWatch를 주로 사용할 것 같다.
'Java' 카테고리의 다른 글
[Java] Boolean.valueOf()와 Boolean.parseBoolean()의 차이 (0) | 2022.07.20 |
---|---|
[Java] char[]에서 byte[]로, byte[]에서 char[]로 변환하기 (0) | 2022.05.12 |
[Java] Maven 라이브러리 Dependency 충돌 해결하기 (0) | 2021.11.04 |
[Java] 메서드 참조(Method Reference) (0) | 2021.05.21 |
[Java] javadoc 정리 (0) | 2021.05.04 |