Como otros ya han señalado, la función time () en la biblioteca estándar de C no tiene una resolución mejor que un segundo. La única función C totalmente portátil que puede proporcionar una mejor resolución parece ser clock (), pero mide el tiempo del procesador en lugar del tiempo del reloj de pared. Si uno se contenta con limitarse a las plataformas POSIX (por ejemplo, Linux), entonces la función clock_gettime () es una buena opción.
Desde C ++ 11, hay muchas mejores instalaciones de temporización disponibles que ofrecen una mejor resolución en una forma que debería ser muy portátil en diferentes compiladores y sistemas operativos. Del mismo modo, la biblioteca boost :: datetime proporciona buenas clases de temporización de alta resolución que deberían ser altamente portátiles.
Un desafío en el uso de cualquiera de estas instalaciones es el retraso de tiempo introducido al consultar el reloj del sistema. Al experimentar con clock_gettime (), boost :: datetime y std :: chrono, este retraso puede ser fácilmente una cuestión de microsegundos. Por lo tanto, al medir la duración de cualquier parte de su código, debe permitir que haya un error de medición de alrededor de este tamaño, o tratar de corregir ese error cero de alguna manera. Idealmente, es posible que desee recopilar múltiples mediciones del tiempo que le toma a su función y calcular el tiempo promedio o máximo / mínimo en muchas ejecuciones.
Para ayudar con todos estos problemas de portabilidad y recopilación de estadísticas, he estado desarrollando la biblioteca cxx-rtimers disponible en Github que trata de proporcionar una API simple para sincronizar bloques de código C ++, calcular cero errores e informar estadísticas de múltiples temporizadores integrados en tu código Si tiene un compilador de C ++ 11, simplemente #include <rtimers/cxx11.hpp>
, y use algo como:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
Al salir del programa, obtendrá un resumen de las estadísticas de sincronización escritas en std :: cerr como:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
que muestra el tiempo medio, su desviación estándar, los límites superior e inferior, y la cantidad de veces que se llamó a esta función.
Si desea utilizar funciones de temporización específicas de Linux, puede hacerlo #include <rtimers/posix.hpp>
, o si tiene las bibliotecas Boost pero un compilador C ++ anterior, puede hacerlo #include <rtimers/boost.hpp>
. También hay versiones de estas clases de temporizador que pueden recopilar información estadística de temporización de varios subprocesos. También hay métodos que le permiten estimar el error cero asociado con dos consultas inmediatamente consecutivas del reloj del sistema.
time()
devuelve un valor diferente.