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
System.currentTimeMillis()
메서드 호출이 하나 뿐이고 가비지 수집기가 필요하지 않기 때문에 분명히 가장 빠릅니다.
'Programing' 카테고리의 다른 글
Visual Studio 2012 웹 게시에서 파일을 복사하지 않습니다 (0) | 2020.04.17 |
---|---|
복사 초기화와 직접 초기화간에 차이가 있습니까? (0) | 2020.04.17 |
실행 스크립트의 경로 결정 (0) | 2020.04.17 |
Java, "for each"루프에서 현재 색인 / 키를 얻는 방법 (0) | 2020.04.17 |
WebView의 Android 호출 JavaScript 함수 (0) | 2020.04.17 |