SORU
4 ŞUBAT 2009, ÇARŞAMBA


Sistemidir.() nanoTime tamamen faydasız mı?

Blog yazısı belirtildiği gibiBeware of System.nanoTime() in Java86 sistemleri , Java Sistemi.() nanoTime zaman CPU belirli bir sayaç değeri döndürür. Şimdi düşünün bir aramanın zamanı ölçmek için kullandığım şu durumda:

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

Çok çekirdekli bir sistemde şimdi, önceki CPU daha az olan farklı bir işlemci için iplik planlanıyor notdatetime1, ölçüm sonra olabilir. Böylece hangi time2 bir değer elde edebilirizdaha aznotdatetime1. Böylece timeSpent negatif bir değer elde ederiz.

Bu durum göz önüne alındığında, bu Sistem değil.nanotime şimdilik etkisiz kalıyor?

Sistem saatini değiştirme nanotime etkilemez biliyorum. Bunu yukarıda tarif sorun değil. Sorun her CPU açık olduğu için farklı bir sayaç tutar. Bu sayaç, ikinci CPU ilk CPU kıyasla daha düşük olabilir. Konu notdatetime1, timeSpent değeri Yanlış olabilir ve hatta negatif aldıktan sonra ikinci CPU işletim sistemi tarafından planlanmış olabilir beri.

CEVAP
3 Ocak 2011, PAZARTESİ


Bu yazı yanlış, ve nanoTime güvenlidir. a blog post by David Holmes, Güneşe, gerçek zamanlı ve eş zamanlı bir adama bağlayan bir yazı üzerine bir yorum var. Diyor ki:

Sistem.nanoTime() uygulanır kullanarak QueryPerformanceCounter/QueryPerformanceFrequency API [...] varsayılan mekanizması tarafından kullanılan QPC tarafından belirlenir Donanım Soyutlama katmanı(HAL) [...] Bu varsayılan değişiklikler arasında donanım değil sadece, aynı zamanda üzerinde OS sürümleri. Örneğin, Windows XP Service Pack 2 değişen şeyleri kullanmak için güç yönetimi Zamanlayıcısı (PMTimer) yerine işlemci zaman damgası sayacı (TSK) kaynaklanan sorunlar ile TSK olmamak senkronize farklı işlemciler SMU sistemleri, ve nedeniyle gerçek sıklığı değişebilir (ve dolayısıyla onun ilişki için geçen süre) göre güç yönetimi ayarları.

Yani, Windows, buolduama şimdi değil SP2, Vista kadar bir sorun.

Bulamıyorum bir Bölüm II (veya daha fazla) bu görüşmeler hakkında diğer platformlar, ama bu yazıda olduğu gibi vardır bir işaret var Linux ile karşılaştı ve çözüldü aynı sorun, aynı şekilde, bir bağlantı FAQ for clock_gettime(CLOCK_REALTIME), diyor ki:

  1. Clock_gettime(CLOCK_REALTİME) tutarlı bir bütün işlemci/çekirdek arasında? (Arch mu önemli? ppc, kol, 86, amd64, sparc) örneğin.

gerekirya da hatalı olarak kabul edilir.

Ancak,/x86_64 86, üzerinde unsynced veya değişken frekans TSCs zaman tutarsızlıkları neden görmek mümkündür. 2.4 çekirdekleri gerçekten buna karşı hiçbir koruma yoktu ve erken 2.6 çekirdekleri çok iyi burada da yapmadı. 2.6.18 olarak bu algılama ve mantığı daha iyi ve genellikle güvenli bir clocksource geri alacağız.

ppc her zaman senkronize zaman tabanı vardır, bu bir sorun olmamalı.

Bu yüzden, eğer Holmes link okunabilir olarak ima nanoTime aramalar clock_gettime(CLOCK_REALTIME), o zaman güvenli gibi çekirdek 2.6.18 üzerinde 86, ve her zaman Power PC (çünkü IBM ve Motorola, aksine Intel, aslında nereden tasarımı mikroişlemciler).

SPARC ve Solaris söz, ne yazık ki yok. Ve tabii ki, IBM Jvm'ler ne olduğunu bilmiyoruz. Ama Güneş modern Windows Jvm'ler ve bu hakkı elde Linux.

EDİT: Bu cevap gösteriyor kaynaklara dayanıyor. Ama yine de aslında tamamen yanlış olabilir endişe. Güncel biraz daha bilgi çok değerli olacaktır. Ben sadece karşısına yararlı olabilecek four year newer article about Linux's clocks bir bağlantı geldi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hak5DarrensVlog

    Hak5DarrensV

    11 EYLÜL 2009
  • TheXiaxue

    TheXiaxue

    3 AĞUSTOS 2009
  • tychoadragmire

    tychoadragmi

    20 Mart 2006