알고리즘 최적화를 위한 실행 시간 및 메모리 사용량 측정 방법
·admin·조회수 35
#Java#Algorithm
코드의 성능을 평가할 때 가장 중요한 두 가지 지표는 바로 실행 시간과 메모리 사용량입니다.
이번 게시물에서는 Java 환경에서 작성한 코드의 실행 시간과 메모리 사용량을 간단하게 측정할 수 있는 템플릿 코드를 알아봅시다.
1. 메모리 사용량 측정하기
Java에서는 Runtime 클래스를 활용하여 JVM의 메모리 정보를 가져올 수 있습니다.
Runtime.getRuntime().gc() : 측정을 시작하기 전, GC(Garbage Collector)를 명시적으로 호출해 불필요한 메모리를 정리합니다. 이 부분을 시작점으로 메모리 사용량을 측정합니다.
totalMemory() (전체 메모리)에서 freeMemory (여유 메모리)를 빼면 현재 프로그램이 사용 중인 메모리의 크기를 구할 수 있습니다. 로직 실행 전후의 이 값을 비교해 순수하게 로직이 소비한 메모리양을 바이트 단위로 계산합니다.
java
public class MemoryTest {
public static void main(String[] args) throw Exception {
// 1. 실행 전 메모리 정리
Runtime.getRuntime().gc();
// 2. 실행 전 메모리 사용량 기록
long memoryBefore = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
/* * ======================================
* [입력 파트] (Scanner, BufferedReader 등)
* ======================================
*/
/* * ======================================
* [실행 로직 파트] (알고리즘 등 핵심 코드)
* ======================================
*/
// 3. 실행 후 메모리 사용량 기록
long memoryAfter = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
// 4. 메모리 사용량 계산 (바이트 단위)
System.out.println("메모리 사용량: " + (memoryAfter - memoryBefore) + "bytes");
}
}2. 실행 시간 측정하기
시간 측정에는 System.currentTimeMillis() 보다 정밀한 System.nanoTime() 을 사용하는 것이 좋습니다.
알고리즘 성능을 측정할 때 자주 하는 실수 중 하나가 바로 사용자의 입력(I/O) 대기 시간까지 포함해 버리는 것입니다. 순수한 실행 로직의 성능만 평가하려면, 반드시 모든 입력이 끝난 직후에 시작 시간을 기록해야 합니다.
마지막에 끝난 시간에서 시작 시간을 뺀 뒤, 1000000.0 으로 나누어 우리가 보기 편한 밀리초(ms) 단위로 변환합니다.
java
public class TimeTest {
public static void main(String[] args) throw Exception {
/* * ======================================
* [입력 파트] (Scanner, BufferedReader 등)
* ======================================
*/
// 1. 시작 시간 기록 (나노초 단위)
// ※ 입력 시간까지 포함되지 않도록 반드시 입력 완료 후 작성합니다.
long startTime = System.nanoTime();
/* * ======================================
* [실행 로직 파트] (알고리즘 등 핵심 코드)
* ======================================
*/
// 2. 종료 시간 기록
long endTime = System.nanoTime();
// 3. 실행 시간 계산 (나노초 -> 밀리초 변환)
System.out.println("실행 시간: " + (endTime - startTime) / 1000000.0 + " ms");
}
}3. 전체 코드
java
public class PerformanceTest {
public static void main(String[] args) throws Exception {
// [메모리_1] 로직 실행 전 메모리 정리
Runtime.getRuntime().gc();
// [메모리_2] 실행 전 메모리 사용량 기록
long memoryBefore = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
/* * ======================================
* [입력 파트] (Scanner, BufferedReader 등)
* ======================================
*/
// [시간_1] 시작 시간 기록 (나노초 단위)
// ※ 입력 시간까지 포함되지 않도록 반드시 입력 완료 후 작성합니다.
long startTime = System.nanoTime();
/* * ======================================
* [실행 로직 파트] (알고리즘 등 핵심 코드)
* ======================================
*/
// [시간_2] 종료 시간 기록
long endTime = System.nanoTime();
// [시간_3] 실행 시간 계산 (나노초 -> 밀리초 변환)
System.out.println("실행 시간: " + (endTime - startTime) / 1000000.0 + " ms");
// [메모리_3] 실행 후 메모리 사용량 기록
long memoryAfter = Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory();
// [메모리_4] 메모리 사용량 계산 (바이트 단위)
System.out.println("메모리 사용량: " + (memoryAfter - memoryBefore) + " bytes");
}
}