자바에서 프로그램의 시작 및 종료 시간을 출력하고 실행 시간을 계산하는 방법은 사용하는 자바 버전에 따라 크게 두 가지로 나뉩니다. 개발자이시므로 최신 프로젝트에 적합한 Modern Java (Java 8+) 방식과 레거시 코드에서 주로 쓰이는 System.currentTimeMillis() 방식을 구분하여 설명해 드리겠습니다.
1. Modern Java (권장: Java 8 이상)
Java 8부터 도입된 java.time 패키지를 사용하는 것이 가장 정확하고 코드 가독성이 좋습니다. 날짜 출력에는 LocalDateTime, 시간 차이 계산에는 Duration이나 ChronoUnit을 사용합니다.
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
public class ExecutionTimeModern {
public static void main(String[] args) {
// 포맷 정의 (예: 2025-12-02 15:30:00.123)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
// 1. 시작 시간 기록 및 출력
LocalDateTime startTime = LocalDateTime.now();
System.out.println("프로그램 시작: " + startTime.format(formatter));
// --- 실행할 작업 (예시) ---
doHeavyWork();
// -----------------------
// 2. 종료 시간 기록 및 출력
LocalDateTime endTime = LocalDateTime.now();
System.out.println("프로그램 종료: " + endTime.format(formatter));
// 3. 소요 시간 계산 (밀리초 단위)
long elapsedMillis = ChronoUnit.MILLIS.between(startTime, endTime);
System.out.println("실행 시간(ms): " + elapsedMillis + "ms");
}
private static void doHeavyWork() {
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
}
2. Legacy 방식 (System.currentTimeMillis)
Java 7 이하 버전이나 단순한 로깅용으로 여전히 많이 사용됩니다. System.currentTimeMillis()는 1970년 1월 1일 UTC부터 흐른 시간을 밀리초(ms)로 반환합니다.
import java.text.SimpleDateFormat;
import java.util.Date;
public class ExecutionTimeLegacy {
public static void main(String[] args) {
// 포맷 정의
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
// 1. 시작 시간
long start = System.currentTimeMillis();
System.out.println("시작 시간: " + sdf.format(new Date(start)));
// --- 실행할 작업 ---
doHeavyWork();
// ----------------
// 2. 종료 시간
long end = System.currentTimeMillis();
System.out.println("종료 시간: " + sdf.format(new Date(end)));
// 3. 차이 계산
System.out.println("실행 시간: " + (end - start) + "ms");
}
private static void doHeavyWork() {
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
}
3. 정밀 성능 측정 (System.nanoTime)
만약 **"시작/종료 시각(날짜)"**이 중요한 것이 아니라, 알고리즘 성능 측정을 위한 **"정확한 구간 실행 시간"**이 중요하다면 System.nanoTime()을 사용해야 합니다.
- 주의: nanoTime()이 반환하는 숫자는 현재 시각(날짜)과 무관한 임의의 값(CPU 클럭 등 기준)이므로 SimpleDateFormat으로 변환하여 날짜로 출력하면 안 됩니다. 실행 시간 계산(end - start)용으로만 사용하십시오.
long startNano = System.nanoTime();
// 작업 실행
long endNano = System.nanoTime();
System.out.println("실행 시간(ns): " + (endNano - startNano));
System.out.println("실행 시간(ms): " + (endNano - startNano) / 1_000_000.0);
요약 및 비교
방식용도특징정확도
| java.time (Instant/LocalDateTime) | 로그 기록, 비즈니스 로직 | Java 8+ 표준, 가독성 좋음, 날짜/시간 연산 편리 | 높음 |
| System.currentTimeMillis() | 간단한 디버깅, 레거시 코드 | 사용하기 쉽지만 OS 시간 변경에 영향을 받음 (Wall-clock time) | 밀리초(ms) |
| System.nanoTime() | 성능 벤치마킹, 정밀 측정 | OS 시간 변경에 영향받지 않음. 날짜 출력 불가 | 나노초(ns) |
일반적인 프로그램 시작/종료 로그를 남기시려면 1번(Modern Java) 방식을 추천해 드립니다.
'프로그램 > Java' 카테고리의 다른 글
| [Java] 프로그램 루프(Loop) 내에서 스래드 슬립(sleep)을 얼마를 주면 되고 주는 이유는? (0) | 2025.11.28 |
|---|---|
| [Java] OutputStreamWriter를 사용할 때 한글이 깨지는 현상 해결 방 (0) | 2025.05.20 |
| [Java] HttpsURLConnection에서 한글 깨짐 현상 해결 방법 (0) | 2025.05.20 |
| [Java] HttpsURLConnection을 사용할 때 한글이 깨지는 현상 (0) | 2025.05.20 |
| [Java]Java에서 ArrayList<String> 타입을 병합, Merge 하는 방법 (0) | 2025.05.15 |