.net - startnew - ¿La resolución del temporizador de la clase System.Diagnostics.Stopwatch es estable?
stopwatch() (1)
MSDN:
*The Frequency value depends on the resolution of the underlying timing mechanism. If the installed hardware and operating system support a high-resolution performance counter, then the Frequency value reflects the frequency of that counter. Otherwise, the Frequency value is based on the system timer frequency.*
La fuente del cronómetro.Frecuencia no es la frecuencia de la CPU. Es la frecuencia de un contador de hardware de alta frecuencia. En las ventanas, esta frecuencia de contador normalmente también se lee mediante una llamada a la función QueryPerformanceCounter mientras que en Linux se utilizan temporizadores POSIX de alta resolución para obtener tiempos de alta resolución.
El uso del Contador de sellos de tiempo (RDTSC - Frecuencia de CPU) se discute a menudo en este contexto pero no tiene una relevancia real:
Es posible que algunos hardware más antiguos no proporcionen hardware de alta frecuencia para el cronometraje, por lo que la frecuencia de la CPU se usa como reemplazo. Cuando se utiliza la frecuencia de la CPU para el tiempo, debe asegurarse que la frecuencia permanezca constante. Un hardware más moderno proporciona una modificación de frecuencia de CPU dinámica. Usar la frecuencia de la CPU como una medida mientras se modifica dinámicamente terminaría en un lío.
Afortunadamente esta es non existing
situación non existing
. Los sistemas que pueden modificar la frecuencia de su CPU son más modernos. Dichos sistemas modernos también tienen un temporizador de eventos de alta precisión de hardware de temporizador de alta frecuencia separado.
Existen algunos rumores sobre el uso de la frecuencia de la CPU en sistemas multinúcleo. De hecho, ha habido un problema con cierto hardware. Pero eso fue hace mucho tiempo y lo arreglaron por un tiempo.
.Net tiene soporte para tiempos de alta resolución usando la clase System.Diagnostics.Stopwatch
. Entiendo que la resolución específica que utiliza esta clase difiere según el hardware subyacente y se puede obtener a través de la propiedad estática Stopwatch.Frequency
.
Esta frecuencia parece estar relacionada con la frecuencia de la CPU y Stopwatch
lee este valor y lo almacena en una variable de clase estática dentro de un inicializador / constructor estático. Por lo tanto, ahora me pregunto si esta clase informará tiempos incorrectos si el reloj de la CPU cambia? por ejemplo, en sistemas que alteran el reloj de la CPU dependiendo de la carga del sistema.