2016-10-25 3 views
0

currentTimeMillis와 nanoTime에 대해 읽은 모든 것은 정확도에만 초점을 맞추는 것처럼 보입니다. 밀리 초 단위로만 경과 시간을 찾고 있다면 최상의 성능을 원한다면이 중 하나를 사용해야합니까?Java에서 경과 시간을 측정하는 가장 빠른 방법

마지막 답변을 ns에서 ms로 변환 할 필요가 없으므로 currentTimeMillis와 같은 것처럼 보입니다.하지만 이는 내 응용 프로그램의 관점에서 비롯된 것이며, 후드에서 진행되는 작업이 잘못된 선택이 될 수 있습니다. 내가 왜 묻는거야.

+0

저는 개인적으로 #currentTimeMillis를 사용합니다. 나노초 정밀도는 거의 필요하지 않으며, 이미 저울에서 작업하지 않는 한 두 가지 모두에서 발생할 수있는 부정확성은 중요하지 않습니다 (예 : 10 초 동안 확인하면 3 부정확성이 훨씬 적을지라도 -5ms의 부정확성으로 인해 죽지 않습니다.) 비록 iirC#currentTimeMillis 비교가 음수가 될 수 있지만, 그 규모 (10 밀리 초 간격으로 타이밍을 맞춘다)로 작업하지 않는 한, 다시는 매우 희박합니다. – Rogue

+0

nanoTime은 currentTimeMillis와 똑같은 정확도를 보입니다. 정밀도의 조건. * 더 빨리 * 당신이 내 이해를 위해 좀 더 명확해야합니다. –

+0

NTP, 사용자, 윤초 및 기타 소스는'currentTimeMillis'의 값을 변경하여 직접 측정을 완전히 잘못하는 경우가 있습니다. 너와 함께 살 수 있다면 그걸로 가야 해. 그렇지 않으면 엄격하게 단조로운 카운터 인 nanoTime을 사용하고 심각한 애플리케이션에 nanoTime을 사용해야하는 이유입니다. – zapl

답변

2

순수 Java에는 기본적으로 두 가지 옵션이 있습니다. 당신은 이미 선정했습니다

  • System.currentTimeMillis
  • System.nanoTime

두 가지 방법이 JVM 내장 함수입니다.
Linux에서는 각각 gettimeofday 또는 clock_gettime으로 직접 호출됩니다.
Windows의 경우 - GetSystemTimeAsFileTime 또는 QueryPerformanceCounter입니다.

이러한 방법의 성능은 플랫폼, CPU 아키텍처, OS 버전, Java 버전, 동시 스레드 수 등에 따라 크게 달라집니다. 내 Windows 노트북의 경우 currentTimeMillis은 7ns, nanoTime - 16ns가 걸리는 반면, 다중 프로세서 Linux 서버에서는 두 가지 방법 모두 약 40ns가 소요됩니다. 그래서, 그것은 달려 있습니다.

Alexey Shipilёv의 게시물 Nanotrusting the nanotime을 읽고 Java에서 시간 측정의 여러 측면을 다루는 것이 좋습니다.

2

currentTimeMillis를 사용하면 안됩니다. 경과 시간 측정에는 항상 nanoTime을 사용하십시오. 실제로 currentTimeMillis를 사용하면 부정적인 결과가 발생할 수 있습니다. 이것은 시스템 시계를 사용하기 때문입니다. 시스템 시계는 시간대의 시간으로 조정됩니다 (때로는 뒤로 이동합니다). nanoTime 메소드는 타이밍을 위해 정확하게 사용되는 JVM에 의해 시작된 시계를 사용합니다.

관련 문제