tomar tiempo saber programa milisegundos medir ejecucion como calcular c++ visual-studio-2010 chrono ctime

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 o QueryPerformanceCounter 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;