Функция для профайлинга...
От: DigitalGuru Россия http://svetlyak.ru
Дата: 22.06.06 16:59
Оценка:
Привет!
Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться
Re: Функция для профайлинга...
От: mr_jek  
Дата: 22.06.06 17:37
Оценка:
Здравствуйте, DigitalGuru, Вы писали:

DG>Привет!

DG>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.

Как насчет clock(3), правда нельзя сказать что это функция Linux?
Re[2]: Функция для профайлинга...
От: DigitalGuru Россия http://svetlyak.ru
Дата: 22.06.06 20:31
Оценка:
Здравствуйте, mr_jek, Вы писали:

_>Здравствуйте, DigitalGuru, Вы писали:


DG>>Привет!

DG>>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.

_>Как насчет clock(3), правда нельзя сказать что это функция Linux?


Разрешения сlock() может быть не достаточно для измерения малых интервалов вермени.
Re[3]: Функция для профайлинга...
От: mr_jek  
Дата: 22.06.06 20:49
Оценка:
Здравствуйте, DigitalGuru, Вы писали:

DG>Здравствуйте, mr_jek, Вы писали:


_>>Здравствуйте, DigitalGuru, Вы писали:


DG>>>Привет!

DG>>>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.

_>>Как насчет clock(3), правда нельзя сказать что это функция Linux?


DG>Разрешения сlock() может быть не достаточно для измерения малых интервалов вермени.


а какая точность нужна?
Re[4]: Функция для профайлинга...
От: DigitalGuru Россия http://svetlyak.ru
Дата: 22.06.06 21:20
Оценка:
Здравствуйте, mr_jek, Вы писали:

_>а какая точность нужна?


С точность до clock count.

Вот, нашел еще вот тут: http://www.linux.it/~rubini/docs/ksys/ (раздел Timing Execution)

Пример оттудова:

int main()
{
    unsigned long ini, end, now, best, tsc;
    int i;
    char buffer[4];

#define measure_time(code) \
    for (i = 0; i < NTRIALS; i++) { \
    rdtscl(ini); \
        code; \
    rdtscl(end); \
    now = end - ini; \
    if (now < best) best = now; \
    }

    /* time rdtsc (i.e. no code) */
    best = ~0;
    measure_time( 0 );
    tsc = best;

    /* time an empty read() */
    best = ~0;
    measure_time( read(STDIN_FILENO, buffer, 0) );

    /* report data */
    printf("rdtsc: %li ticks\nread(): %li ticks\n",
       tsc, best-tsc);
    return 0;
}

Можно еще на ассемблере то же самое написать, но только у меня на Athlon XP оба варианта работают неправильно
Re: Функция для профайлинга...
От: __MasteR__ Россия  
Дата: 23.06.06 05:45
Оценка:
Здравствуйте, DigitalGuru, Вы писали:

DG>Привет!

DG>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
DG>Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться

Посмотри в исходники.
Re: Функция для профайлинга...
От: Andriy Melnyk Украина  
Дата: 23.06.06 08:11
Оценка: 13 (2)
Здравствуйте, DigitalGuru, Вы писали:

DG>Привет!

DG>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
DG>Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться

для Pentium это можно делать используя RDTSC (Real Time-Stamp Counter)

Using the RDTSC Instruction for Performance Monitoring
_http://www.cs.usfca.edu/~cruse/cs210/rdtscpm1-1.pdf

#if defined(__i386__) || defined(__x86_64__)

static __inline__ unsigned long long int rdtsc(void)
{
  unsigned long long int x;
     __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
     return x;
}

#else

#error "No tick counter is available!"

#endif  // architecture

unsigned long long a,b;

a = rdtsc();
b = rdtsc();

printf("%llu\n", b-a);
Re: Функция для профайлинга...
От: MaximE Великобритания  
Дата: 23.06.06 14:43
Оценка: +1
DigitalGuru wrote:

> Какая функция под Linux, позволяет наиболее точно измерить время? Мне

> это нужно для измерения времени вывов так, как это делают профилировщики.

gettimeofday вернет время с максимальной точностью для твоей платформы.

> Граждан, которые собираются посоветовать мне "просто заюзать valgrind,

> oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться

valgrind исполняет код на синтетическом софтовом cpu, поэтому время
исполнения он скорее всего подсчитывает совсем по-другому.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re: Функция для профайлинга...
От: MaximE Великобритания  
Дата: 23.06.06 14:47
Оценка: 2 (1)
DigitalGuru wrote:

> Какая функция под Linux, позволяет наиболее точно измерить время? Мне

> это нужно для измерения времени вывов так, как это делают профилировщики.

Читай Chapter 7: Time, Delays, and Deferred Work
http://lwn.net/Kernel/LDD3/

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[2]: Функция для профайлинга...
От: MaximE Великобритания  
Дата: 26.06.06 07:36
Оценка: 6 (1) +1
Здравствуйте, Andriy Melnyk, Вы писали:

AM>Здравствуйте, DigitalGuru, Вы писали:


DG>>Привет!

DG>>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
DG>>Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться

AM>для Pentium это можно делать используя RDTSC (Real Time-Stamp Counter)


Автору топика это, скорее всего, не поможет.

Так как он хочет измерять время вызовов, чтобы rtsc давал осмысленные результаты код должен исполняться с interrupts disabled и с высоким SCHED_FIFO приоритетом. В противном случае ты будешь также замерять время исполнения обработчиков прерываний (timer, network, etc..) и других процессов, которые могут вытеснить наблюдаемый процесс.

Более, на мой взгляд, удачным решением было бы использование gettimeofday, или, еще лучше, clock_gettime(MONOTONIC, ...) / clock_gettime(CLOCK_THREAD_CPUTIME_ID, ...). Последний будет исключать время исполнения других потоков/процессов, но не время обработки прерываний (хотя это уже зависит от качества реализации). Проблема с gettimeofday в том, что это время может идти в обе стороны, т.к. системные часы могут быть подведены ntpd или юзверем.
Re: Функция для профайлинга...
От: XPGeeK Украина  
Дата: 27.06.06 06:12
Оценка:
Здравствуйте, DigitalGuru, Вы писали:

DG>Привет!

DG>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
DG>Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться

gprof тебе в руки!
Re[3]: Функция для профайлинга...
От: Andrew S.  
Дата: 28.06.06 15:50
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Более, на мой взгляд, удачным решением было бы использование gettimeofday, или, еще лучше, clock_gettime(MONOTONIC, ...) / clock_gettime(CLOCK_THREAD_CPUTIME_ID, ...). Последний будет исключать время исполнения других потоков/процессов, но не время обработки прерываний (хотя это уже зависит от качества реализации). Проблема с gettimeofday в том, что это время может идти в обе стороны, т.к. системные часы могут быть подведены ntpd или юзверем.


Я недавно мерял время работы clock_gettime, так clock_gettime(MONOTONIC) отъедал порядка 10-15 микросекунд на вызов (это было на AIX). Не монотонное обычное время, возвращаемое той-же функцией, выдавалось вдвое быстрее. Ну а то, что у меня работало после вызова занимало пару миллисекунд то есть в моем случае замер времени стоил дороже выполняемой операции но я время мерил для таймаута, а не для профайлинга... понятно, что на х86 картина может быть другая, это я просто — 5 копеек в копилку...

Ну и MONOTONIC — он от перевода системных часов не зависит — для того и придуман...

С уважением,

Андрей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.