Функция C `clock()` просто возвращает ноль
Вопрос
С 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
Платформа:32-разрядный процессор Intel, 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()
только как часы и только подсчитывает время, проведенное в процессоре, только на основе счетчиков производительности.но вы можете получить результат, используя приведенную выше функцию.просто чтобы проверить ваше приложение, запустите его с помощью команды time
Нравится time ./a.out
вывод команды time (время) :
real 0m5.987s
user 0m0.674s
sys 0m0.134s
и вывод пользовательской функции
Wall Time = 5.98505
CPU Time = 0.8