Recientemente decidí que necesitaba cambiar de milisegundos a microsegundos para mi clase de temporizador, y después de algunas investigaciones, decidí que QueryPerformanceCounter es probablemente mi apuesta más segura. (La advertencia de Boost::Posix
que puede que no funcione en la API de Win32 me desanimó un poco). Sin embargo, no estoy muy seguro de cómo implementarlo.
Lo que estoy haciendo es llamar a cualquier GetTicks()
función esque que esté usando y asignarla a la startingTicks
variable de Timer . Luego, para encontrar la cantidad de tiempo transcurrido, simplemente resto el valor de retorno de la función del startingTicks
, y cuando restablezco el temporizador, simplemente llamo a la función nuevamente y le asigno initialTicks. Desafortunadamente, por el código que he visto, no es tan simple como llamar QueryPerformanceCounter()
, y no estoy seguro de qué se supone que debo pasar como argumento.
Respuestas:
Este programa debería generar un número cercano a 1000 (la suspensión de Windows no es tan precisa, pero debería ser como 999).
La
StartCounter()
función registra el número de ticks que tiene el contador de rendimiento en laCounterStart
variable. LaGetCounter()
función devuelve el número de milisegundos desde laStartCounter()
última vez que se llamó como un doble, por lo que siGetCounter()
devuelve 0,001, ha pasado aproximadamente 1 microsegundo desde queStartCounter()
se llamó.Si desea que el temporizador utilice segundos en su lugar, cambie
a
o si quieres microsegundos, usa
Pero realmente se trata de conveniencia ya que devuelve un doble.
fuente
On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL).
Este código no tiene muchas fallas, pero algo de BIOS o HAL.StartCounter
función:old_mask = SetThreadAffinityMask(GetCurrentThread,1);
y luego la configuré al finalSetThreadAffinityMask ( GetCurrentThread , old_mask ) ;
. Espero que eso funcione. Esto debería evitar que mi hilo se reprograme a cualquier cosa que no sea el primer núcleo de la CPU. (Que obviamente es solo una solución para un entorno de prueba)Yo uso estos define:
Uso (corchetes para evitar redefiniciones):
Resultado del ejemplo de uso:
fuente
Suponiendo que está en Windows (si es así, ¡debería etiquetar su pregunta como tal!), En esta página de MSDN puede encontrar la fuente de una
HRTimer
clase C ++ simple y útil que incluye las llamadas al sistema necesarias para hacer algo muy parecido a lo que necesita. (sería fácil agregarle unGetTicks()
método, en particular, para hacer exactamente lo que necesita).En plataformas que no son de Windows, no hay función QueryPerformanceCounter, por lo que la solución no será directamente portátil. Sin embargo, si lo envuelve en una clase como la mencionada anteriormente
HRTimer
, será más fácil cambiar la implementación de la clase para usar lo que la plataforma actual realmente puede ofrecer (¡tal vez a través de Boost o lo que sea!).fuente
Ampliaría esta pregunta con un ejemplo de controlador NDIS sobre cómo obtener tiempo. Como se sabe, KeQuerySystemTime (imitado en NdisGetCurrentSystemTime) tiene una resolución baja por encima de milisegundos, y hay algunos procesos como paquetes de red u otros IRP que pueden necesitar una mejor marca de tiempo;
El ejemplo es igual de simple:
donde el divisor es 10 ^ 3 o 10 ^ 6 según la resolución requerida.
fuente