Java에서 성능 및 자원 사용의 의미는 무엇입니까?
System.currentTimeMillis()
대
new Date()
대
Calendar.getInstance().getTime()
내가 알기에 System.currentTimeMillis ()가 가장 효율적이다. 그러나 대부분의 응용 프로그램에서는 긴 값을 Date 또는 유사한 객체로 변환하여 사람에게 의미있는 모든 작업을 수행해야합니다.
System.currentTimeMillis()분명히 가장실력 있는객체를 생성하지 않기 때문에new Date()정말 오래 걸리는 얇은 포장지이므로 멀리 떨어져 있지 않습니다.Calendar는 비교적 복잡하고 시간과 날짜 (윤년, 일광 절약 시간, 시간대 등)에 내재 된 모든 기이함을 처리해야하기 때문에 상대적으로 느리고 매우 복잡합니다.
일반적으로 긴 타임 스탬프 만 처리하는 것이 좋습니다.Date응용 프로그램 내의 객체 및 사용Calendar실제로 날짜 / 시간 계산을 수행하거나 사용자에게 표시하기 위해 날짜를 형식화해야 할 때. 이 작업을 많이해야한다면조다 시간더 깨끗한 인터페이스와 더 나은 성능을 위해 아마 좋은 생각 일 것입니다.
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());
}
따라서 Calendar / Date 객체를 생성하기 전에 계산을하고 싶지 않으면 특별히 시스템 시간을 가져올 필요가 없습니다. 또한 추천해야합니다.요오드 시간날짜 계산을 많이하는 것이 목적이라면 자바 자신의 캘린더 / 날짜 클래스를 대체 할 수 있습니다.
데이트를 사용하고 있다면 조다 타임을 사용하는 것이 좋습니다.http://joda-time.sourceforge.net/. 사용System.currentTimeMillis()그 분야의아르날짜는 쓸모없는 코드로 끝나기 때문에 아주 나쁜 생각처럼 들립니다.
날짜와 캘린더 모두 심각하게 borked이며, 캘린더는 확실히 그들 모두의 최악의 공연입니다.
너에게 조언을 해줄거야.System.currentTimeMillis()실제로 밀리 초 단위로 작동 할 때, 예를 들면 다음과 같습니다.
long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
나는에 의해 반환 된 값을 사용하는 것을 선호한다.System.currentTimeMillis()모든 종류의 계산과 유일한 사용Calendar또는Date인간이 읽는 값을 실제로 표시해야하는 경우. 이것은 또한 일광 절약 시간 버그의 99 %를 예방합니다. :)
내 컴퓨터에서 확인해 보았습니다. 내 결과 :
Calendar.getInstance().getTime() (*1000000 times) = 402ms new Date().getTime(); (*1000000 times) = 18ms System.currentTimeMillis() (*1000000 times) = 16ms
GC를 잊지 마세요 (사용하는 경우Calendar.getInstance()또는new Date())
응용 프로그램에 따라 다음을 사용하는 것이 좋습니다.System.nanoTime()대신.
nanoTime반환 값은 상대적인 값 (대개 프로그램 시작 부분)이며 날짜로 변환하려고 시도하면 난센스가됩니다. - Dunes
나는 이것을 시도했다 :
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()분명히 가장 빠른 방법은 하나의 메서드 호출이고 가비지 수집기가 필요하지 않기 때문입니다.