2011-10-20 18 views
6

Bazı ağ hata ayıklama işlemleri için biraz mühendislik uygulaması oluşturdum. IP adreslerinin bir listesini alır ve kullanıcı zaman aşımı ve oranı ile pingler. Bu, ortalama gidiş-dönüş süresini kaydeder ve gönderilerden biri her defasında başarısız olur, zamanın başarısızlık süresini ve ne zaman gerçekleştiğini gösterir ...Tarihçe 32bit ve 64bit arası Windows PC

Bu fikirdir. Win7 makinede .Net4 ile geliştirdim ve bir dizi XP dizüstü bilgisayara koymak zorunda kaldım.

Sorun, test sırasında kutudaki süre değerlerinin iyi ms süreleri göstermesi, XP kutularında 0 veya 15.625 (sihirli sayı?) Gösterdiklerini gösterirken ... dize?

public void LinkUp() 
    { 
     if (_isLinkUp) return; 

     _upTime = DateTime.Now; 
     var span = _upTime.Subtract(_downTime); 
     _downTimeLog.Add(new LinkDown() 
          { 
           _span = span, 
           _status = _ipStatus, 
           _time = _downTime 
          }); 
     _isLinkUp = true; 
    } 

Bu, günlüğü yapan bittir. _ipStatus, ping hatası nedenidir (genellikle zaman aşımı).

_downEventLog.AppendLine(" Duration-> " + linkDownLogEvent._span.TotalMilliseconds + "ms\n"); 

Baskı yapan şey bu mu? ... Bu belirgin farka kimsenin ışık tutabiliyor mu?

Soru yanıtlandı, ancak daha fazla bilgi için buraya bir düzenleme ekleyeceğim.

DÜZENLEME:

farkın Win7 ve WinXP'de farkı ama 32bit ve 64bit aşağı olmadığını görünüyor.

Bir 32 bit pencere sisteminde Henk belirtildiği gibi, sistem saatinin tanecikliği 15-16 ms'dir, bu bana zaman aralığı için 16ms'den daha az her değer için 15.625 değerini verdi.

64 bit sistemde, sistem çağrısı, çok daha küçük bir ayrıntı düzeyine sahip farklı bir yöntem kümesine yöneliktir. Yani x64'teki dev makinemde sistem saatimden ms doğruluk vardı!

Şimdi, kronometre çok daha ince bir boyutluluğun kaydedilmesi için işlemci enstrümantasyonu yoluyla bir donanım arabirimi kullanır (muhtemelen her işlemci kenarı değil, bu düşünceyle doğru bir şekilde doğru bir şey hayal ediyorum). İşletim sisteminin altında yatan donanım bu seviyede bir enstrümana sahip değilse, sistem zamanını kullanacaktır. Bu yüzden sakının! Ama sanırım en modern masaüstleri/dizüstü bilgisayarlar bu enstrümantasyona sahiptir ... Gömülü cihazlar ya da doğadaki şeyler olmayabilir, fakat kronometre sınıfı görebildiğim kadar Kompakt Çerçeve'de değil (burada QueryPerformanceCounter'ı kullanmak zorundasınız))).

Umarım tüm bu yardımcı olur. Bana çok yardımcı oldu.

if (!_spanStopWatch.IsHighResolution) 
    { 
     throw new ThisMachineIsNotAccurateEnoughForMyLikingException("Find a better machine."); 
    } 

somun ve cıvata:

public void LinkUp() 
    { 
     if (_isLinkUp) return; 

     _spanStopWatch.Stop(); 
     var span = _spanStopWatch.Elapsed; 
     _downTimeLog.Add(new LinkDown() 
          { 
           _span = span, 
           _status = _ipStatus, 
           _time = _downTime 
          }); 
     _isLinkUp = true; 
    } 
+0

Muhtemelen sorununun çözümü değil, dolaylı olarak yapmak yerine bir dizeye açıkça dönüştürmek için TotalMilliseconds.ToString() yöntemini kullanmalısınız. – Polynomial

+2

@Polynomial bu kesinlikle gereksizdir, çünkü aynı kodu üretecektir. –

cevap

5

0 veya 15.625 (? Sihirli sayı)

Evet, DateTime.Now kullanılarak Somewhere _spanStopWatch Başlatıcı etrafında

Sadece bir CPU zamanlayıcısının uzunluğuna kadar doğru, 15-20 msnize bağlı olarak donanım ve işletim sistemi sürümü. Doğru zamanlama için System.Diagnostics.Stopwatch kullanın.

+2

+1; Sonra 'Kronometre' ile sorun yaşarsanız, şu soruyu kontrol edin: http://stackoverflow.com/questions/3400254/can-the-net-stopwatch-class-be-this-terrible –

+0

Biraz daha okudum ... Bence bu tanesellik meselesi. Benim dev makinem 64 bit ... yani daha iyi bir tanecikliğe sahip farklı bir çağrı kullanır. – tigerswithguitars

+0

@Henk Kronometre kullanımı için bir snippet sağlayabilir misiniz? MSDN'i kullanacağım, ama deneyimli bir kullanıcı girişi olması her zaman güzel! Çok teşekkürler beyler. – tigerswithguitars

İlgili konular