2011-08-08 15 views
9

Dentro del constructor estático Stopwatch podemos ver el siguiente código, que básicamente verifica si existe un contador de rendimiento de alta resolución.Explicación sobre el contador de rendimiento de alta resolución y su existencia relacionada con .NET Stopwatch?

static Stopwatch() 
{ 
    if (!SafeNativeMethods.QueryPerformanceFrequency(out Frequency)) 
    { 
     IsHighResolution = false; 
     Frequency = 0x989680L; 
     tickFrequency = 1.0; 
    } 
    else 
    { 
     IsHighResolution = true; 
     tickFrequency = 10000000.0; 
     tickFrequency /= (double) Frequency; 
    } 
} 

en MSDN que dice acerca de QueryPerformanceFrequency:

Recupera la frecuencia del contador de rendimiento de alta resolución, si existe

Es bastante claro, sin embargo, cuando se hace exactamente lo ¿existe? Sospecho que generalmente existe en las máquinas actuales, pero ¿cuándo exactamente no?

Es interesante porque cuando no existe, Stopwatch se convierte en una mera envoltura alrededor de la propiedad DateTime.UtcNow.

+2

No he encontrado una máquina si aún no existe. El principal problema práctico al que me enfrento son los errores en su comportamiento causados ​​por el hardware defectuoso. Por ejemplo, el tiempo puede saltar adelante/atrás a medida que el hilo se programa en diferentes núcleos, .. – CodesInChaos

+3

Es opcional en Windows Mobile, hasta que el creador de plataformas lo implemente. –

+0

Las propiedades "IsHighResolution" y "Frequency" de esta clase deberían responder esta pregunta. Nota: Encontré una frecuencia de cero en una máquina virtual [VMWare ESX, pero no recuerdo la versión] que ya no aparece [la máquina se migró de w2k3 a w2k8, por lo que podría haber sido VMWare o Windows :-) ] br ++ mabra – mabra

Respuesta

1

La resolución real de la hora del sistema es del orden de milisegundos (aunque se dice que es 1/10 de un milisegundo, nunca he visto una estación de trabajo que proporcione esa resolución de manera confiable).

Sin embargo, puede usar hardware adicional (como lectores de códigos de tiempo) que proporciona resoluciones hasta nanosegundos. Estos se utilizan generalmente en sistemas de control industrial en línea con IPC (PC industriales) para sincronizar hardware DAQ. Puede ver un ejemplo con 100   ns de resolución en PCI Express Slot Cards. Time code processor for PCI express low-profile x1 local bus.

Las estaciones de trabajo ordinarias casi siempre usan contadores de alta resolución, pero en realidad la resolución no será la esperada (micro o nano segundos) sin hardware adicional.

+0

Estoy buscando temporizadores de alta precisión en todas las máquinas nuevas y su resolución está en la arena ns. Hay un documento técnico interesante en la comunidad VMWare [probablemente escrito por VMWare themself] que explica qué temporizadores se emulan y cómo. br ++ mabra – mabra

4

Existe una diferencia entre un temporizador y un cronómetro, y confunde los dos cables con suposiciones erróneas. Desafortunadamente, el término temporizador se usa para referirse a muchas cosas con demasiada frecuencia.

Cualquier máquina que ejecute Windows 2000 o posterior probablemente tenga un temporizador de alta frecuencia. Nunca me he encontrado con una computadora que ejecuta Windows 2000 más tarde que no tiene tal cosa.

Ahora, ese es el temporizador de alta frecuencia. También hay temporizadores: componentes de Windows o .NET. Estos temporizadores no se usan para mantener el tiempo o medir el tiempo, sino para realizar acciones a intervalos periódicos. Los objetos del temporizador de Windows son capaces de una resolución de 1 ms y son muy confiables cuando la computadora no está involucrada en operaciones intensivas de la CPU. Los objetos del temporizador .NET están limitados a una resolución de aproximadamente 15 ms. Puede evitarlo utilizando P/Invoke para interactuar directamente con los objetos de Windows, pero a menudo no es necesario.

La clase .NET Stopwatch se basa en el temporizador de alta frecuencia. En general, Start consulta el contador de rendimiento y almacena el valor. Cuando Stop, consulta nuevamente el contador de rendimiento. El tiempo transcurrido es una simple resta de esos dos valores. Usted puede obtener una resolución mejor que microsegundo desde el cronómetro.

Y, de hecho, puede crear el uso de un Stopwatch con un bucle de espera ocupado que le da una resolución de menos de milisegundos. Dudo que puedas obtener una resolución de menos de un microsegundo con él.

Lo importante es entender que, aunque los temporizadores no son fiables más allá de 1 milisegundo, el cronómetro, que mide el tiempo transcurrido, es mucho más preciso. Probablemente puedas confiar en las mediciones de tiempo transcurrido de microsegundos de Stopwatch. Más allá de eso, no contaría con eso.

Cuestiones relacionadas