[java] System.currentTimeMillis () vs. 새로운 Date () vs. Calendar.getInstance (). getTime ()

Java에서 사용시 성능 및 자원에 미치는 영향

System.currentTimeMillis() 

vs.

new Date() 

vs.

Calendar.getInstance().getTime()

내가 이해하는 System.currentTimeMillis()것이 가장 효율적입니다. 그러나 대부분의 응용 프로그램에서이 긴 값은 날짜 또는 이와 유사한 객체로 변환하여 사람에게 의미있는 작업을 수행해야합니다.



답변

System.currentTimeMillis()그것은 심지어 객체를 만들지 않기 때문에 가장 효율적입니다 . 그러나 new Date()실제로는 오랫동안 얇은 래퍼이기 때문에 그리 멀지 않습니다. Calendar반면에, 날짜와 시간에 고유 한 상당히 복잡한 모든 기이함 (윤년, 일광 절약 시간, 시간대 등)을 다루어야하기 때문에 상대적으로 느리고 매우 복잡합니다.

일반적으로 Date응용 프로그램 내에서 긴 타임 스탬프 또는 개체 만 처리 하고 Calendar실제로 날짜 / 시간 계산을 수행해야하거나 사용자에게 표시 할 날짜 형식을 지정하는 경우 에만 사용 하는 것이 좋습니다. 이 작업을 많이 수행해야하는 경우 Joda Time을 사용 하는 것이 더 깔끔한 인터페이스와 더 나은 성능을위한 좋은 아이디어 일 것입니다.


답변

JDK를 살펴보면 가장 안쪽 생성자 Calendar.getInstance()는 다음과 같습니다.

public GregorianCalendar(TimeZone zone, Locale aLocale) {
    super(zone, aLocale);
    gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
    setTimeInMillis(System.currentTimeMillis());
}

이미 제안한 내용을 자동으로 수행합니다. 날짜의 기본 생성자는 다음을 보유합니다.

public Date() {
    this(System.currentTimeMillis());
}

따라서 달력 / 날짜 개체를 만들기 전에 계산을하지 않는 한 시스템 시간을 구체적으로 알 필요는 없습니다. 또한 날짜 계산을 많이하는 것이 목적이라면 Java 자체 달력 / 날짜 클래스를 대체하기 위해 joda-time 을 권장 해야합니다.


답변

날짜를 사용하는 경우 jodatime, http://joda-time.sourceforge.net/ 을 사용하는 것이 좋습니다 . 사용 System.currentTimeMillis()필드에 있는 아주 나쁜 생각처럼 날짜 소리 당신은 쓸모없는 코드를 많이하게 될 겁니다 때문이다.

날짜와 달력 모두 심각하게 지겨워졌으며 달력은 그들 모두의 최악의 수행자입니다.

System.currentTimeMillis()실제로 밀리 초로 작동 할 때 사용하는 것이 좋습니다.

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;


답변

나는에 의해 반환 된 값을 사용하여 선호 System.currentTimeMillis()계산의 모든 종류를 만 사용 Calendar또는 Date정말 인간이 읽을 수있는 값을 표시해야하는 경우. 이렇게하면 일광 절약 시간제 버그의 99 %가 방지됩니다. 🙂


답변

내 컴퓨터에서 확인하려고했습니다. 내 결과 :

Calendar.getInstance (). getTime () (* 1000000 회) = 402ms
새 날짜 () .getTime (); (* 1000000 배) = 18ms
System.currentTimeMillis () (* 1000000 배) = 16ms

GC를 잊지 마십시오 (또는를 사용하는 Calendar.getInstance()경우 new Date())


답변

응용 프로그램에 따라 System.nanoTime()대신 사용하는 것이 좋습니다.


답변

나는 이것을 시도했다 :

        long now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            new Date().getTime();
        }
        long result = System.currentTimeMillis() - now;

        System.out.println("Date(): " + result);

        now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            System.currentTimeMillis();
        }
        result = System.currentTimeMillis() - now;

        System.out.println("currentTimeMillis(): " + result);

결과는 다음과 같습니다.

날짜 () : 199

currentTimeMillis () : 3