¿Cuál es la diferencia entre std::system_clocky 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_clocky std::high_resolution_clock?

system_clockno 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_clockno 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,QueryPerformanceCounteren 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_clockysystem_clockaquí.system_clocksea 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_steadyy 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_gettimey modifique el código anterior.fuente
Implementación de GCC 5.3.0
C ++ stdlib está dentro de la fuente GCC:
high_resolution_clockes un alias parasystem_clocksystem_clockreenvía al primero de los siguientes que está disponible:clock_gettime(CLOCK_REALTIME, ...)gettimeofdaytimesteady_clockreenvía al primero de los siguientes que está disponible:clock_gettime(CLOCK_MONOTONIC, ...)system_clockEntonces
CLOCK_REALTIMEvsCLOCK_MONOTONICse 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_clockes el 1.1.1970, la llamada época UNIX. Por otro lado, por lostd::chrono::steady_clockgeneral, es el tiempo de arranque de su PC y es más adecuado para medir intervalos.fuente