23

나는 그것을 안다.System.nanoTime()이제 시간을 측정하는 데 선호되는 방법입니다.System.currentTimeInMillis(). 첫 번째 분명한 이유는 nanoTime ()이 더 정확한 타이밍을 제공하고 다른 이유는 시스템의 실시간 클럭 조정에 영향을 받는다는 것입니다. "시스템 실시간 시계의 영향을받는 것"은 무엇을 의미합니까?


  • 나도 궁금해. 사용을 시도하면 어떻게 될까요?currentTimeInMillis()일광 절약 시간제 전환 중에 경과 시간을 기록 하시겠습니까? 아니면 그것이 의미하는 바가 아닙니까? - trevor-e
  • currentTimeMillis측정하려고하는 것은 물리적 현상으로서의 시간의 흐름이다. DST 변경은 여행 할 때의 시간대 변경과 유사합니다. 시간이 분과 시간으로 표시되는 방식에만 영향을줍니다. 시간 자체는 영향을받지 않습니다. - Joni
  • currentTimeMillis예를 들어 영향을받지 않았습니다. DST는 영향을 받지만 예를 들어 도약과 달리,nanoTime. - Louis Wasserman
  • platzhirsch의 대답에서 언급 된 블로그의 @LouisWasserman "절대 시간과 관련된 이벤트는 절대 시간 (예 : 일광 절약 시간의 시작 / 종료)의 변화를 인식해야하므로 상대적 시간은 그러한 변화에 면역된다. 항상 이것은 대부분의 운영 체제에 문제 (일방적 또는 다른 방식)가 있음을 의미합니다. " 이후currentTimeInMillis"오늘의 시간"을 사용한다. 또는 absolute clock은 currentTimeInMillis가 DST의 영향을 받음을 의미하지 않습니까? - Geek
  • @JoniSalonen 제발 루이스에게 내 의견을 읽어주십시오. 그게 너의 몫이야? - Geek

3 답변


25

이 경우 나는 유용한 블로그 게시물 발췌 다음과 같은 것을 발견했다.

관심이있는 경우절대 시간 측정항상 사용하십시오.System.currentTimeMillis(). 그 결의안이 아주   거친 (이것은 절대 시간 동안 거의 문제가되지 않지만).

관심이있는 경우경과 시간 측정 / 계산, 그 다음에   항상 사용하다System.nanoTime(). 대부분의 시스템에서는   마이크로 초 단위의 해상도. 그래도 알아 두십시오.   일부 플랫폼에서 실행하려면 마이크로 초가 걸릴 수도 있습니다.

클럭 및 타이머 - 일반 개요데이빗 홈즈

이후System.currentTimeMillis()시스템에 의존하고있다.시간시간에 대한 조정은 시간을 맞추기 위해 합법적입니다.

여기서 조정은 무엇을 의미합니까? 예를 들어 설명을 봅니다.CLOCK_REALTIMELinux에서 :

실제 (즉, 벽시계) 시간을 측정하는 시스템 전체의 시계.                 이 시계를 설정하려면 적절한 권한이 필요합니다. 이 시계는시스템 시간의 불연속 점프에 영향을 받음(예 :만약                 시스템 관리자가 수동으로 시계를 변경합니다.), 그리고                 adjtime (3) 및 NTP에 의해 수행되는 증분 조정.


  • 이 링크는 사용자가 제공 한 링크에서 가져온 것입니다. "상대 시간 시계는 & quot; 자유 실행 & quot; 함수를 반환하는 System.nanoTime () 메소드로 나타냅니다. 시간 (나노초 단위). & quot; 왜 그것이 "프리 - 러닝 (free-running)"이라고 불리는가? 시각 ? - Geek
  • @ 괴짜 나는 무료로 말할 것이다.독립적 인. 절대 시간은 운영 체제에 의해 트리거 된 인터럽트에 따라 다릅니다. 친척무료 실행시간은 그것과 독립적이며 Joni Salonen이 지적한 것처럼 내부 CPU 클럭 타이머에서 파생됩니다. - Konrad Reiche
  • 시스템은 전형적으로 절대 클럭 (저해상도의 시각 클럭) 및 상대 클록 ( "자유 - 실행"시간이 될 수있는 어떤 종류의 "고해상도"카운터)을 모두 갖는다. 계획된). 낮 시계의 시간은 왜 낮습니까? 그리고 상대 시계는 높은 해상도를 갖는 이유는 무엇입니까? - Geek
  • 예를 들어 CPU 시간 소인 카운터 (en.wikipedia.org/wiki/Time_Stamp_Counter)는 대략 내부 프로세서 클럭 사이클마다 대략적으로 증가하기 때문에 훨씬 정확합니다. 반복되는 인터럽트 신호의 빈도는 훨씬 낮습니다. - Konrad Reiche

8

메소드의 JavaDoc을 확인하십시오.

System.nanoTime()

"...이 방법은 경과 시간을 측정하는 데만 사용할 수 있으며 시스템 또는 벽시계 시간의 다른 개념과는 관련이 없습니다 ..."

System.currentTimeMillis()

"... ... 현재 시간을 밀리 초 단위로 반환합니다 ..."

따라서 측정 중에 시스템 시간이 변경되는지System.currentTimeMillis()측정하는 간격도 변경됩니다. 그러나 측정 간격을 측정 할 때System.nanoTime()방법.


4

즉,System.currentTimeMillis()반환은 기계의 내부 시계에서 얻습니다. sysadmin (또는 NTP)이 시간을 변경하면 (예 : 시계가 5 분 빠르게 실행되는 것으로 확인되고 sysadmin이이를 수정 한 경우)System.currentTimeMillis()영향을받습니다. 즉, 값이 감소하는 것을 볼 수 있으며 간격을 측정하는 데 사용하면 타이밍이 꺼질 수 있습니다. 측정 할 수도 있습니다.부정타이밍.

System.nanoTime()반면에 일부 내부 CPU 카운터 / 클럭에서 파생 된 값을 반환합니다. 이 시계로 측정 된 시간은 사용자 또는 프로그램에 의해 변경 될 수 없습니다. 이것은 타이밍에 대해 더 신뢰할 수 있음을 의미합니다. 하지만 CPU 클럭은 전원 끄기시 재설정되므로 현재 "벽시계"시간을 찾는 데 유용하지 않습니다.

연결된 질문


관련된 질문

최근 질문