Время измерения функции в C получено всегда 0.000000 - PullRequest
0 голосов
/ 28 марта 2019

Я прочитал форму статьи geeksforgeeks . Код показывает функцию для измерения стоимости функции времени.

В моей машине я всегда получал 0,000000 независимо от того, как долго я нажимаю клавишу ввода.

Я печатаю 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; 
} 

Ответы [ 3 ]

0 голосов
/ 28 марта 2019

Если вы пытаетесь измерить «время процессора» (а не «время настенных часов, потраченное на ожидание нажатия клавиши пользователем»), тогда ...

Представьте, что ОС имееттаймер, который генерирует 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 млрд.

0 голосов
/ 28 марта 2019

clock() измеряет время процессора, то есть время, когда процессор был активен.Вместо этого вы можете измерить время на настенных часах, которое представляет собой количество секунд от начала до конца запуска функции:

struct timeval start;
gettimeofday(&start, 0); 
fun();
struct timeval end;
gettimeofday(&end, 0); 
double time_taken = (end.tv_sec - start.tv_sec)
    + (end.tv_usec - start.tv_usec)*1e-6;

Чтобы сделать эту работу, вы также должны включить <sys/time.h>

0 голосов
/ 28 марта 2019

Здравствуйте, попробуйте вместо этого:

unsigned int t=time(0);
fun();
unsigned int result=time(0)-t; // result is the time taken by fun
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...