#c
#c
Вопрос:
Я прочитал статью из geeksforgeeks.Код показывает функцию для измерения стоимости функции времени.
На моей машине я всегда получаю 0.000000, независимо от того, как долго я нажимаю enter.
Я печатаю t = clock () — t; t всегда равно 0,00000, я переписываю инструкцию на это, все равно получается 0,000000.
clock_t m;
m = clock() - t;
версия gcc в centos7
[root@localhost log]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
/* Program to demonstrate time taken by function fun() */
#include <stdio.h>
#include <time.h>
// A function that terminates when enter key is pressed
void fun()
{
printf("fun() starts n");
printf("Press enter to stop fun n");
while(1)
{
if (getchar())
break;
}
printf("fun() ends n");
}
// The main program calls fun() and measures time taken by fun()
int main()
{
// Calculate the time taken by fun()
clock_t t;
t = clock();
fun();
t = clock() - t;
double time_taken = ((double)t)/CLOCKS_PER_SEC; // in seconds
printf("fun() took %f seconds to execute n", time_taken);
return 0;
}
Комментарии:
1. Ваш код здесь работает нормально. Вы пытались исследовать это? Вы пытались вывести на печать соответствующие промежуточные значения и переменные?
2. Если
clock()
произойдет возврат «количества тактов в 100 миллисекунд», то (если вам не повезет) функция может занять 99.99 миллисекунд, и в конечном итоге она будет усечена до нуля.3.
clock()
возвращает время процессора (которого вы, вероятно, используете не так много), а не настенные часы. используйтеtime()
вместо этого (или сделайте прерывание цикла наgetchar() == 'a'
или аналогичном и передайте ему кучу новых строк перед ‘a’).4. Hrm — мог бы изменить это на
printf("fun() took between %f and %f seconds to execute n", time_taken - 1.0/CLOCKS_PER_SEC, time_taken 1.0/CLOCKS_PER_SEC);
. Это дало бы вам лучшее представление о том, насколько точен вашclock()
.5. Я также укажу на причину, по которой вы не используете много процессорного времени, в том, что
getchar()
происходит блокировка. Вы также можете использоватьclock_gettime()
(илиgettimeofday()
) для более точных настенных часов, если это то, что вам нужно.
Ответ №1:
Привет, попробуйте это вместо:
unsigned int t=time(0);
fun();
unsigned int result=time(0)-t; // result is the time taken by fun
Ответ №2:
В случае, если вы пытаетесь измерить «Используемое процессорное время» (а не «время, затраченное на настенные часы в ожидании нажатия пользователем клавиши»), тогда…
Представьте, что в операционной системе есть таймер, который генерирует IRQ 10 раз в секунду, и обработчик IRQ просто делает ticks
; и clock()
это просто return ticks;
. В этом случае CLOCKS_PER_SEC
было бы равно 10.
Теперь, если вы вызываете clock()
один раз непосредственно перед срабатыванием таймера IRQ и снова сразу после срабатывания таймера IRQ, разница между возвращаемыми значениями может составлять 1 (равно 100 мс), даже если между вызовами прошло значительно меньше времени clock()
.
Альтернативно; если вы вызываете clock()
один раз сразу после того, как происходит IRQ по таймеру, и еще раз непосредственно перед тем, как снова происходит IRQ по таймеру, разница между возвращаемыми значениями может составлять 0, даже значительно больше времени, прошедшего между вызовами clock()
.
По сути, разница между значениями, возвращаемыми clock()
, составляет «до 1/CLOCKS_PER_SEC
раньше, чем вы думаете» и «до 1/CLOCKS_PER_SEC
дольше, чем вы думаете».
Обратите внимание, что значение CLOCKS_PER_SEC
определяется реализацией. В зависимости от различных факторов (какая версия какой ОС работает на каком оборудовании, с какой библиотекой C) CLOCKS_PER_SEC
может быть любым, и может составлять всего 10, а может быть и более 4 миллиардов.
Ответ №3:
clock()
измеряет время процессора, то есть время, в течение которого процессор был активен. Вместо этого вы можете измерить время на настенных часах, которое представляет собой количество секунд от начала до конца выполнения функции:
struct timeval start;
gettimeofday(amp;start, 0);
fun();
struct timeval end;
gettimeofday(amp;end, 0);
double time_taken = (end.tv_sec - start.tv_sec)
(end.tv_usec - start.tv_usec)*1e-6;
Чтобы это сработало, вы также должны включить <sys/time.h>