×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,045,665명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

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를 사용하는 것이 좋다.

반응형