programa - poner tiempo en c++
¿Cómo puedo medir el tiempo de CPU y el reloj de pared en Linux/Windows? (4)
Quiero decir: ¿cómo puedo medir el tiempo que mi CPU gastó en la ejecución de la función y el tiempo del reloj de pared para ejecutar mi función? (Estoy interesado en Linux / Windows y tanto x86 como x86_64). Vea lo que quiero hacer (estoy usando C ++ aquí, pero preferiría la solución C):
int startcputime, endcputime, wcts, wcte;
startcputime = cputime();
function(args);
endcputime = cputime();
std::cout << "it took " << endcputime - startcputime << " s of CPU to execute this/n";
wcts = wallclocktime();
function(args);
wcte = wallclocktime();
std::cout << "it took " << wcte - wcts << " s of real time to execute this/n";
Otra pregunta importante: ¿es este tipo de arquitectura de medición del tiempo independiente o no?
Aquí hay una solución de copiar y pegar que funciona tanto en Windows como en Linux, C y C ++.
Como se mencionó en los comentarios, hay una biblioteca de impulso que hace esto. Pero si no puedes usar boost, esto debería funcionar:
// Windows
#ifdef _WIN32
#include <Windows.h>
double get_wall_time(){
LARGE_INTEGER time,freq;
if (!QueryPerformanceFrequency(&freq)){
// Handle error
return 0;
}
if (!QueryPerformanceCounter(&time)){
// Handle error
return 0;
}
return (double)time.QuadPart / freq.QuadPart;
}
double get_cpu_time(){
FILETIME a,b,c,d;
if (GetProcessTimes(GetCurrentProcess(),&a,&b,&c,&d) != 0){
// Returns total user time.
// Can be tweaked to include kernel times as well.
return
(double)(d.dwLowDateTime |
((unsigned long long)d.dwHighDateTime << 32)) * 0.0000001;
}else{
// Handle error
return 0;
}
}
// Posix/Linux
#else
#include <time.h>
#include <sys/time.h>
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
// Handle error
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
double get_cpu_time(){
return (double)clock() / CLOCKS_PER_SEC;
}
#endif
Hay muchas maneras de implementar estos relojes. Pero esto es lo que usa el fragmento de arriba:
Para ventanas:
- Wall Time: Contadores de rendimiento
- Tiempo de CPU:
GetProcessTimes()
Para Linux:
- Tiempo de pared:
gettimeofday()
- Tiempo de CPU:
clock()
Y aquí hay una pequeña demostración:
#include <math.h>
#include <iostream>
using namespace std;
int main(){
// Start Timers
double wall0 = get_wall_time();
double cpu0 = get_cpu_time();
// Perform some computation.
double sum = 0;
#pragma omp parallel for reduction(+ : sum)
for (long long i = 1; i < 10000000000; i++){
sum += log((double)i);
}
// Stop timers
double wall1 = get_wall_time();
double cpu1 = get_cpu_time();
cout << "Wall Time = " << wall1 - wall0 << endl;
cout << "CPU Time = " << cpu1 - cpu0 << endl;
// Prevent Code Elimination
cout << endl;
cout << "Sum = " << sum << endl;
}
Salida (12 hilos):
Wall Time = 15.7586
CPU Time = 178.719
Sum = 2.20259e+011
C ++ 11. ¡Mucho más fácil de escribir!
Utilice std::chrono::system_clock
para wall clock y std::clock
para cpu clock http://en.cppreference.com/w/cpp/chrono/system_clock
#include <cstdio>
#include <ctime>
#include <chrono>
....
std::clock_t startcputime = std::clock();
do_some_fancy_stuff();
double cpu_duration = (std::clock() - startcputime) / (double)CLOCKS_PER_SEC;
std::cout << "Finished in " << cpu_duration << " seconds [CPU Clock] " << std::endl;
auto wcts = std::chrono::system_clock::now();
do_some_fancy_stuff();
std::chrono::duration<double> wctduration = (std::chrono::system_clock::now() - wcts);
std::cout << "Finished in " << wctduration.count() << " seconds [Wall Clock]" << std::endl;
Et voilà, fácil y portátil! No es necesario #ifdef _WIN32 o LINUX.
Incluso puede usar chrono::high_resolution_clock
si necesita más precisión http://en.cppreference.com/w/cpp/chrono/high_resolution_clock
Para dar un ejemplo concreto de la sugerencia de @ lip para usar boost::timer
si puedes (probado con Boost 1.51):
#include <boost/timer/timer.hpp>
// this is wallclock AND cpu time
boost::timer::cpu_timer timer;
... run some computation ...
boost::timer::cpu_times elapsed = timer.elapsed();
std::cout << " CPU TIME: " << (elapsed.user + elapsed.system) / 1e9 << " seconds"
<< " WALLCLOCK TIME: " << elapsed.wall / 1e9 << " seconds"
<< std::endl;
Usa el método del clock
a time.h :
clock_t start = clock();
/* Do stuffs */
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
Desafortunadamente, este método devuelve el tiempo de CPU en Linux, pero devuelve el tiempo del reloj de pared en Windows (gracias a los comentaristas por esta información).