C - измерение вычислительного времени - PullRequest
7 голосов
/ 13 апреля 2011

Есть ли простой способ, как измерить время вычислений в C?Я пробовал утилиту времени, когда выполнялся, но мне нужно измерить определенную часть программы.

Спасибо

Ответы [ 4 ]

14 голосов
/ 13 апреля 2011

Вы можете использовать функцию clock в <time.h> вместе с макросом CLOCKS_PER_SEC:

clock_t start = clock() ;
do_some_work() ;
clock_t end = clock() ;
double elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ;

Теперь elapsed_time содержит время, необходимое для вызова do_some_work, в долях секунды.

2 голосов
/ 13 апреля 2011

Вы можете попробовать профилировщик "gprof".Больше информации здесь: http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html

1 голос
/ 13 апреля 2011

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

#define COUNT 10000

// Get cost of naked loop.

clock_t start_base = clock();
for (int i = count; i > 0; i--)
    ;
clock_t end_base = clock();

// Get cost of loop plus work.

clock_t start = clock();
for (int i = count; i > 0; i--)
    do_some_work() ;
clock_t end = clock();

// Calculate cost of single call.

double elapsed_time = end - start - (end_base - start_base);
elapsed_time = elapsed_time / CLOCKS_PER_SEC / COUNT;

Это имеет как минимум два преимущества:

  • вы получите среднее время, которое больше отражает фактическое время, которое оно должно занять;и
  • вы получите более точный ответ в случае, когда функция clock() имеет ограниченное разрешение.
0 голосов
/ 13 апреля 2011

@ codebolt - Спасибо!очень хорошо.В Mac OS X я добавил include of time.h и вставил его в четыре строки.Затем я напечатал значения start, stop (целые числа) и прошедшего времени.Разрешение 1 мс.

output:
3 X: strcpy .name, .numDocks: start 0x5dc   end 0x5e1   elapsed: 0.000005 
calloc: start 0x622   end 0x630   elapsed: 0.000014 

в моей программе foo.c у меня есть

#include <libc.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

, но она работает без явного включения time.h.Один из других должен принести его.

Фактический код:

clock_t start = clock() ;

strcpy( yard2.name, temp );  /* temp is only persistant in main... */
strcpy( yard1.name, "Yard 1");
strcpy( yard3.name, "3 y 3 a 3 r 3 d 3");
yard1.numDocks = MAX_DOCKS; /* or so I guess.. */
yard2.numDocks = MAX_DOCKS; /* or so I guess.. */
yard3.numDocks = MAX_DOCKS; /* or so I guess.. */

clock_t end = clock() ;
double elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ;
printf("3 X: strcpy .name, .numDocks: start 0x%x   end 0x%x   elapsed: %-12:8f \n", start, end, elapsed_time );


start = clock() ;
arrayD = calloc( yard2.numDocks, sizeof( struct dock ) );   /* get some memory, init it to 0 */
end = clock() ;

elapsed_time = (end-start)/(double)CLOCKS_PER_SEC ;
printf("calloc: start 0x%x   end 0x%x   elapsed: %-12:8f \n", start, end, elapsed_time );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...