System.nanoTime ()이 완전히 쓸모 없습니까?


153

x86 시스템 에서 블로그 게시물 Java의 System.nanoTime ()주의 x86 시스템 에서 설명하는 것처럼 Java의 System.nanoTime ()은 CPU 특정 카운터를 사용하여 시간 값을 반환합니다 . 이제 통화 시간을 측정하는 데 사용하는 다음 사례를 고려하십시오.

long time1= System.nanoTime();
foo();
long time2 = System.nanoTime();
long timeSpent = time2-time1;

이제 멀티 코어 시스템에서 time1을 측정 한 후 스레드가 이전 CPU의 카운터보다 작은 다른 프로세서로 스레드가 예약 될 수 있습니다. 따라서 time1보다 작은 time2의 값을 얻을 수 있습니다. 따라서 timeSpent에서 음수 값을 얻습니다.

이 경우를 고려할 때 System.nanotime이 지금은 쓸모가 없습니까?

시스템 시간을 변경해도 나노 시간에는 영향을 미치지 않습니다. 그것은 위에서 설명한 문제가 아닙니다. 문제는 각 CPU가 켜진 이후 다른 카운터를 유지한다는 것입니다. 이 카운터는 첫 번째 CPU에 비해 ​​두 번째 CPU에서 더 낮을 수 있습니다. 스레드가 time1을 얻은 후 OS에 의해 두 번째 CPU로 스케줄 될 수 있으므로 timeSpent 값이 올바르지 않고 음수 일 수도 있습니다.


2
답변이 없지만 동의합니다. JVM의 버그로 간주 될 수 있습니다.
Aaron Digulla

2
해당 게시물이 잘못되어 TSC를 사용하지 않는 것은 느리지 만 다음과 같이 살아야 합니다.
bestsss

1
물론 CPU가 세션 중간에 나타날 수있는 가상 머신에서 실행할 수 있습니다. D
한정 속죄

답변:


206

이 답변은 2011 년 당시 운영 체제에서 실행 된 시간의 Sun JDK가 실제로 한 일의 관점에서 2011 년에 작성되었습니다. 그것은 오래 전이었습니다! leventov의 답변 은보다 최신의 관점을 제공합니다.

그 게시물은 잘못되어 nanoTime안전합니다. Sun의 실시간 및 동시성 사용자 인 David Holmes의 블로그 게시물에 링크되는 게시물에 대한 의견이 있습니다 . 그것은 말한다 :

System.nanoTime ()은 QueryPerformanceCounter / QueryPerformanceFrequency API를 사용하여 구현됩니다. [...] QPC에서 사용하는 기본 메커니즘은 하드웨어 추상화 계층 (HAL)에 의해 결정됩니다. [...]이 기본값은 하드웨어뿐만 아니라 OS에서도 변경됩니다. 버전. 예를 들어, Windows XP 서비스 팩 2는 SMP 시스템의 다른 프로세서에서 TSC가 동기화되지 않는 문제와 주파수로 인해 TSC (프로세서 타임 스탬프 카운터)가 아닌 전원 관리 타이머 (PMTimer)를 사용하도록 변경했습니다. 전원 관리 설정에 따라 달라질 수 있습니다 (따라서 경과 시간과의 관계).

그래서, Windows에서,이 이었다 WINXP SP2까지 문제가 있지만 지금은 아니다.

다른 플랫폼에 대해 이야기하는 II 부 (또는 그 이상)를 찾을 수 없지만이 기사에는 Linux가 같은 방식으로 동일한 문제를 발견하고 해결했다는 언급이 포함되어 있습니다. clock_gettime (CLOCK_REALTIME)에 대한 FAQ 링크 라고 말합니다.

  1. clock_gettime (CLOCK_REALTIME)이 모든 프로세서 / 코어에서 일관성이 있습니까? (아키 문제가 있습니까? 예 : ppc, arm, x86, amd64, sparc).

그것은 해야 되거나 버그 간주.

그러나 x86 / x86_64에서는 동기화되지 않거나 가변 주파수 TSC로 인해 시간 불일치가 발생할 수 있습니다. 2.4 커널은 실제로 이것에 대한 보호 기능이 없었으며 초기 2.6 커널은 여기서도 잘하지 못했습니다. 2.6.18부터는 이것을 감지하는 논리가 더 좋으며 일반적으로 안전한 클럭 소스로 돌아갑니다.

ppc에는 항상 동기화 된 타임베이스가 있으므로 문제가되지 않습니다.

따라서 Holmes의 링크가 해당 nanoTime호출 을 암시하는 것으로 읽을 수 있다면 clock_gettime(CLOCK_REALTIME)x86의 커널 2.6.18과 항상 PowerPC에서 안전합니다 (Intel과 달리 IBM과 Motorola는 실제로 마이크로 프로세서를 설계하는 방법을 알고 있기 때문에).

슬프게도 SPARC 또는 Solaris에 대한 언급은 없습니다. 물론 IBM JVM이 무엇을하는지 전혀 모릅니다. 그러나 최신 Windows 및 Linux의 Sun JVM이이 권리를 얻습니다.

편집 :이 답변은 인용 소스를 기반으로합니다. 그러나 나는 그것이 실제로 완전히 잘못되었을 수도 있다고 여전히 걱정합니다. 좀 더 최신 정보는 정말 귀중 할 것입니다. 난 그냥에 대한 링크를 통해 온 리눅스의 시계에 대한 사년 새로운 기사 유용 할 수있다.


13
WinXP SP2조차도 어려움을 겪고 있습니다. void foo() { Thread.sleep(40); }단일 Athlon 64 X2 4200+프로세서를 사용하여 음의 시간 (
-380ms

나는 이것에 대한 업데이트가 있다고 생각하지 않는다. 리눅스, BSD 또는 다른 플랫폼에서의 동작?
Tomer Gabel

6
좋은 대답은이 항목의 더 최근의 탐사에 대한 링크를 추가해야합니다 : shipilev.net/blog/2014/nanotrusting-nanotime
Nitsan Wakart

1
@SOFe : 아, 그건 부끄러운 일입니다. 그것은에 웹 아카이브 다행히. 현재 버전을 추적 할 수 있는지 확인할 것입니다.
톰 앤더슨

1
참고 : 오픈 JDK는 오픈 JDK 8u192까지 사양 최대로 유지하지 않았다 참조 bugs.openjdk.java.net/browse/JDK-8184271을 . 최소한 OpenJDK 8 또는 OpenJDK 11+의 최신 버전으로 사용하십시오.
leventov 2019

35

나는 약간의 검색을했는데 하나가 pedantic이라면 예를 들어 쓸모없는 것으로 간주 될 수 있습니다 ... 특정 상황에서 ... 필요한 시간이 얼마나 민감한 지에 달려 있습니다 ...

Java Sun 사이트 에서이 인용문 을 확인하십시오 .

실시간 클록과 System.nanoTime ()은 모두 동일한 시스템 호출을 기반으로하므로 동일한 클록을 기반으로합니다.

Java RTS를 사용하면 모든 시간 기반 API (예 : 타이머, 정기 스레드, 데드 라인 모니터링 등)가 고해상도 타이머를 기반으로합니다. 또한 실시간 우선 순위와 함께 실시간 제약 조건에 적합한 코드가 적시에 실행되도록 할 수 있습니다. 대조적으로, 일반 Java SE API는 특정 시간에 실행을 보장하지 않고 고해상도 시간을 처리 할 수있는 몇 가지 메소드 만 제공합니다. 경과 시간 측정을 수행하기 위해 코드의 여러 지점간에 System.nanoTime ()을 사용하면 항상 정확해야합니다.

Java는 또한 nanoTime () 메소드에 대한주의 사항이 있습니다 .

이 방법은 경과 시간을 측정하는 데만 사용할 수 있으며 다른 시스템 또는 벽시계 시간 개념과 관련이 없습니다. 반환 된 값은 고정되었지만 임의의 시간 (나중에 값이 음수 일 수 있음) 이후 나노초를 나타냅니다. 이 방법은 나노초 정밀도를 제공하지만 반드시 나노초 정확도는 아닙니다. 값이 얼마나 자주 변경되는지는 보증하지 않습니다. 약 292.3 년 (2 63 나노초)을 초과하는 연속 호출의 차이는 숫자 오버플로로 인해 경과 시간을 정확하게 계산하지 않습니다.

그릴 수있는 유일한 결론은 nanoTime ()을 정확한 값으로 신뢰할 수 없다는 것입니다. 따라서, 단지 나노초 간격의 시간을 측정 할 필요가 없으면 결과 리턴 값이 음수 인 경우에도이 방법으로 충분합니다. 그러나 더 높은 정밀도가 필요한 경우 JAVA RTS를 사용하는 것이 좋습니다.

따라서 귀하의 질문에 대답하기 위해 ... no nanoTime ()은 쓸모가 없습니다 .... 모든 상황에서 사용하는 가장 신중한 방법은 아닙니다.


3
>이 메소드는 결과 리턴 값이 음수 인 경우에도 충분합니다. 타임스 펜드의 값이 음수이면 foo ()에서 취한 시간을 측정하는 데 어떻게 유용합니까?
pdeva

3
당신이 걱정하는 것은 차이의 절대 가치이기 때문에 괜찮습니다. 즉, 측정 값이 t = t2-t1 인 시간 t 인 경우 | t | .... 그래서 값이 음수이면 어떻게해야합니까? 멀티 코어 문제에서도 영향은 거의 없습니다. 어쨌든 나노초.
mezoid

3
@Aaron을 백업하려면 t2와 t1은 모두 음수 일 수 있지만 (t2-t1)은 음수가 아니어야합니다.
jfs

2
애런 : 그것이 바로 내 요점입니다. t2-t1은 음수가 아니어야합니다. 그렇지 않으면 버그가 있습니다.
pdeva

12
@ pdeva-그러나 의사가 말한 것을 오해하고 있습니다. 비 문제를 제기하고 있습니다. "0"으로 간주되는 특정 시점이 있습니다. nanoTime ()에 의해 반환되는 값은 해당 시간에 대해 정확합니다. 단조 증가하는 타임 라인입니다. 해당 타임 라인의 음수 부분에서 일련의 숫자가 표시 될 수 있습니다. -100, -99, -98(실제로는 분명히 훨씬 더 큰 값). 그들은 올바른 방향으로 가고 있습니다 (증가). 여기에는 문제가 없습니다.
ToolmakerSteve

18

토론 할 필요없이 소스 만 사용하십시오. 다음은 Linux 용 SE 6이며 자신의 결론을 내립니다.

jlong os::javaTimeMillis() {
  timeval time;
  int status = gettimeofday(&time, NULL);
  assert(status != -1, "linux error");
  return jlong(time.tv_sec) * 1000  +  jlong(time.tv_usec / 1000);
}


jlong os::javaTimeNanos() {
  if (Linux::supports_monotonic_clock()) {
    struct timespec tp;
    int status = Linux::clock_gettime(CLOCK_MONOTONIC, &tp);
    assert(status == 0, "gettime error");
    jlong result = jlong(tp.tv_sec) * (1000 * 1000 * 1000) + jlong(tp.tv_nsec);
    return result;
  } else {
    timeval time;
    int status = gettimeofday(&time, NULL);
    assert(status != -1, "linux error");
    jlong usecs = jlong(time.tv_sec) * (1000 * 1000) + jlong(time.tv_usec);
    return 1000 * usecs;
  }
}

7
사용 된 API의 기능을 알고있는 경우에만 유용합니다. 사용 된 API는 운영 체제에 의해 구현됩니다. 이 코드는 올바른 wrt입니다. 사용 된 API (clock_gettime / gettimeofday)의 사양이지만 다른 지적한 바와 같이 일부 최신 운영 체제에는 버그가있는 구현이 있습니다.
Blaisorblade

18

Java 7부터는 System.nanoTime()JDK 사양으로 안전합니다. System.nanoTime()Javadoc 은 JVM 내에서 (즉, 모든 스레드에서) 관찰 된 모든 호출이 단조롭다는 것을 분명히합니다.

반환 된 값은 고정되었지만 임의의 원점 시간 (나중에 값이 음수 일 수 있음) 이후 나노초를 나타냅니다. Java 가상 머신의 인스턴스에서이 메소드의 모든 호출에서 동일한 오리진이 사용됩니다. 다른 가상 머신 인스턴스는 다른 오리진을 사용할 수 있습니다.

JVM / JDK 구현은 기본 OS 유틸리티가 호출 될 때 관찰 될 수있는 불일치를 해결하는 역할을합니다 (예 : Tom Anderson의 답변 에서 언급 된 ).

이 질문에 대한 다른 이전 답변의 대부분 (2009–2012 년에 작성)은 아마도 Java 5 또는 Java 6과 관련이 있지만 더 이상 최신 버전의 Java와 관련이없는 FUD를 표현합니다.

그러나 JDK 보증 nanoTime()의 안전 에도 불구하고 OpenJDK에는 특정 플랫폼이나 특정 상황 (예 : JDK-8040140 , JDK-8184271 ) 에서이 보증을 유지하지 못하도록하는 몇 가지 버그가있었습니다 . 현재 OpenJDK wrt에는 공개 (알려진) 버그가 nanoTime()없지만, 새로운 OpenJDK 릴리스에서 새로운 버그 나 회귀가 발견되면 누구에게도 충격을주지 않아야합니다.

이를 염두에두고, 시간 제한 차단, 간격 대기, 시간 초과 등에 사용 nanoTime()되는 코드는 예외를 발생시키는 것이 아니라 음의 시간 차이 (시간 초과)를 0으로 처리하는 것이 바람직합니다. 그것은 모든 클래스의 모든 시간 제한 대기 방법의 동작과 일치하기 때문에이 방법은 바람직하다 java.util.concurrent.*, 예를 들어 Semaphore.tryAcquire(), Lock.tryLock(), BlockingQueue.poll(), 등

그럼에도 불구하고, nanoTime()시간 차단, 인터벌 대기, 타임 아웃 등을 구현하기 위해 여전히 선호되어야한다. currentTimeMillis()왜냐하면 후자는 "시간이 거꾸로 돌아가는"현상 (예 : 서버 시간 수정으로 인해)에 영향을 받기 때문이다. 즉, currentTimeMillis()시간 간격 측정에 적합하지 않기 때문이다. 조금도. 자세한 내용은 이 답변 을 참조하십시오.

사용하는 대신 nanoTime()직접적으로 코드 실행 시간 측정을 위해 전문 벤치마킹 체계와 프로파일은 바람직하게는 예를 들면, 표기 JMH비동기 프로파일벽 프로파일 클록 모드 .


10

면책 조항 : 나는이 도서관의 개발자입니다

당신은 이것을 더 좋아할 것입니다 :

http://juliusdavies.ca/nanotime/

그러나 DLL 또는 Unix .so (공유 객체) 파일을 현재 사용자의 홈 디렉토리에 복사하여 JNI를 호출 할 수 있습니다.

일부 배경 정보는 다음 사이트의 내 사이트에 있습니다.

http://juliusdavies.ca/posix_clocks/clock_realtime_linux_faq.html


@Julius 사이트에서 라이브러리를 제거 했습니까?
Nitin Dandriyal

6

Linux는 CPU 간의 불일치를 수정하지만 Windows는 그렇지 않습니다. System.nanoTime ()이 약 1 마이크로 초까지만 정확하다고 가정합니다. 더 긴 타이밍을 얻는 간단한 방법은 foo ()를 1000 번 이상 호출하고 시간을 1000으로 나누는 것입니다.


2
(Linux 및 Windows에서 동작) 참조를 제공 할 수 있습니까?
jfs

불행히도 제안 된 방법은 일반적으로 +/- 100ms 벽시계 업데이트 슬롯으로 떨어지는 각 이벤트가 1 초 미만의 작업에서 0을 반환하기 때문에 매우 부정확합니다. 지속 시간이 0 인 각 9 개의 연산의 합은 0으로 나눈 값을 9로 나눈 값은 0입니다. 반대로 System.nanoTime ()을 사용하면 비교적 정확한 (0이 아닌) 이벤트 지속 시간을 제공 할 수 있으며,이를 이벤트 수로 합산하고 나눈 결과는 매우 정확한 평균을 제공합니다.
Darrell Teague

@DarrellTeague 1000 개의 이벤트를 합산하여 추가하는 것은 종료 시간과 동일합니다.
피터 로리

@DarrellTeague System.nanoTime ()은 대부분의 시스템에서 1 마이크로 초 이상 (10 만 마이크로 초가 아님)까지 정확합니다. 많은 작업의 평균을 계산하는 것은 몇 마이크로 초에 도달 할 때만 특정 시스템에서만 관련됩니다.
피터 로리

1
"합산"이벤트에 사용 된 언어에 대한 혼동이 있었기 때문에 사과합니다. 예, 1000 초 미만의 초 작업이 시작될 때 시간이 표시되면 시간이 흐른 후 다시 표시되어 나누어집니다. 이는 개발중인 일부 시스템에서 주어진 기간 동안의 근사치를 얻기 위해 작동합니다. 행사.
Darrell Teague

5

절대 쓸모가 없습니다. 타이밍 애호가들은 멀티 코어 문제를 정확하게 지적하지만 실제 응용 프로그램에서는 종종 currentTimeMillis ()보다 근본적으로 좋습니다.

프레임 새로 고침에서 그래픽 위치를 계산할 때 nanoTime ()은 내 프로그램에서 훨씬 부드러운 움직임을 유발합니다.

그리고 나는 멀티 코어 머신에서만 테스트합니다.


5

System.nanoTime ()을 사용하여 음의 경과 시간이보고되었습니다. 분명히하기 위해 문제의 코드는 다음과 같습니다

    long startNanos = System.nanoTime();

    Object returnValue = joinPoint.proceed();

    long elapsedNanos = System.nanoTime() - startNanos;

변수 'elapsedNanos'는 음수 값을 가졌습니다. (중간 통화도 293 년도 걸리지 않았으며, 이는 오랫동안 저장된 나노의 오버플로 포인트입니다.)

이것은 AIX를 실행하는 IBM P690 (멀티 코어) 하드웨어에서 IBM v1.5 JRE 64 비트를 사용하여 발생했습니다. 이 오류는 한 번만 발생하므로 매우 드문 것 같습니다. 나는 그 원인을 모른다-그것은 하드웨어 관련 문제, JVM 결함-모르겠다. 또한 nanoTime ()의 정확성에 대한 일반적인 의미를 모릅니다.

원래 질문에 대답하기 위해 nanoTime이 쓸모가 없다고 생각합니다. 밀리 초 미만의 타이밍을 제공하지만 실제로 이론적으로는 정확하지 않을 위험이 있으므로 고려해야합니다.


아아, 일부 OS / 하드웨어 문제 인 것 같습니다. 문서에 따르면 핵심 값은 음수 일 수 있지만 (더 큰 음수에서 더 작은 음수) 여전히 양수 값이어야합니다. 실제로 동일한 스레드에서 nanoTime () 호출은 항상 양수 또는 음수 값을 반환해야한다는 가정이 있습니다. 수년에 걸쳐 다양한 유닉스와 Windows 시스템에서 이것을 본 적이 없지만 특히 하드웨어 / OS가이 겉보기 작업을 프로세서에 분산시키는 경우에 특히 들릴 수 있습니다.
Darrell Teague

@BasilVandegriend 그것은 어디서나 버그가 아닙니다. 문서에 따르면 예제의 두 번째 System.nanoTime ()이 다른 CPU에서 실행될 수 없으며 해당 CPU에서 계산 된 nanoTime 값이 첫 번째 CPU에서 계산 된 값보다 낮을 수 있습니다. 따라서 elapsedNanos의 -ve 값이 가능합니다
끝없는

2

Windows XP 및 JRE 1.5.0_06을 실행하는 Core 2 Duo에서는 문제가되지 않습니다.

세 개의 스레드가있는 테스트에서 System.nanoTime ()이 거꾸로 보이지 않습니다. 프로세서가 모두 사용 중이며 스레드가 때때로 움직이면서 스레드 이동을 유발합니다.

[편집] 물리적으로 분리 된 프로세서에서만 발생한다고 생각합니다. 즉, 카운터는 동일한 다이의 여러 코어에 대해 동기화됩니다.


2
아마도 항상 발생하지는 않지만 nanotime () 구현 방식으로 인해 항상 가능성이 있습니다.
pdeva

물리적으로 분리 된 프로세서에서만 발생한다고 생각합니다. 즉, 카운터는 동일한 다이의 여러 코어에 대해 동기화됩니다.
starblue

심지어 특정 구현 IIRC에 따라 다릅니다. 그러나 그것은 OS가 처리 해야하는 것입니다.
Blaisorblade

1
동일한 x86 프로세서의 여러 코어에있는 RDTSC 카운터는 반드시 동기화 될 필요는 없습니다. 일부 최신 시스템에서는 다른 코어가 다른 속도로 실행되도록합니다.
Jules

2

아니요, 아닙니다 ... CPU에 따라 다릅니다. 고정밀 이벤트 타이머 에서 CPU에 따라 사물이 어떻게 / 왜 다르게 처리되는지 확인하십시오 .

기본적으로 Java 소스를 읽고 버전이 함수에서 수행하는 작업을 확인하고 CPU에 대해 작동하면 실행됩니다.

IBM 은 성능 벤치마킹 (2008 년 게시물이지만 업데이트) 에이 제품 을 사용할 것을 제안 합니다.


모든 구현에서 bahaviour를 정의했듯이 "caveat emptor!"
David Schmitt

2

Peter Lawrey가 좋은 답변을 제공하는 동일한 토론이 본질적으로 무엇인지에 연결되어 있습니다. System.nanoTime ()을 사용하여 음의 경과 시간을 얻는 이유는 무엇입니까?

많은 사람들이 Java System.nanoTime ()에서 음수 시간을 반환 할 수 있다고 언급했습니다. 다른 사람들이 이미 말한 것을 반복해서 사과드립니다.

  1. nanoTime ()은 클럭이 아니라 CPU주기 카운터입니다.
  2. 반환 값은 시간처럼 보이도록 주파수로 나뉩니다.
  3. CPU 주파수가 변동될 수 있습니다.
  4. 스레드가 다른 CPU에서 예약되면 nanoTime ()이 발생하여 부정적인 차이가 생길 수 있습니다. 논리적입니다. CPU 간 카운터는 동기화되지 않습니다.
  5. 대부분의 경우 오해의 소지가있는 결과를 얻을 수 있지만 델타가 음수가 아니기 때문에 알 수 없습니다. 생각 해봐
  6. (확인되지 ​​않음) 명령이 재정렬되면 동일한 CPU에서도 부정적인 결과를 얻을 수 있다고 생각합니다. 이를 방지하려면 지침을 직렬화하는 메모리 장벽을 호출해야합니다.

System.nanoTime ()이 실행 된 곳에서 coreID를 반환하면 멋집니다.


1
3과 5를 제외한 모든 점이 잘못되었습니다. 1. nanoTime ()은 CPU주기 카운터가 아니며 나노 시간 입니다. 2. nanoTime 값이 생성되는 방식은 플랫폼에 따라 다릅니다. 4. 아니요, nanoTime () 사양에 따르면 차이는 음수 일 수 없습니다. OpenJDK에 wrt nanoTime () 버그가없고 현재 알려진 해결되지 않은 버그가 없다고 가정합니다. 6. nanoTime 호출은 기본 메소드이므로 JVM은 프로그램 순서를 존중하므로 스레드 내에서 재정렬 할 수 없습니다. JVM은 기본 메소드 호출의 순서를 알지 못하므로 기본 메소드 호출의 순서를 다시 지정하지 않으므로 그러한 재정렬이 안전하다는 것을 증명할 수 없습니다.
leventov 2019

5. nanoTime ()과 관련하여 차이 결과는 실제로 오해를 불러 일으킬 수 있지만,이 비호의 다른 점에서 제시된 이유는 아닙니다. 그러나 오히려 이유는 여기에 제시된 : shipilev.net/blog/2014/nanotrusting-nanotime
leventov을

아이러니하게도 6. OpenJDK에는 특히 reorderings로 인한 버그가있었습니다 : bugs.openjdk.java.net/browse/JDK-8184271 . OpenJDK에서 nanoTime ()은 본질적이며 버그를 재정렬하도록 허용되었습니다.
leventov 2019

@leventov, nanotime ()을 사용하는 것이 안전합니까? 즉, 음수 값을 반환 할 수 없으며 시간이 지날수록 정확합니다. 문제가 수수께끼 인 API 함수를 노출시키는 것이 보이지 않습니다. 이 포스트는 증거는 2009 년에 시작 여전히 미션 크리티컬 한 물건의 경우 2019 년에 주석, 나는 사람들이 Symmetricom 같은 타이밍 카드에 의존 상상
소용돌이

1
귀하의 # 4는 값이 아닌 음의 차이 에 대해 말합니다 . "음의 차이를 초래하는 nanoTime ()을 얻을 가능성이 있습니다."
leventov

1

Java는 크로스 플랫폼이며 nanoTime은 플랫폼에 따라 다릅니다. Java를 사용하는 경우-nanoTime을 사용하지 않는 경우 이 기능으로 다른 jvm 구현에서 실제 버그를 발견했습니다.


0

Java 5 문서에서도 동일한 방법으로이 방법을 사용할 것을 권장합니다.

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

자바 5 API 문서


0

또한 System.currentTimeMillies()시스템 시계를 변경할 때 변경 되지만 변경 System.nanoTime()되지 않으므로 시간을 측정하는 것이 더 안전합니다.


-3

nanoTime타이밍이 매우 안전하지 않습니다. 나는 기본 우선 순위 테스트 알고리즘에서 시도해 보았고 동일한 입력에 대해 문자 그대로 1 초 간격으로 대답했습니다. 그 우스운 방법을 사용하지 마십시오. 시간을 얻는 것보다 정확하고 정확한 것이 필요하지만 나쁘지는 않습니다 nanoTime.


소스 나 더 나은 설명이
없다면
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.