2011-04-02 18 views
7

¿Cuál es el mejor contador de tiempo, más preciso en C++?¿Cuál es el mejor y más preciso temporizador en C++?

+6

El mejor temporizador absoluto sería probablemente alguna llamada específica del sistema en un RTOS que se ejecuta en algún dispositivo integrado conectado a un reloj atómico. ¿Es eso lo que estás buscando, o estás dispuesto a conformarte con algo un poco menos que "el mejor y más preciso temporizador"? –

+0

@ James y el tiempo necesario para viajar a lo largo de los cables, y para ser procesada/etc también se tiene en cuenta aproximado? (Esa oración no tenía ningún sentido ...) –

+0

Además, un temporizador de tan alta resolución podría consumir CPU. –

Respuesta

12

La respuesta a esto es específico de la plataforma. El sistema operativo es responsable de hacer el seguimiento de tiempo y, en consecuencia, el lenguaje C++ en sí no proporciona construcciones de lenguaje o funciones incorporadas para hacer esto.

Sin embargo, aquí hay algunos recursos para temporizadores dependientes de la plataforma:

Una multiplataforma la solución podría ser boost::asio::deadline_timer.

+2

Respuesta relevante para aplicaciones críticas no basadas en el tiempo, – Enders

2

bajo Windows sería QueryPerformanceCounter, aunque ya no se ha especificado ninguna condición posible tener un temporizador de ultra alta resolución exterior que tiene una ++ interfaz de C para el conductor

+0

gracias, pero ¿qué tal en Linux/Unix? –

+0

@Josh: Vea mi respuesta más arriba. –

2

El C++ estándar no dice mucho sobre el tiempo Hay algunas características heredadas de C a través del encabezado <ctime>.

La función clock es la única forma de obtener sub-segundo de precisión, pero la precisión puede ser tan bajo como un segundo (que se define por la macro CLOCKS_PER_SEC). Además, no mide el tiempo real en absoluto, sino el tiempo del procesador.

La función time medidas en tiempo real, pero (por lo general) solamente al segundo más cercano.

Para medir el tiempo real con una precisión por debajo, es necesario una biblioteca no estándar.

10

En C++ 11 se puede obtener de forma portátil para el temporizador de resolución más alta con:

#include <iostream> 
#include <chrono> 
#include "chrono_io" 

int main() 
{ 
    typedef std::chrono::high_resolution_clock Clock; 
    auto t1 = Clock::now(); 
    auto t2 = Clock::now(); 
    std::cout << t2-t1 << '\n'; 
} 

Ejemplo de salida:

74 nanoseconds 

"chrono_io" es una extensión para aliviar los problemas de E/S con estos nuevos tipos y está disponible gratuitamente here.

También hay una implementación de <chrono> disponible en boost (aún puede estar en tip-of-trunk, no estoy seguro de que haya sido liberado).

+0

Intenté ejecutar la función now() durante 300 millones de veces y hay alrededor de 100 veces que la latencia/diferencia de t1 y t2 es mayor que 10 microsegundos. ¿Es por cambio de contexto u otra cosa?Gracias – user1687035

+0

@ user1687035: el cambio de contexto es probablemente un culpable. Depende de qué plataforma, qué compilador (incluso la versión del compilador), qué otros procesos hay en la máquina, etc. Una computadora de propósito general no es un gran reloj, a menos que constantemente pregunte a otras computadoras qué hora es. ;-) En macOS obtengo tiempos bastante sólidos * a menos que * la máquina del tiempo haga una copia de seguridad, el reflector se está indexando o el correo se está recuperando. –

Cuestiones relacionadas