Fiz um código para medir o tempo de processamento de um certo algoritmo na cpu.
Basicamente é pegar o tempo antes no inicio e no fim do processamento, e tirar a diferença.
O código calcula os tempos de duas maneiras diferentes, uma usando o tempo global do sistema (gettimeofday) e outra usando o tempo de cpu do processo (clock_gettime).
Fazendo as medições desta maneira, cheguei a um resultado válido e confiável.
Se alguém tiver alguma sugestão de melhoria, será bem vinda.
Se alguém quiser fazer algo parecido para medir o tempo de execução de um algoritmo na GPU, seria muito interessante.
Este código foi feito para linux, não cheguei a testá-lo em windows.
O arquivo se chama tempocpu.c.
Para compilá-lo, execute: gcc -Wall -lrt tempocpu.c -o tempocpu
Segue o código...
// Direitos: Alexsander Petry - 03/02/2011
#include <stdio.h>
#include <string.h>
#include <sys/time.h> // gettimeofday : dif global
#include <time.h> // clock_gettime : dif tempo de cpu
#include <unistd.h> // usleep
long fatorial(int num)
{
int i=0;
long fat=1;
for(i = 1; i <= num; i++) {
fat *= i;
}
return fat;
}
void proc_math()
{
int i=0, ii=0;
for(i = 1; i <= 10; i++) {
for(ii = 1; ii <= 1000; ii++) {
if(fatorial(100) != fatorial(100)) {
printf("ERRO: fatorial != fatorial ???? \n");
}
}
}
}
int main()
{
struct timeval tvi, tve; // gettimeofday : dif global
long tv_dif_us=0, tv_dif_ms=0; // gettimeofday : dif global
struct timespec tsi, tse; // clock_gettime : dif tempo de cpu
long ts_dif_us=0, ts_dif_ms=0; // clock_gettime : dif tempo de cpu
if(gettimeofday(&tvi, NULL) != 0) {
printf("ERRO no gettimeofday \n");
return 1;
}
if(clock_gettime(CLOCK_PROCESS_CPUTIME_ID /*CLOCK_REALTIME*/, &tsi) != 0) {
printf("ERRO no clock_gettime \n");
return 1;
}
proc_math(); // rotina para ocupar a cpu
// usleep(1 * 1000/*ms*/ * 1000/*seg*/);
if(gettimeofday(&tve, NULL) != 0) {
printf("ERRO no gettimeofday \n");
return 1;
}
if(clock_gettime(CLOCK_PROCESS_CPUTIME_ID /*CLOCK_REALTIME*/, &tse) != 0) {
printf("ERRO no clock_gettime \n");
return 1;
}
tv_dif_us = (tve.tv_sec - tvi.tv_sec) * 1000 * 1000 + (tve.tv_usec - tvi.tv_usec);
tv_dif_ms = tv_dif_us / 1000;
printf("---- Dif global ---- \n");
printf("Ini: %10lds:%6ldus \n", tvi.tv_sec, tvi.tv_usec);
printf("End: %10lds:%6ldus \n", tve.tv_sec, tve.tv_usec);
printf("Dif: %10lds:%6ldus \n", tv_dif_ms / 1000, tv_dif_us - (tv_dif_ms / 1000) * 1000);
printf("Dif total: %ldus ou %ldms \n", tv_dif_us, tv_dif_ms);
ts_dif_us = (tse.tv_sec - tsi.tv_sec) * 1000 * 1000 + (tse.tv_nsec - tsi.tv_nsec) / 1000; // nsec / 1000 para converter para usec
ts_dif_ms = ts_dif_us / 1000;
printf("---- Dif tempo cpu ---- \n");
printf("Ini: %10lds:%6ldus \n", tsi.tv_sec, tsi.tv_nsec / 1000);
printf("End: %10lds:%6ldus \n", tse.tv_sec, tse.tv_nsec / 1000);
printf("Dif: %10lds:%6ldus \n", ts_dif_ms / 1000, ts_dif_us - (ts_dif_ms / 1000) * 1000);
printf("Dif total: %ldus ou %ldms \n", ts_dif_us, ts_dif_ms);
return 0;