반응형

System.currentTimeMillis() vs new Date() vs Calendar.getInstance().getTime()

 

Java에서는 위의 3가지 코드를 통해 time을 얻을 수 있다.

 

하지만 3가지는 모두 다른 것들이고, 이에대한 성능을 분석하기 위해 써보고자 한다.

 

 

우선 3가지 코드를 이용하면 아래와 같은 출력을 얻을 수 있다.

 

import java.awt.*;
import java.util.Calendar;
import java.util.Date;

public class Crocus {
    public static void main(String[] args) {
        System.out.println(System.currentTimeMillis());
        System.out.println(new Date());
        System.out.println(Calendar.getInstance().getTime());
    }
}
> Task :Crocus.main()
1578638707421
Fri Jan 10 15:45:07 KST 2020
Fri Jan 10 15:45:07 KST 2020

 

이 말은 즉슨, currentTimeMillis()는 timestamp를 반환해주고 나머지는 실제 날짜, 시간을 반환해준다.

 

(이때 currentTImeMIllis()도 날짜, 시간을 반환받고 싶다면
DateFormat.getInstance().format(System.currentTimeMillis());를 이용하자.)

 

 

 

성능 테스트

 

이때 1억번씩 for문을 통해 각각의 성능을 계산해보니 아래와 같은 수치가 나타났다.

 

import java.util.Calendar;
import java.util.Date;

public class Crocus {
    public static void main(String[] args) {
        long start;
        long end;

        start = System.currentTimeMillis();
        for(int i = 0 ; i < 100000000; i++){
            System.currentTimeMillis();
        }
        end = System.currentTimeMillis();
        System.out.println("System.currentTimeMillis() :: " + (end - start));

        start = System.currentTimeMillis();
        for(int i = 0 ; i < 100000000; i++) {
            new Date();
        }
        end = System.currentTimeMillis();
        System.out.println("new Date() :: " + (end - start));

        start = System.currentTimeMillis();
        for(int i = 0 ; i < 100000000; i++) {
            Calendar.getInstance().getTime();
        }
        end = System.currentTimeMillis();
        System.out.println("Calendar.getInstance().getTime() :: " + (end - start));
    }
}
> Task :Crocus.main()
System.currentTimeMillis() :: 290
new Date() :: 291
Calendar.getInstance().getTime() :: 12176

 

 

확인 결과

 

결론적으로는 System.currentTimeMillis() 가 가장 빠르고 new Date()가 그 뒤를 따르지만 사실 이 둘은 같다고 해도 무방할 듯 하다.

 

눈여겨 볼 점은 Calendar.getInstance().getTime()는 객체 생성부터 시작하여 여러 상황을 고려한 (윤달 등등) 날을 계산하기에 많은 시간이 걸리는 듯 하다.

 

 System.currentTimeMillis() >= new Date() >>> Calendar.getInstance().getTime()

 

 

 

 

결론

 

System.currentTimeMillis()는 객체를 만들지 않기 때문에 분명히 가장 효율적이지만

new Date() 객체 생성을 하지만 많은 과정이 없기에 System.currentTimeMillis()와 비슷한 성능을 낸다.

 

하지만 결국 Date는 객체 생성을 하기에 성능을 따지자면 GC를 하지 않는 System.currentTimeMillis()더 나아 보인다.

 

반면, 캘린더는 날짜와 시간에 고유 한 상당히 복잡한 모든 기이 (윤년, 일광 절약 시간, 시간대 등)를 처리해야하기 때문에 상대적으로 느리고 매우 복잡하다.

 

일반적으로 응용 프로그램 내에서 긴 타임 스탬프나 간단한 날짜는 System.currentTimeMillis()혹은 Date객체로 처리하고

 

날짜/시간 계산을 수행하거나 사용자에게 표시 할 날짜의 형식을 지정해야하는 경우에만 Calendar를 사용하는 것이 좋다.

반응형