답변:
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;
내 컴퓨터에서 확인하려고했습니다. 내 결과 :
Calendar.getInstance (). getTime () (* 1000000 회) = 402ms 새 날짜 () .getTime (); (* 1000000 배) = 18ms System.currentTimeMillis () (* 1000000 배) = 16ms
GC를 잊지 마십시오 (또는를 사용하는 Calendar.getInstance()
경우 new Date()
)
응용 프로그램에 따라 System.nanoTime()
대신 사용하는 것이 좋습니다.
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
System.currentTimeMillis()
메서드 호출이 하나 뿐이고 가비지 수집기가 필요하지 않기 때문에 분명히 가장 빠릅니다.