¿Cuál es la diferencia entre std::system_clock
y std::steady_clock
? (Un caso de ejemplo que ilustre diferentes resultados / comportamientos sería genial).
Si mi objetivo es medir con precisión el tiempo de ejecución de las funciones (como un punto de referencia), ¿cuál sería la mejor elección entre std::system_clock
, std::steady_clock
y std::high_resolution_clock
?
system_clock
no es estable en Windows. En Windows, la hora del sistema puede ser alterada a cualquier valor arbitrario por cualquier usuario con suficientes privilegios. Además, el servicio de sincronización horaria puede ajustar la hora del sistema hacia atrás si es necesario. Espero que la mayoría de las otras plataformas tengan características similares que permitan ajustar la hora del sistema.Respuestas:
Desde N3376:
20.11.7.1 [time.clock.system] / 1:
20.11.7.2 [time.clock.staady] / 1:
20.11.7.3 [time.clock.hires] / 1:
Por ejemplo, el reloj de todo el sistema puede verse afectado por algo como el horario de verano, momento en el que la hora real que aparece en algún momento en el futuro puede ser en realidad una hora del pasado. (Por ejemplo, en los EE. UU., En el otoño el tiempo retrocede una hora, por lo que la misma hora se experimenta "dos veces") Sin embargo,
steady_clock
no se permite verse afectado por tales cosas.Otra forma de pensar en "estable" en este caso es en los requisitos definidos en la tabla de 20.11.3 [time.clock.req] / 2:
Eso es todo lo que tiene el estándar sobre sus diferencias.
Si desea realizar evaluaciones comparativas, su mejor opción probablemente será
std::high_resolution_clock
, porque es probable que su plataforma utilice un temporizador de alta resolución (por ejemplo,QueryPerformanceCounter
en Windows) para este reloj. Sin embargo, si está realizando una evaluación comparativa, debería considerar el uso de temporizadores específicos de la plataforma para su evaluación comparativa, porque las diferentes plataformas manejan esto de manera diferente. Por ejemplo, algunas plataformas pueden brindarle algún medio para determinar el número real de tics de reloj que requiere el programa (independientemente de otros procesos que se ejecutan en la misma CPU). Mejor aún, consigue un generador de perfiles real y úsalo.fuente
steady_clock
ysystem_clock
aquí.system_clock
sea UTC.Billy proporcionó una gran respuesta basada en el estándar ISO C ++ con el que estoy totalmente de acuerdo. Sin embargo, hay otro lado de la historia: la vida real. Parece que en este momento realmente no hay diferencia entre esos relojes en la implementación de compiladores populares:
gcc 4.8:
Visual Studio 2012:
En el caso de gcc, puede verificar si maneja el reloj estable simplemente verificando
is_steady
y comportándose en consecuencia. Sin embargo, VS2012 parece hacer un poco de trampa aquí :-)Si necesita un reloj de alta precisión, le recomiendo que por ahora escriba su propio reloj que se ajuste a la interfaz de reloj oficial de C ++ 11 y espere a que las implementaciones se pongan al día. Será un enfoque mucho mejor que usar la API específica del sistema operativo directamente en su código. Para Windows puedes hacerlo así:
Para Linux es aún más fácil. Simplemente lea la página de manual de
clock_gettime
y modifique el código anterior.fuente
Implementación de GCC 5.3.0
C ++ stdlib está dentro de la fuente GCC:
high_resolution_clock
es un alias parasystem_clock
system_clock
reenvía al primero de los siguientes que está disponible:clock_gettime(CLOCK_REALTIME, ...)
gettimeofday
time
steady_clock
reenvía al primero de los siguientes que está disponible:clock_gettime(CLOCK_MONOTONIC, ...)
system_clock
Entonces
CLOCK_REALTIME
vsCLOCK_MONOTONIC
se explica en: ¿ Diferencia entre CLOCK_REALTIME y CLOCK_MONOTONIC?fuente
Quizás, la diferencia más significativa es el hecho de que el punto de partida de
std::chrono:system_clock
es el 1.1.1970, la llamada época UNIX. Por otro lado, por lostd::chrono::steady_clock
general, es el tiempo de arranque de su PC y es más adecuado para medir intervalos.fuente