프로그램/Java

[Java] 프로그램 시작 끝 수행 시간 출력하기

neorc 2025. 12. 2. 16:22

자바에서 프로그램의 시작 및 종료 시간을 출력하고 실행 시간을 계산하는 방법은 사용하는 자바 버전에 따라 크게 두 가지로 나뉩니다. 개발자이시므로 최신 프로젝트에 적합한 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) 방식을 추천해 드립니다.