Estou executando o Ubuntu 12.04 e usando o compilador gcc para compilar meus programas C / C ++. Eu quero benchmark de uma função. AFAIK, existem duas funções padrão para calcular o tempo em sistemas POSIX e ambos mostram resultados erráticos no Ubuntu:
gettimeofday clock_gettime
Aqui está o meu código:
int main()
{
float msec=0;
//struct timespec start,end;
struct timeval start,end;
//clock_gettime(CLOCK_MONOTONIC_RAW,&start);
//clock_gettime(CLOCK_REALTIME,&start);
gettimeofday(&start,NULL);
get_height(); //function i want to benchmark
/* usleep(1000000);*/
//clock_gettime(CLOCK_REALTIME,&end);
gettimeofday(&end,NULL);
//msec = (end.tv_sec-start.tv_sec)*1000 + (end.tv_nsec-start.tv_nsec)/(float)1000000;
msec = (end.tv_sec-start.tv_sec)*1000 + (end.tv_usec-start.tv_usec)/(float)1000;
printf("%0.2f ms.\n",msec); //41-44
}
O problema é que o milissegundo exibido está mostrando resultados erráticos / diferentes toda vez que o programa é executado. Algumas leituras de amostra são: 38,16 ms. 42,72 ms. 35,70 ms. 45,13 ms.
No entanto, quando eu testo com a função usleep (), o resultado mostra 1000 ms. devidamente. Alguma idéia de qual biblioteca / função devo usar para cronometrar minhas funções com precisão?
EDITAR: Isso é para esclarecer ainda mais que as funções clock_gettime mencionadas são apenas imprecisas no Ubuntu 12.04. Eu testei em outras máquinas, onde mostrou resultados precisos. Mesmo no Windows, as funções equivalentes de query_performance_counter () mostraram resultados precisos.