2011-10-20 17 views
6

Tengo que crear una pequeña aplicación de ingeniería para la depuración de red. Toma una lista de direcciones IP y las envía, con el tiempo de espera y la frecuencia establecidos por el usuario. Registra el tiempo promedio de ida y vuelta y cada vez que uno de los envíos falla, registra su duración de falla y una marca de tiempo de cuándo ocurrió ...Granularidad de fecha y hora entre Windows de 32 bits y 64 bits

Esa es la idea. Lo desarrollé en una máquina Win7 con .Net4 y tuve que ponerlo en una serie de computadoras portátiles XP.

El problema es que los valores de duración en mi caja durante las pruebas muestran duraciones agradables, en los cuadros XP cuando miro muestran 0 o 15.625 (¿número mágico?) ... y tienen el cuadrado divertido, símbolo de caja en el ¿cuerda?

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

Ese es el bit que hace el registro. El _ipStatus es el motivo de falla de ping (por lo general, tiempo de espera).

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

Esa es la parte que hace la impresión ... ¿Alguien puede arrojar algo de luz sobre esta aparente diferencia?

La pregunta ha sido respondida, pero incluiré una edición aquí para obtener más información.

EDIT:

Parece que la diferencia no fue hasta la diferencia, pero 32 y 64 bits Win7 y WinXP.

En un sistema de ventanas de 32 bit como Henk señala, la granularidad del reloj del sistema es 15-16ms, esto es lo que me dio el valor de 15.625 para cada valor inferior a 16ms para el intervalo de tiempo.

En un sistema de 64 bits, la llamada del sistema es a un conjunto diferente de métodos que tienen una granularidad mucho más fina. ¡Así que en mi máquina de desarrollo en x64 tuve más precisión en el reloj de mi sistema!

Ahora, el cronómetro utiliza una interfaz de hardware a través de la instrumentación del procesador para registrar una granularidad mucho más fina (probablemente no todos los tics del procesador, pero imagino algo obsceno y preciso en línea con este pensamiento). Si el hardware subyacente al sistema operativo no tiene este nivel de instrumentación, utilizará la hora del sistema. ¡Así que ten cuidado! Pero supongo que la mayoría de las computadoras de escritorio/portátiles modernas tienen esta instrumentación ... Los dispositivos integrados o cosas de esa naturaleza no, pero la clase de cronómetro no está en el Framework Compacto por lo que puedo ver (aquí tienes que usar QueryPerformanceCounter ()).

Espero que todo esto ayude. Me ha ayudado mucho.

En algún lugar alrededor del inicializador _spanStopWatch:

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

Las tuercas y tornillos:

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

Aunque probablemente no sea la solución a su problema, debe usar TotalMilliseconds.ToString() para convertir explícitamente a una cadena en lugar de hacerlo implícitamente. – Polynomial

+2

@Polynomial esto es absolutamente innecesario, ya que producirá exactamente el mismo código. –

Respuesta

5

0 o 15.625 (¿número mágico)

Sí, utilizando DateTime.Now se preciso solo para la longitud de un ciclo de tiempo de la CPU, 15-20 ms dependiendo de su disco duro ware y versión del sistema operativo.

Utilice System.Diagnostics.Stopwatch para obtener una sincronización más precisa.

+2

+1; Entonces, si tiene problemas con 'Cronómetro', verifique esta pregunta: http://stackoverflow.com/questions/3400254/can-the-net-stopwatch-class-be-this-terrible –

+0

He leído algo más ... Creo que es esta granularidad. Mi máquina de desarrollo es de 64 bits ... así que usa una llamada diferente que tiene una granularidad más fina. – tigerswithguitars

+0

@Henk ¿Podría proporcionar un fragmento para el uso del cronómetro? Examinaré MSDN, pero siempre es bueno tener una entrada de usuarios experimentados. Muchas gracias chicos. – tigerswithguitars

Cuestiones relacionadas