2011-10-20 14 views
6

Ho creato una piccola app di ingegneria per il debug di rete. Prende un elenco di indirizzi IP e li ping con il timeout e la frequenza impostati dall'utente. Registra il tempo medio di andata e ritorno e ogni volta che una delle mandate fallisce registra la sua durata e un timestamp di quando è successo ...Granularità data/ora tra Windows a 32 bit e 64 bit

Questa è l'idea. L'ho sviluppato su una macchina Win7 con .Net4 e ho dovuto mettere la cosa su un set di laptop XP.

Il problema è che i valori di durata sulla mia scatola durante i test mostrano durate piacevoli di ms, sulle scatole XP quando guardo mostrano 0 o 15.625 (numero magico?) ... e hanno il simpatico quadrato, simbolo di casella nel stringa?

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; 
    } 

Questo è il bit che esegue il registro. _ipStatus è il motivo dell'errore ping (in genere timeout).

Questo è il bit che fa la stampa ... Qualcuno può far luce su questa apparente differenza?

La domanda ha avuto risposta, ma includerò una modifica qui per ulteriori informazioni.

EDIT:

sembra che la differenza non è sceso alla differenza Win7 e WinXP ma 32bit e 64bit.

In un sistema Windows a 32 bit come Henk, la granularità dell'orologio di sistema è 15-16 ms, questo è ciò che mi ha dato il valore di 15,66 per ogni valore inferiore a 16 ms per l'intervallo di tempo.

In un sistema a 64 bit, la chiamata di sistema si riferisce a un diverso insieme di metodi con una granularità molto più fine. Quindi sulla mia macchina di sviluppo in x64 ho avuto l'accuratezza di ms dal mio orologio di sistema!

Ora il cronometro utilizza un'interfaccia hardware tramite la strumentazione del processore per registrare una granularità molto più fine (probabilmente non ogni tick del processore, ma immagino qualcosa di oscenamente accurato in linea con questo modo di pensare). Se l'hardware sottostante al sistema operativo non ha questo livello di strumentazione, utilizzerà comunque l'ora del sistema. Quindi attenzione! Ma suppongo che la maggior parte dei computer/laptop moderni abbia questa strumentazione ... I dispositivi incorporati o cose di quella natura potrebbero non esserlo, ma la classe cronometro non è nel Compact Framework, per quanto posso vedere (qui devi usare QueryPerformanceCounter ()).

Spero che tutto questo sia d'aiuto. Mi ha aiutato molto

Da qualche parte intorno al initialiser _spanStopWatch:

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

I dadi e bulloni:

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

Anche se probabilmente non è la soluzione al tuo problema, dovresti utilizzare TotalMilliseconds.ToString() per convertire esplicitamente in una stringa piuttosto che farlo in modo implicito. – Polynomial

+2

@Polynomial questo è assolutamente inutile, poiché produrrà lo stesso codice esatto. –

risposta

5

0 o 15.625 (? Numero magico)

Sì, utilizzando DateTime.Now è preciso solo per la lunghezza di un tempo di CPU, 15-20 ms a seconda del tuo hard ware e versione del sistema operativo.

Utilizzare System.Diagnostics.Stopwatch per tempi più precisi.

+2

+1; Quindi se riscontri problemi con 'Cronometro', controlla questa domanda: http://stackoverflow.com/questions/3400254/can-the-net-stopwatch-class-be-this-terrible –

+0

Ho letto qualche altro ... Penso che sia questa cosa della granularità. La mia macchina dev è a 64 bit ... quindi usa una chiamata diversa che ha una granularità più fine. – tigerswithguitars

+0

@Henk Potresti fornire uno snippet per l'utilizzo del cronometro? Userò MSDN, ma è sempre bello avere un utente esperto in input! Molte grazie ragazzi. – tigerswithguitars

Problemi correlati