Измерение времени, затраченного функцией в C, всегда равно 0.000000

#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>