LINUX.ORG.RU

Вычсление времени выполнения функции.


0

2

Собственно как правильно в Си/Си++, желательно средствами POSIX или же хотя бы GNU Libc/libstdc++ узнать время выполнения функции в миллисекундах?
Пробовал использовать clock(), который, как я понял, должен показывать процессорное время работы функции в «тиках», но он при разных запусках разные результаты для одной функции с одним набором исходных данных. Кроме того, часто выдает вообще 0.

★★★

x86 - специфичный метод:

long long TimeValue=0;
unsigned long long time_RDTSC()
{ 
    union ticks
    { 
        unsigned long long tx;
        struct dblword { long tl,th; } dw; // little endian
    } t;
    asm("rdtsc\n": "=a"(t.dw.tl),"=d"(t.dw.th));
    return t.tx;
} // for x86 only!

void time_start()
{ 
    TimeValue=time_RDTSC(); 
}

long long time_stop() 
{ 
    return time_RDTSC()-TimeValue; 
}

Kosyak ★★★★ ()

Компилировать и линковать с ключом -pg, использовать gprof.

anonymous ()
#include <time.h>

time_t time_start, time_end;
time_start=time(NULL);
/* FSFGDS DESU */
time_end=time(NULL);
printf("%f секунд\n", difftime(time_end,time_start));

Полностью соответствует ANSI C.

Northsoft ★★ ()

man gettimeofday

что-то типа:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>

/* ... */

struct timeval start;
struct timeval end;
time_t s,ms;
gettimeofday(&start, NULL);

/* function */

gettimeofday(&end, NULL);
s = end.tv_sec - start.tv_sec;
ms = end.tv_usec - start.tv_usec;
if(ms<0){ s--; ms+=1000000; }
printf(«Total spent in function: %d.%d\n», s, ms);

/* ... */

siberean ()

clock_gettime() с CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID или CLOCK_THREAD_CPUTIME_ID, смотря что именно хочется замерить.

const86 ★★★★★ ()
Ответ на: комментарий от unikoid

У кого лабу купил?

скажешь что в инете вычитал. А если бы ты перед тем как создавать сотую дублирующую тему на лоре у гугла спросил то выполнил бы главную задачу института «учиться учиться».

true_admin ★★★★★ ()
Ответ на: комментарий от staseg

Результат gettimeofday() подвержен различным аномалиям, например, если юзер сменит системное время, хотя для целей ТС пойдет конечно. Правильный ответ clock_gettime().

frey ★★ ()
Ответ на: комментарий от unikoid

> CLOCK_PROCESS_CPUTIME_ID

и очень зря.

во-первых, тогда уж CLOCK_THREAD_CPUTIME_ID.

но это все равно CPUCLOCK_SCHED. замерьте им
время выполнения sleep(1), например.

idle ★★★★★ ()
Ответ на: комментарий от idle

Разумеется, в результате имеем 0. Поскольку программа никак не использовала процессор за это секунду. В моей ситуации, когда нужно замерить время работы алгоритма, такой подход, имхо, оптимален. Поскольку если мерить реальное время, оно будет постоянно плавать. Может у меня вообще во время запуска приступ 12309 случится и будет у меня сортировка выбором массива из 1000 uint32_t выполняться пару секунд.

unikoid ★★★ ()
Ответ на: комментарий от Kosyak

> time_RDTSC

А если функция начнет выполняться на одном процессоре (ядре), а закончит на другом? :-)

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.