218

Java에서 성능 및 자원 사용의 의미는 무엇입니까?

System.currentTimeMillis() 

new Date() 

Calendar.getInstance().getTime()

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

8 답변


219

System.currentTimeMillis()분명히 가장실력 있는객체를 생성하지 않기 때문에new Date()정말 오래 걸리는 얇은 포장지이므로 멀리 떨어져 있지 않습니다.Calendar는 비교적 복잡하고 시간과 날짜 (윤년, 일광 절약 시간, 시간대 등)에 내재 된 모든 기이함을 처리해야하기 때문에 상대적으로 느리고 매우 복잡합니다.

일반적으로 긴 타임 스탬프 만 처리하는 것이 좋습니다.Date응용 프로그램 내의 객체 및 사용Calendar실제로 날짜 / 시간 계산을 수행하거나 사용자에게 표시하기 위해 날짜를 형식화해야 할 때. 이 작업을 많이해야한다면조다 시간더 깨끗한 인터페이스와 더 나은 성능을 위해 아마 좋은 생각 일 것입니다.


  • 타임 스탬프와 currentMillis의 차이점은 무엇입니까? - pinkpanther
  • @pinkpanther : & quot; 타임 스탬프 & quot; "에포크 스타트"이후 초 또는 밀리 초로 해석 될 때 특정 시점을 기술하는 정수 / 롱을 기술하는데 통상 사용된다. 즉, currentTimeMillis ()는 타임 스탬프를 반환합니다. - Michael Borgwardt

38

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 객체를 생성하기 전에 계산을하고 싶지 않으면 특별히 시스템 시간을 가져올 필요가 없습니다. 또한 추천해야합니다.요오드 시간날짜 계산을 많이하는 것이 목적이라면 자바 자신의 캘린더 / 날짜 클래스를 대체 할 수 있습니다.


  • Date 생성자에 대한 포인터가 그것을 못 박았습니다! 감사! - Peter Perháč

22

데이트를 사용하고 있다면 조다 타임을 사용하는 것이 좋습니다.http://joda-time.sourceforge.net/. 사용System.currentTimeMillis()그 분야의아르날짜는 쓸모없는 코드로 끝나기 때문에 아주 나쁜 생각처럼 들립니다.

날짜와 캘린더 모두 심각하게 borked이며, 캘린더는 확실히 그들 모두의 최악의 공연입니다.

너에게 조언을 해줄거야.System.currentTimeMillis()실제로 밀리 초 단위로 작동 할 때, 예를 들면 다음과 같습니다.

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


  • 나는 당신의 예가 꼭해야 할 것들 중 하나이기 때문에 이것에 대해 논평하고 싶었다.아니;에 대해 System.currentTimeMillis ()를 사용하십시오. 그것은 단조로운 클럭 소스가 아니므로 경과 시간을 안정적으로 계산할 수는 없습니다. 타이밍 코드가 실행되는 동안 시스템 시계가 변경되면 이상한 (예 : 부정적) 결과가 표시됩니다. 대신 System.nanoTime ()을 사용합니다.~이다.단조로운만약기본 시스템은 그러한 클럭 소스를 지원합니다 (bugs.java.com/bugdatabase/view_bug.do?bug_id=6458294) - rem
  • System.currentTimeMillis 자체는 시간대의 영향을받지 않습니다. 시스템 시간을 변경하면 System.currentTimeMillis와 같은 방식으로 System.nanotime에 영향을줍니다. - Viktor

12

나는에 의해 반환 된 값을 사용하는 것을 선호한다.System.currentTimeMillis()모든 종류의 계산과 유일한 사용Calendar또는Date인간이 읽는 값을 실제로 표시해야하는 경우. 이것은 또한 일광 절약 시간 버그의 99 %를 예방합니다. :)


12

내 컴퓨터에서 확인해 보았습니다. 내 결과 :

Calendar.getInstance().getTime() (*1000000 times) = 402ms
new Date().getTime(); (*1000000 times) = 18ms
System.currentTimeMillis() (*1000000 times) = 16ms

GC를 잊지 마세요 (사용하는 경우Calendar.getInstance()또는new Date())


  • 많은 스레드가 다른 처리 사이에서 같은 것을 호출하면 어떤 차이가 있는지 궁금해. - tgkprog

7

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


  • 왜, 그의 질문은 자원과 성능에 관한 것이었고, nanoTime ()은 더 많은 자원을 사용합니다. - WolfmanDragon
  • 다른 사람이 제안하지 않은 옵션이기 때문에 언급했습니다. 포스터는 플랫폼을 지정하지 않았습니다. SDN 버그 6876279는 currentTimeMillis ()와 nanoTime ()이 일부 JDK 버전에서 거의 동일하다고 제안합니다. 포스터는 또한 원래 목록이 부적절한 정확도 요구를 지정하지 않았습니다. - MykennaC
  • 이것이 늦어 질 수있는 것처럼, 질문의 모든 예는 그것이 몇시인지에 대한 절대적인 개념을 가지고 있습니다. Unix 시대가 시작된 이래로 1,348,770,313,071 millis. 그 시간nanoTime반환 값은 상대적인 값 (대개 프로그램 시작 부분)이며 날짜로 변환하려고 시도하면 난센스가됩니다. - Dunes
  • 그래,하지만 당신은 프로그램 시작에 일부 정적 코드에 currentTimeilli와 nano를 저장할 수 있습니다. 그런 다음 double을 사용하여 milli에서 정확한 나노를 얻기위한 오프셋을 사용합니다. var = currentTimeStart - nanoTimeStart + nanoTimeNow - tgkprog

3

나는 이것을 시도했다 :

        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


  • 이것은 마이크로 벤치 마크이며 결과를 신중히 신뢰해야합니다. 좀 봐.stackoverflow.com/questions/504103/…. - Axel
  • 이 벤치 마크는 의미가 없거나 더 나은 것은 Java 기반 운영 체제가 중요하다는 것을 보여줍니다. 나는 루프에서 12 번 (루프에서 "now"와 "result"의 초기화를 이동 시킴) 동일한 벤치 마크를 실행했고, 각각의 실행에서 귀여운 차이점을 보았습니다 : Date () : 322 to 330; currentTimeMillis () : 319 to 322. 다른 실행에서는 Date () : 312에서 318; currentTimeMillis () : 324에서 335까지입니다. 따라서 IMHO는 실제 사례 (Date의 소스를보고)에서 상당히 동등합니다. JFYI, 우분투에서 Java7을 사용했습니다. - Sampisa

1

System.currentTimeMillis()분명히 가장 빠른 방법은 하나의 메서드 호출이고 가비지 수집기가 필요하지 않기 때문입니다.


  • 답변은 이전에 승인 된 답변의 일부일 뿐이므로 아무런 가치가 없습니다. 이 방법으로 대답하지 않으려 고합니다. 특히 기존의 품질 응답이있는 아주 오래된 질문이라고 생각하지 않는 것이 좋습니다. - Nicklas Gnejs Eriksson
  • 둘째, 가비지 컬렉터는 에덴 공간의 단기간 객체에는 필요하지 않습니다. - Niels Bech Nielsen

연결된 질문


관련된 질문

최근 질문