Привет!
Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться
Здравствуйте, DigitalGuru, Вы писали:
DG>Привет! DG>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
Как насчет clock(3), правда нельзя сказать что это функция Linux?
Здравствуйте, mr_jek, Вы писали:
_>Здравствуйте, DigitalGuru, Вы писали:
DG>>Привет! DG>>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
_>Как насчет clock(3), правда нельзя сказать что это функция Linux?
Разрешения сlock() может быть не достаточно для измерения малых интервалов вермени.
Здравствуйте, DigitalGuru, Вы писали:
DG>Здравствуйте, mr_jek, Вы писали:
_>>Здравствуйте, DigitalGuru, Вы писали:
DG>>>Привет! DG>>>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики.
_>>Как насчет clock(3), правда нельзя сказать что это функция Linux?
DG>Разрешения сlock() может быть не достаточно для измерения малых интервалов вермени.
Здравствуйте, DigitalGuru, Вы писали:
DG>Привет! DG>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики. DG>Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться
Здравствуйте, DigitalGuru, Вы писали:
DG>Привет! DG>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики. DG>Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться
для Pentium это можно делать используя RDTSC (Real Time-Stamp Counter)
#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// architectureunsigned long long a,b;
a = rdtsc();
b = rdtsc();
printf("%llu\n", b-a);
DigitalGuru wrote:
> Какая функция под Linux, позволяет наиболее точно измерить время? Мне > это нужно для измерения времени вывов так, как это делают профилировщики.
gettimeofday вернет время с максимальной точностью для твоей платформы.
> Граждан, которые собираются посоветовать мне "просто заюзать valgrind, > oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться
valgrind исполняет код на синтетическом софтовом cpu, поэтому время
исполнения он скорее всего подсчитывает совсем по-другому.
DigitalGuru wrote:
> Какая функция под Linux, позволяет наиболее точно измерить время? Мне > это нужно для измерения времени вывов так, как это делают профилировщики.
Здравствуйте, 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 или юзверем.
Здравствуйте, DigitalGuru, Вы писали:
DG>Привет! DG>Какая функция под Linux, позволяет наиболее точно измерить время? Мне это нужно для измерения времени вывов так, как это делают профилировщики. DG>Граждан, которые собираются посоветовать мне "просто заюзать valgrind, oprofile или что-нибудь в этом же духе", заранее прошу не беспокоиться
Здравствуйте, 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 — он от перевода системных часов не зависит — для того и придуман...