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()
분명히 가장 빠른 방법은 하나의 메서드 호출이고 가비지 수집기가 필요하지 않기 때문입니다.