Java 7'den beri, System.nanoTime()
JDK belirtimi ile güvenli olduğu garanti edilmektedir. System.nanoTime()
Javadoc , bir JVM (yani, tüm iş parçacıkları arasında) içinde gözlemlenen tüm çağrıların monotonik olduğunu açıkça ortaya koymaktadır:
Döndürülen değer, sabit ancak keyfi bir başlangıç zamanından bu yana nanosaniyeyi temsil eder (belki de gelecekte, bu nedenle değerler negatif olabilir). Aynı kaynak, Java sanal makinesinin bir örneğinde bu yöntemin tüm çağrıları tarafından kullanılır; diğer sanal makine örneklerinin farklı bir başlangıç noktası kullanması muhtemeldir.
JVM / JDK uygulaması, temel OS yardımcı programları çağrıldığında gözlemlenebilecek tutarsızlıkları gidermekten sorumludur (örneğin, Tom Anderson'ın cevabında belirtilenler) ).
Bu soruya verilen diğer eski cevapların çoğu (2009-2012'de yazılmıştır), muhtemelen Java 5 veya Java 6 için geçerli olan ancak artık Java'nın modern sürümleri için geçerli olmayan FUD'yi ifade etmektedir.
Bununla birlikte, JDK garantilerinin nanoTime()
güvenliğine rağmen , OpenJDK'da belirli platformlarda veya belirli koşullarda bu garantiyi desteklememesini sağlayan birkaç hata olduğunu belirtmek gerekir (örn. JDK-8040140 , JDK-8184271 ). Şu nanoTime()
anda OpenJDK wrt'de açık (bilinen) hatalar yok , ancak yeni bir hatanın keşfedilmesi veya daha yeni bir OpenJDK sürümünde bir gerileme kimseyi şok etmemelidir.
Bunu göz önünde bulundurarak, zamanlanmış engelleme, aralık bekleme, zaman aşımları, vb. İçin kullanılan kod, nanoTime()
tercihen negatif zaman farklarını (zaman aşımları) istisnalar yerine sıfırlar olarak ele almalıdır. O tüm sınıflarda tüm zamanlanmış bekleme yöntemlerinin davranışları ile tutarlı olduğu için bu uygulama da tercih edilebilir java.util.concurrent.*
, örneğin Semaphore.tryAcquire()
, Lock.tryLock()
,BlockingQueue.poll()
vb
Bununla birlikte, nanoTime()
zamanlanmış engelleme, aralık bekleme, zaman aşımları vb. Uygulamak için yine de tercih edilmelidir, currentTimeMillis()
çünkü ikincisi "geriye doğru giden zaman" fenomenine (örn. Sunucu zaman düzeltmesi nedeniyle) tabidir, yani currentTimeMillis()
zaman aralıklarını ölçmek için uygun değildir hiç. Bu cevaba bakın fazla bilgi için .
nanoTime()
Doğrudan kod yürütme süresi ölçümlerinde kullanmak yerine, tercihen duvar saati profili oluşturma modunda JMH ve async-profiler gibi özel kıyaslama çerçeveleri ve profiller kullanılmalıdır .