A função C `clock()` apenas retorna um zero
Pergunta
O C clock()
função apenas me retorna um zero.Tentei usar tipos diferentes, sem melhora...Esta é uma boa maneira de medir o tempo com boa precisão?
#include <time.h>
#include <stdio.h>
int main()
{
clock_t start, end;
double cpu_time_used;
char s[32];
start = clock();
printf("\nSleeping 3 seconds...\n\n");
sleep(3);
end = clock();
cpu_time_used = ((double)(end - start)) / ((double)CLOCKS_PER_SEC);
printf("start = %.20f\nend = %.20f\n", start, end);
printf("delta = %.20f\n", ((double) (end - start)));
printf("cpu_time_used = %.15f\n", cpu_time_used);
printf("CLOCKS_PER_SEC = %i\n\n", CLOCKS_PER_SEC);
return 0;
}
Sleeping 3 seconds... start = 0.00000000000000000000 end = 0.00000000000000000000 delta = 0.00000000000000000000 cpu_time_used = 0.000000000000000 CLOCKS_PER_SEC = 1000000
Plataforma:Intel 32 bits, RedHat Linux, gcc 3.4.6
Solução
clock()
relata o tempo da CPU usado. sleep()
Não usa tempo de CPU. Portanto, seu resultado provavelmente está exatamente correto, apenas o que você deseja.
Outras dicas
man clock
. Não está retornando o que você acha que é. Também man gettimeofday
- É mais provável que você queira.
Clock_t é do tipo inteiro. Você não pode imprimi -lo com %f. Ver Resposta de Fred Pelo por que a diferença é 0.
printf("start = %.20f\nend = %.20f\n", start, end);
deveria estar:
printf("start = %d\nend = %d\n", start, end);
Chamando sleep()
não vai consumir nenhum tempo de CPU.Você deveria ver um pequeno diferença, no entanto.Corrigi seu bug de incompatibilidade de tipo printf nesta linha:
printf("start = %.20f\nend = %.20f\n", start, end);
E deu resultados razoáveis na minha máquina:
start = 1419
end = 1485
delta = 66
cpu_time_used = 0.000066000000000
CLOCKS_PER_SEC = 1000000
Você pode tentar gettimeofday()
para obter o tempo real gasto na execução do seu programa.
Você provavelmente precisa
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
e usar algo como
double wall0 = get_wall_time();
double cpu0 = get_cpu_time();
for(long int i = 0; i<=10000000;i++){
func1();
}
double wall1 = get_wall_time();
double cpu1 = get_cpu_time();
cout << "Wall Time = " << wall1 - wall0 << endl;
cout << "CPU Time = " << cpu1 - cpu0 << endl;
ao invés de clock()
Como apenas o relógio e apenas conta o tempo gasto na CPU apenas com base em contadores de desempenho. Mas você pode obter resultado usando a função acima. Apenas para verificar seu aplicativo, execute -o com o comando de tempo
Curti time ./a.out
saída do comando de tempo:
real 0m5.987s
user 0m0.674s
sys 0m0.134s
e saída da função personalizadaWall Time = 5.98505
CPU Time = 0.8