tiempo - timer en c++
mediciĆ³n precisa del tiempo (4)
Estoy usando time.h en C ++ para medir el tiempo de una función.
clock_t t = clock();
someFunction();
printf("/nTime taken: %.4fs/n", (float)(clock() - t)/CLOCKS_PER_SEC);
sin embargo, siempre me estoy tomando el tiempo como 0.0000. clock () y t cuando se imprimen por separado, tienen el mismo valor. Me gustaría saber si hay forma de medir la hora con precisión (tal vez en el orden de nanosegundos) en C ++. Estoy usando VS2010.
C ++ 11 introdujo la API de crono , que puede usar para obtener nanosegundos:
auto begin = std::chrono::high_resolution_clock::now();
// code to benchmark
auto end = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count() << "ns" << std::endl;
Para un valor más relevante, es bueno ejecutar la función varias veces y calcular el promedio:
auto begin = std::chrono::high_resolution_clock::now();
uint32_t iterations = 10000;
for(uint32_t i = 0; i < iterations; ++i)
{
// code to benchmark
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count();
std::cout << duration << "ns total, average : " << duration / iterations << "ns." << std::endl;
Pero recuerde que el bucle for
y la asignación de var de begin
y end
usan tiempo de CPU.
El siguiente texto, con el que estoy completamente de acuerdo, se cita de Optimizing software in C ++ (buena lectura para cualquier programador de C ++) -
Las mediciones de tiempo pueden requerir una resolución muy alta si los intervalos de tiempo son cortos. En Windows, puede usar las funciones
GetTickCount
oQueryPerformanceCounter
para una resolución de milisegundos. Se puede obtener una resolución mucho más alta con el contador de marca de tiempo en la CPU, que cuenta a la frecuencia del reloj de la CPU.
Existe el problema de que "la frecuencia del reloj puede variar dinámicamente y las mediciones son inestables debido a las interrupciones y los interruptores de tareas".
En C o C ++ generalmente me gusta más abajo. Si aún falla, puede considerar el uso de funciones de rtdsc
struct timeval time;
gettimeofday(&time, NULL); // Start Time
long totalTime = (time.tv_sec * 1000) + (time.tv_usec / 1000);
//........ call your functions here
gettimeofday(&time, NULL); //END-TIME
totalTime = (((time.tv_sec * 1000) + (time.tv_usec / 1000)) - totalTime);
Usualmente uso la función QueryPerformanceCounter
.
ejemplo:
LARGE_INTEGER frequency; // ticks per second
LARGE_INTEGER t1, t2; // ticks
double elapsedTime;
// get ticks per second
QueryPerformanceFrequency(&frequency);
// start timer
QueryPerformanceCounter(&t1);
// do something
...
// stop timer
QueryPerformanceCounter(&t2);
// compute and print the elapsed time in millisec
elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart;