Ответ 1
clock()
сообщает время процессора. sleep()
не использует процессорное время. Таким образом, ваш результат, вероятно, точно правильный, просто не то, что вы хотите.
Функция C clock()
возвращает мне ноль. Я пытался использовать разные типы, без улучшения... Является ли это хорошим способом измерения времени с хорошей точностью?
#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
Платформа: Intel 32 бит, RedHat Linux, gcc 3.4.6
clock()
сообщает время процессора. sleep()
не использует процессорное время. Таким образом, ваш результат, вероятно, точно правильный, просто не то, что вы хотите.
man clock
. Это не возвращает то, что вы думаете. Также man gettimeofday
- это скорее то, что вы хотите.
clock_t - целочисленный тип. Вы не можете распечатать его с помощью% f. Посмотрите ответ Фреда, почему разница равна 0.
printf("start = %.20f\nend = %.20f\n", start, end);
должен быть:
printf("start = %d\nend = %d\n", start, end);
Вызов sleep()
не будет использовать какое-либо время процессора. Однако вы должны увидеть небольшую разницу. Я исправил ошибку несоответствия типа printf в этой строке:
printf("start = %.20f\nend = %.20f\n", start, end);
И это дало разумные результаты на моей машине:
start = 1419
end = 1485
delta = 66
cpu_time_used = 0.000066000000000
CLOCKS_PER_SEC = 1000000
Вы можете попробовать gettimeofday()
, чтобы получить реальное время, потраченное на выполнение вашей программы.
Вероятно, вам нужно
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
и использование чего-то типа
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;
вместо clock()
как только часы, и учитывает только время, затраченное на процессор, только на основе счетчиков производительности. но вы можете получить результат, используя вышеприведенную функцию. просто чтобы убедиться, что ваше приложение запускает его с помощью команды времени
like time ./a.out
вывод команды времени:
real 0m5.987s
user 0m0.674s
sys 0m0.134s
и вывод пользовательской функции
Wall Time = 5.98505
CPU Time = 0.8