System.nanoTime () tamamen işe yaramaz mı?


153

Blog yayınında belgelendiği gibi Java System.nanoTime () sakının x86 sistemlerde, Java'nın System.nanoTime () bir kullanarak zaman değerini döndürür CPU belirli sayacı. Şimdi bir çağrının zamanını ölçmek için kullandığım aşağıdaki durumu göz önünde bulundurun:

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

Şimdi çok çekirdekli bir sistemde, zamanı1 ölçtükten sonra, iş parçacığı sayacı önceki CPU'dan daha az olan farklı bir işlemciye programlanmış olabilir. Böylece time2'de time1'den daha az bir değer elde edebiliriz . Böylece timeSpent'te negatif bir değer elde ederiz.

Bu durum düşünüldüğünde, System.nanotime şimdilik şimdilik işe yaramaz değil mi?

Sistem zamanının değiştirilmesinin nanotim süresini etkilemediğini biliyorum. Yukarıda tarif ettiğim sorun bu değil. Sorun, her CPU'nun açıldığından beri farklı bir sayaç tutmasıdır. Bu sayaç ikinci CPU'da birinci CPU'ya göre daha düşük olabilir. İş parçacığı time1 aldıktan sonra işletim sistemi tarafından ikinci CPU'ya programlanabildiğinden, timeSpent değeri yanlış ve hatta negatif olabilir.


2
Cevabım yok ama sana katılıyorum. Belki de JVM'de bir hata olarak düşünülmelidir.
Aaron Digulla

2
bu yazı yanlıştır ve TSC kullanmamak yavaştır ancak bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440250 TSC hipervizör aracılığıyla da kullanılabilir hale getirilebilir, ancak yine yavaşlar.
bestsss

1
Ve tabii ki, bir CPU'nun bir oturum
Sınırlı Kefaret

Yanıtlar:


206

Bu cevap, 2011 yılında, zamanın işletim sistemlerinde çalışan Sun JDK'nın gerçekte ne yaptığı konusunda yazılmıştır. Çok uzun zaman önceydi! leventov'un cevabı daha güncel bir bakış açısı sunuyor.

Bu yazı yanlış ve nanoTimegüvende. Sun hakkında, Sun'da gerçek zamanlı ve eşzamanlı bir adam olan David Holmes'un bir blog yayınına bağlantı veren bir yorum var . Diyor ki:

System.nanoTime (), QueryPerformanceCounter / QueryPerformanceFrequency API'sini kullanarak uygulanır [...] QPC tarafından kullanılan varsayılan mekanizma Donanım Soyutlama katmanı (HAL) tarafından belirlenir [...] Bu varsayılan yalnızca donanımda değil, aynı zamanda işletim sisteminde de değişir sürümleri. Örneğin, Windows XP Service Pack 2, TSC'nin SMP sistemlerindeki farklı işlemcilerde eşitlenmemesi ve sıklığı nedeniyle işlemci zaman damgası sayacı (TSC) yerine güç yönetimi zamanlayıcısını (PMTimer) kullanmak için bazı şeyleri değiştirdi güç yönetimi ayarlarına bağlı olarak değişebilir (ve dolayısıyla geçen zamanla ilişkisi).

Yani, Windows üzerinde, bu oldu WinXP SP2 kadar bir sorun, ama şimdi değil.

Diğer platformlar hakkında konuşan bir bölüm II (veya daha fazla) bulamıyorum, ancak bu makalede Linux'un aynı sorunla karşılaştığı ve aynı şekilde çözdüğü ve saat_gettime (CLOCK_REALTIME) ile ilgili SSS bağlantısıyla bir açıklama var diyor ki:

  1. Clock_gettime (CLOCK_REALTIME) tüm işlemciler / çekirdekler arasında tutarlı mı? (Arch önemli mi? Örn. Ppc, kol, x86, amd64, sparc).

Bu should veya hatalı olarak kabul edilir.

Ancak, x86 / x86_64'te, senkronize edilmemiş veya değişken frekans TSC'lerinin zaman tutarsızlıklarına neden olduğunu görmek mümkündür. 2.4 çekirdeklerin buna karşı hiçbir koruması yoktu ve 2.6 çekirdek de burada çok iyi sonuç vermedi. 2.6.18'den itibaren bunu tespit mantığı daha iyidir ve genellikle güvenli bir saat kaynağına geri döneriz.

ppc her zaman senkronize edilmiş bir zaman tabanına sahiptir, bu yüzden bir sorun olmamalıdır.

Holmes'ın bağlantısı bu nanoTimeçağrıları ima etmek olarak okunabiliyorsa clock_gettime(CLOCK_REALTIME), o zaman x86'da 2.6.18 çekirdeği ve her zaman PowerPC'de güvenlidir (çünkü Intel'in aksine, Intel ve Motorola mikroişlemcilerin nasıl tasarlanacağını biliyorlar).

Ne yazık ki SPARC veya Solaris'ten bahsedilmiyor. Ve elbette, IBM JVM'lerinin ne yaptığı hakkında hiçbir fikrimiz yok. Ancak modern Windows ve Linux'taki Sun JVM'leri bunu doğru yapıyor.

EDIT: Bu cevap alıntı yaptığı kaynaklara dayanmaktadır. Ama yine de aslında tamamen yanlış olabileceğinden endişeleniyorum. Bazı daha güncel bilgiler gerçekten değerli olacaktır. Linux'un saatleri hakkında faydalı olabilecek dört yıllık daha yeni bir makaleye bağlantıya geldim .


13
WinXP SP2 bile acı çekiyor gibi görünüyor. Orijinal kod örneğini çalıştırarak, void foo() { Thread.sleep(40); }tek bir Athlon 64 X2 4200+işlemci kullanarak negatif bir zaman (-380 ms!)
Aldım

Sanırım bu konuda güncelleme var, wrt. Linux, BSD veya diğer platformlardaki davranışlar?
Tomer Gabel

6
İyi cevap, bu konunun daha yeni keşfine bir bağlantı eklemelidir: shipilev.net/blog/2014/nanotrusting-nanotime
Nitsan Wakart

1
@SOFe: Oh, bu bir utanç. Bu ise internet arşivindenNeyse ki . Mevcut bir sürümü izleyip izleyemeyeceğimi göreceğim.
Tom Anderson

1
Not: OpenJDK OpenJDK 8u192 kadar spec kadar korumak vermedi bkz bugs.openjdk.java.net/browse/JDK-8184271 . En az OpenJDK 8 veya OpenJDK 11+ sürümlerini kullandığınızdan emin olun.
leventov

35

Biraz araştırma yaptım ve eğer bilgiçlik taslayan bir şey varsa, o zaman evet işe yaramaz olarak düşünülebilir ... belirli durumlarda ... ihtiyaçlarınızın ne kadar hassas olduğuna bağlı ...

Java Sun sitesinden bu alıntıya göz atın :

Gerçek zamanlı saat ve System.nanoTime () aynı sistem çağrısını ve dolayısıyla aynı saati temel alır.

Java RTS ile, tüm zaman tabanlı API'ler (örneğin, Zamanlayıcılar, Periyodik Konular, Son Tarih İzleme ve benzeri) yüksek çözünürlüklü zamanlayıcıya dayanır. Ve gerçek zamanlı önceliklerle birlikte, gerçek zamanlı kısıtlamalar için uygun kodun doğru zamanda yürütülmesini sağlayabilirler. Buna karşılık, sıradan Java SE API'leri, belirli bir zamanda yürütme garantisi olmadan yüksek çözünürlüklü süreleri yönetebilen birkaç yöntem sunar. Geçen zaman ölçümlerini gerçekleştirmek için koddaki çeşitli noktalar arasında System.nanoTime () kullanılması her zaman doğru olmalıdır.

Java'nın ayrıca nanoTime () yöntemi için bir uyarısı vardır :

Bu yöntem yalnızca geçen süreyi ölçmek için kullanılabilir ve diğer sistem veya duvar saati zamanı kavramlarıyla ilgili değildir. Döndürülen değer, sabit ama keyfi bir zamandan beri nanosaniyeyi temsil eder (belki de gelecekte, bu nedenle değerler negatif olabilir). Bu yöntem nanosaniye hassasiyet sağlar, ancak mutlaka nanosaniye doğruluğu sağlamaz. Değerlerin ne sıklıkta değiştiği konusunda hiçbir garanti verilmez. Yaklaşık 292,3 yıldan (2 63 nanosaniye) daha uzun süren ardışık çağrılardaki farklılıklar, sayısal taşma nedeniyle geçen süreyi doğru bir şekilde hesaplamayacaktır.

Çıkarılabilecek tek sonuç, nanoTime () 'a doğru bir değer olarak güvenilemeyeceğidir. Bu nedenle, sadece nano saniye aradaki zamanları ölçmeniz gerekmiyorsa, sonuçta elde edilen döndürülen değer negatif olsa bile bu yöntem yeterince iyidir. Ancak, daha yüksek hassasiyete ihtiyacınız varsa, JAVA RTS kullanmanızı tavsiye ediyorlar.

Sorunuzu cevaplamak için ... hiçbir nanoTime () işe yaramaz değil .... her durumda kullanmak için en ihtiyatlı yöntem değildir.


3
> sonuçta elde edilen değer negatif olsa bile bu yöntem yeterince iyidir. Bunu alamadım, eğer zamana göre değer negatifse, o zaman foo () 'da alınan zamanı ölçmede ne kadar yararlıdır?
pdeva

3
Tamam, çünkü endişelentiğiniz tek şey farkın mutlak değeridir. ölçümünüz zaman t = t2 - t1 olduğunda t ise o zaman | t | .... bilmek istersiniz, yani değer negatifse ... çok çekirdekli problemde bile etki nadiren birkaç olacak yine de nanosaniye.
mezoid

3
@Aaron'u yedeklemek için: hem t2 hem de t1 negatif olabilir, ancak (t2-t1) negatif olmamalıdır.
jfs

2
aaron: tam olarak benim amacım bu. t2-t1 asla negatif olmamalı, aksi takdirde bir hata var.
pdeva

12
@pdeva - ama doktorun söylediklerini yanlış anlıyorsunuz. Sen bir sorun çıkarıyorsun. Zaman içinde "0" olarak kabul edilen bir nokta vardır. NanoTime () tarafından döndürülen değerler o zamana göre doğrudur. Monoton olarak artan bir zaman çizelgesi. Bu zaman çizelgesinin negatif kısmından bir dizi sayı alıyor olabilirsiniz. -100, -99, -98(Pratikte belli ki çok daha büyük değerler). Doğru yöne gidiyorlar (artıyorlar), bu yüzden burada bir sorun yok.
ToolmakerSteve

18

Tartışmaya gerek yok, sadece kaynağı kullanın. Burada, Linux için SE 6, kendi sonuçlarınızı verin:

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
Bu, yalnızca kullanılan API'nın ne yaptığını biliyorsanız faydalıdır. Kullanılan API işletim sistemi tarafından uygulanır; bu kod doğru wrt. kullanılan API'nin özellikleri (clock_gettime / gettimeofday), ancak diğerlerinin de belirttiği gibi, bazı güncel olmayan işletim sistemleri buggy uygulamalarına sahiptir.
Blaisorblade

18

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 .



6

Linux, CPU'lar arasındaki tutarsızlıkları düzeltir, ancak Windows yapmaz. System.nanoTime () işlevinin yalnızca yaklaşık 1 mikro saniye hassasiyette olduğunu varsayalım. Daha uzun bir zamanlama elde etmenin basit bir yolu, foo () 1000 veya daha fazlasını çağırmak ve zamanı 1000'e bölmektir.


2
Bir referans verebilir misiniz (Linux ve Windows'taki davranış)?
jfs

Ne yazık ki önerilen yöntem genellikle son derece kesin olmayacaktır, çünkü +/- 100ms duvar saati güncelleme yuvasına düşen her olay ikinci saniye işlemleri için genellikle sıfıra dönecektir. Her biri sıfır olan 9 işlemin toplamı, sıfır, dokuz, bölü ... sıfırdır. Bunun tersine, System.nanoTime () yönteminin kullanılması nispeten doğru (sıfır olmayan) olay süreleri sağlar ve bu olay daha sonra toplanır ve olay sayısına bölünür, son derece hassas bir ortalama sağlar.
Darrell Teague

@DarrellTeague 1000 etkinliği toplayıp bunları toplayarak bitiş zamanı ile aynıdır.
Peter Lawrey

@ DarrellTeague System.nanoTime () çoğu sistemde 1 mikro saniye veya daha iyi (100.000 mikrosaniye değil) doğrudur. Birçok işlemin ortalaması yalnızca birkaç mikro saniyeye indiğinizde ve yalnızca belirli sistemlerde geçerlidir.
Peter Lawrey

1
Özür dilerim, "toplama" olaylarında kullanılan dil konusunda biraz karışıklık vardı. Evet, zaman 1000 saniyelik ikinci işlemlerin başında işaretlenirse, çalışırlar ve sonra zaman sonunda tekrar işaretlenir ve bölünürler - bu, belirli bir süre için iyi bir yaklaşık yaklaşım elde etmek için geliştirilmekte olan bazı sistemlerde işe yarayacaktır. Etkinlik.
Darrell Teague

5

Kesinlikle işe yaramaz. Zamanlama meraklıları çok çekirdekli sorunu doğru bir şekilde gösteriyor, ancak gerçek sözcük uygulamalarında genellikle currentTimeMillis () 'den radikal olarak daha iyi.

Çerçeve yenilemelerindeki grafik konumlarını hesaplarken nanoTime (), programımda ÇOK daha yumuşak harekete yol açar.

Ve sadece çok çekirdekli makinelerde test ediyorum.


5

System.nanoTime () kullanarak bildirilen negatif geçen süreyi gördüm . Açık olmak gerekirse, söz konusu kod:

    long startNanos = System.nanoTime();

    Object returnValue = joinPoint.proceed();

    long elapsedNanos = System.nanoTime() - startNanos;

ve 'elapsedNanos' değişkeninin negatif bir değeri vardı. (Ara aramanın 293 yıldan daha az sürdüğünden de eminim, bu da uzun süre depolanan nanolar için taşma noktasıdır :)

Bu, AIX çalıştıran IBM P690 (çok çekirdekli) donanımda bir IBM v1.5 JRE 64bit kullanılarak meydana geldi. Bu hatanın sadece bir kez oluştuğunu gördüm, bu yüzden çok nadir görünüyor. Nedenini bilmiyorum - bu donanıma özgü bir sorun mu, bir JVM hatası mı - bilmiyorum. Ayrıca genel olarak nanoTime () 'in doğruluğu için ne anlama geldiğini bilmiyorum.

Orijinal soruyu cevaplamak için nanoTime'ın işe yaramaz olduğunu düşünmüyorum - milisaniyenin altında bir zamanlama sağlıyor, ancak dikkate almanız gereken yanlış (sadece teorik değil) gerçek bir risk var.


Ne yazık ki, bazı işletim sistemi / donanım sorunu gibi görünüyor. Dokümantasyon, temel değerlerin negatif olabileceğini ancak (daha büyük negatif eksi daha küçük negatif) yine de pozitif bir değer olması gerektiğini belirtmektedir. Aslında, aynı iş parçacığında nanoTime () çağrısının her zaman pozitif veya negatif bir değer döndürmesi gerektiği varsayımıdır. Uzun yıllar boyunca çeşitli Unix ve Windows sistemlerinde bunu hiç görmedim, ancak özellikle donanım / işletim sistemi bu atomik işlemi işlemciler arasında bölüyorsa, sesler mümkün.
Darrell Teague

@BasilVandegriend hiçbir yerde bir hata değil. Belgelere göre, örneğinizdeki nadiren ikinci System.nanoTime () farklı bir CPU'da çalışabilir ve bu CPU'da hesaplanan nanoTime değerleri ilk CPU'da hesaplanan değerlerden daha düşük olabilir. Bu nedenle, geçenNanos için -ve değeri mümkündür
sonsuz

2

Bu, Windows XP ve JRE 1.5.0_06 çalıştıran Core 2 Duo için bir sorun gibi görünmüyor.

Üç iş parçacıklı bir testte System.nanoTime () 'ın geriye doğru gittiğini görmüyorum. İşlemciler hem meşgul, hem de dişler etrafta hareket eden iplikleri kışkırtmak için ara sıra uyuyor.

[EDIT] Bunun yalnızca fiziksel olarak ayrı işlemcilerde gerçekleştiğini, yani sayaçların aynı kalıpta birden çok çekirdek için senkronize edildiğini tahmin ediyorum.


2
Muhtemelen her zaman olmayacak, ancak nanotim () uygulamasından dolayı olasılık her zaman oradadır.
pdeva

Sadece fiziksel olarak ayrı işlemcilerde gerçekleştiğini, yani sayaçların aynı kalıpta birden çok çekirdek için senkronize olduğunu tahmin ediyorum.
starblue

Bu bile spesifik uygulamaya, IIRC'ye bağlıdır. Ama bu işletim sisteminin ilgilenmesi gereken bir şey.
Blaisorblade

1
Aynı x86 işlemcinin birden çok çekirdeğindeki RDTSC sayaçları mutlaka eşitlenmez - bazı modern sistemler farklı çekirdeklerin farklı hızlarda çalışmasına izin verir.
Jules

2

Hayır, değil ... Sadece CPU'nuza bağlı, Yüksek Hassasiyetli Etkinlik Zamanlayıcısını kontrol edin şeylerin CPU'ya göre nasıl farklı şekilde / neden tedavi edildiğini öğrenmek için .

Temel olarak, Java'nızın kaynağını okuyun ve sürümünüzün işlevle ne yaptığını kontrol edin ve CPU'ya karşı çalışıyorsa, üzerinde çalışacaksınız.

IBM , performans karşılaştırması (2008 tarihli ancak güncellenmiş) için bile kullanmanızı önerir .


Tüm uygulama tanımlandığı gibi, "uyarı emptor!"
David Schmitt

2

Peter Lawrey'in iyi bir cevap verdiği aynı tartışmanın temelini oluşturuyorum. Neden System.nanoTime () kullanarak negatif geçen bir zaman alıyorum?

Birçok kişi Java System.nanoTime () içinde negatif zaman dönebileceğini belirtti. Başkalarının söylediklerini tekrarladığı için özür dilerim.

  1. nanoTime () bir saat değil, CPU döngü sayacıdır.
  2. Dönüş değeri zamana benzemek için frekansa bölünür.
  3. CPU frekansı dalgalanabilir.
  4. İş parçacığınız başka bir CPU'da zamanlandığında, nanoTime () alma şansı vardır ve bu da negatif bir farkla sonuçlanır. Bu mantıklı. CPU'lar arasındaki sayaçlar senkronize edilmez.
  5. Çoğu durumda, oldukça yanıltıcı sonuçlar elde edebilirsiniz, ancak delta negatif olmadığından söyleyemezsiniz. Bunu düşün.
  6. (onaylanmadı) Talimatlar yeniden sıralanırsa, aynı CPU'da bile olumsuz bir sonuç alabileceğinizi düşünüyorum. Bunu önlemek için, talimatlarınızı serileştiren bir bellek bariyeri çağırmanız gerekir.

System.nanoTime () çalıştırıldığı yerde coreID döndürürse çok iyi olurdu.


1
3. ve 5. dışındaki tüm noktalar yanlış. 1. nanoTime () bir CPU döngü sayacı değil, nano zaman . 2. nanoTime değerinin nasıl üretildiği platforma özgüdür. 4. Hayır, nanoTime () özelliğine göre fark negatif olamaz. OpenJDK'nın nanoTime () wrt hatası olmadığını varsayarsak, şu anda bilinen hiçbir çözülmemiş hata yoktur. 6. nanoTime çağrıları yerel bir yöntem olduğundan ve JVM program sırasına saygı gösterdiği için bir evre içinde yeniden sıralanamaz. JVM hiçbir zaman yerel yöntem çağrılarını yeniden sıralamaz, çünkü bunların içinde ne olduğunu bilmez ve bu nedenle bu tür siparişlerin güvenli olacağını kanıtlayamaz.
leventov

5. nanoTime () farkıyla ilgili sonuçlar gerçekten yanıltıcı olabilir, ancak bu asnwer'ın diğer noktalarında sunulan nedenlerden dolayı olmayabilir. Ancak daha ziyade burada sunulan nedenlerden dolayı: shipilev.net/blog/2014/nanotrusting-nanotime
leventov

İronik olarak, 6. ile ilgili olarak OpenJDK'da özellikle yeniden sıralamalar nedeniyle bir hata oluştu: bugs.openjdk.java.net/browse/JDK-8184271 . OpenJDK'da, nanoTime () bir içseldir ve yeniden sıralanmasına izin verildi, bu bir hataydı.
leventov

@ leventov, nanotime () kullanımı güvenli midir? yani, negatif değerler döndüremez ve zaman geçtikçe doğrudur. Sorunlarla dolu bir API işlevini açığa vurma noktasını görmüyorum. Bu yazı, 2009'da başlayan ve 2019'da hala yorum yapılan bir kanıttır. Kritik görevler için insanların Symmetricom
Vortex

1
# 4'ünüz değerler değil, negatif fark hakkında diyor : "nanoTime () elde etme şansı var, bu da negatif bir farkla sonuçlanıyor."
leventov

1

Java çapraz platformdur ve nanoTime platforma bağlıdır. Java kullanıyorsanız - nanoTime kullanmadığınız zaman. Bu işlevle farklı jvm uygulamalarında gerçek hatalar buldum.


0

Java 5 belgeleri de bu yöntemin aynı amaçla kullanılmasını önerir.

Bu yöntem yalnızca geçen süreyi ölçmek için kullanılabilir ve başka herhangi bir sistem veya duvar saati zamanı kavramıyla ilgili değildir.

Java 5 API Belgesi


0

Ayrıca, System.currentTimeMillies()sistem saatinizi değiştirdiğinizde değişir, ancak System.nanoTime()değişmez, böylece ikincisi süreleri ölçmek için daha güvenlidir.


-3

nanoTimezamanlama için son derece güvensizdir. Temel öncelik test algoritmaları üzerinde denedim ve aynı girdi için tam anlamıyla bir saniye arayla cevaplar verdi. Bu saçma yöntemi kullanmayın. Zaman milisinden daha doğru ve kesin bir şeye ihtiyacım var, ama o kadar da kötü değil nanoTime.


bir kaynak ya da daha iyi bir açıklama olmadan bu yorum işe yaramaz
ic3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.