Получить количество времени для запуска функции в C - PullRequest
1 голос
/ 16 ноября 2011

Так что это довольно просто, но я на самом деле не знаю C.

Я хочу найти количество миллисекунд, которое требуется для выполнения, а не тактовые (CPU) циклы.Я пытался использовать

struct timeval start,end;
double dif;

gettimeofday(&start, 0);
//do stuff
gettimeofday(&end, 0);
dif = (end - start) / 1000.0;
printf("The time taken was %lf \n",dif);

. Я получаю эту ошибку, когда пытаюсь скомпилировать:

bubble.c: В функции 'main':bubble.c: 55: ошибка: недопустимые операнды в двоичном - (имеют «struct timeval» и «struct timeval»)

Ответы [ 5 ]

3 голосов
/ 16 ноября 2011

Изменить

dif = (end - start) * 1000;

на

dif = (end.tv_sec - start.tv_sec) * 1000 
+ (end.tv_usec - start.tv_usec) / 1000;

В псевдокоде:

Get the seconds part of the time delta
Multiply by 1000 to get milliseconds
Get the microseconds part of the time delta
Divide that part by 1000
Add that part to the milliseconds from seconds delta
1 голос
/ 16 ноября 2011

Вы хотите:

dif = (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec) / 1000.0;

Примечание 1: вам необходимо tv_sec для обработки даже кратковременного пересечения секундной отметки.

Примечание 2: Второй член делится на 1000,0, поэтомукак использовать с плавающей запятой, а не целочисленное деление.

0 голосов
/ 16 ноября 2011

В Linux лучший способ добиться этого - использовать интерфейс times (2), а не gettimeofday (2) читать man-страницу.

Человек 2 раза.

Имеет изысканную верность

0 голосов
/ 16 ноября 2011
  1. Убедитесь, что вы используете правильный заголовок ("#include")

  2. Используйте «timersub ()», чтобы получить разницу, вместо того, чтобы вычитать конечный старт:

http://linux.die.net/man/3/timeradd

Надеюсь, это поможет .. PSM

0 голосов
/ 16 ноября 2011

Для быстрого теста я бы использовал clock() и CLOCKS_PER_SEC.

Вот код макроса, который я использую:

#define CLOCK_TICK(acc, ctr)  ctr = std::clock()
#define CLOCK_TOCK(acc, ctr)  acc += (std::clock() - ctr)
#define CLOCK_RESET(acc) acc = 0
#define CLOCK_REPORT(acc) (1000. * double(acc) / double(CLOCKS_PER_SEC))

static clock_t t1a, t1c;


int main()
{
   while (true)
   {
     CLOCK_RESET(t1a);
     init_stuff();
     CLOCK_TICK(t1a, t1c);
     critical_function();
     CLOCK_TOCK(t1a, t1c);

     std::cout << "This round took " << CLOCK_REPORT(t1a) << "ms.\n";
   }
}

Вы можете получить часы с более высоким разрешением из нового заголовка <chrono>. Макросы должны быть простыми для адаптации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...