El uso regular de edad timeGetTime()
hacer tiempo no es fiable en muchos sistemas operativos basados en Windows debido a la granularidad del sistema temporizador puede ser tan alta como 10-15 milisegundos , lo que significa que timeGetTime()
solo tiene una precisión de 10-15 milisegundos. [Tenga en cuenta que altas granularidades ocurren en sistemas operativos NT como Windows NT, 2000 y XP. Windows 95 y 98 tienden a tener mucho mejor granularidad, alrededor de 1-5 ms.]
Sin embargo, si se llama a timeBeginPeriod(1)
al comienzo de su programa (y timeEndPeriod(1)
en final), por lo general se timeGetTime()
tenga una precisión de 1-2 milisegundos, y le proporcionará información de temporización extremadamente precisa .
Sleep()
se comporta de manera similar; la longitud de tiempo que Sleep()
realidad plazas para va mano a mano con el granularidad de timeGetTime()
, así que después llamando timeBeginPeriod(1)
una vez, Sleep(1)
realmente dormir durante 1-2 milisegundos, Sleep(2)
para 2-3, y entonces encendido (en lugar de dormir en incrementos de hasta 10-15 ms).
Para mayor precisión el tiempo (precisión sub-milisegundos), podrás probablemente desea evitar el uso del ensamblaje RDTSC mnemotécnico, ya que es difícil de calibrar ; en su lugar, use QueryPerformanceFrequency
y QueryPerformanceCounter
, que son con una precisión de menos de 10 microsegundos (0,00001 segundos).
Para sencilla momento, tanto timeGetTime y QueryPerformanceCounter funcionan bien, y QueryPerformanceCounter es obviamente más precisa. Sin embargo, si lo que necesita hacer ningún tipo de "cronometradas pausas" (tales como los necesarios para de imágenes por segundo limitante), tiene que ser cuidado de sentarse en un bucle llamando QueryPerformanceCounter, esperando que alcance un cierto valor; esto hará que consuma el 100% de su procesador. lugar, considere un esquema híbrido, donde usted llama Sueño (1) (no se olvide timeBeginPeriod (1) en primer lugar!) Siempre necesita pasar más de 1 ms de tiempo de , y sólo entrar en el QueryPerformanceCounter Bucle 100% -busy para finalizar el último < 1/1000 de un segundo de la demora que necesita. Este le proporcionará demoras ultraprecisas (con una precisión de 10 microsegundos), con uso muy mínimo de la CPU. Vea el código arriba.
Por favor, evite timeBeginPeriod(); afecta el programador del sistema y puede causar problemas con el ahorro de energía. – MSalters