LINUX.ORG.RU

Точное измерение временных промежутков


0

0

Оптимизирую прогу на C++. Хочу найти, какая именно часть выполняется наиболее медленно. Но есть проблема: там цикл, и каждая итерация длится около 0.01 сек. Мне надо исследовать отдельные этапы внутри итерации. Подход с clock() нужную разрешающую способность не обеспечивает. Есть другие способы? Мне пох, в каких это будет единицах - секунды, такты... Мне главное - точность.

anonymous

glibc-profile (GNU C libraries with profiling support)

ip1981 ☆☆
()


$ man clock_gettime()

что конечно же упрется как минимум в разрешающую способность системного таймера. впрочем, для 1/100s вполне должно хватить.

// wbr

klalafuda ★☆☆
()

йпт, зачем исследования. У профи должен быть нюх

dilmah ★★★★★
()

valgrind --tool=cachegrind
kcachegrind

sf ★★★
()

#ifndef __TSC_TSCMEASUREMENT_H__
#define __TSC_TSCMEASUREMENT_H__

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
	long unsigned	tsc_low,
			tsc_high,
			tsc_low1,
			tsc_high1;
} TscMeasurement;

#define rdtsc(low,high) \
     __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))

inline void tsc_start_measurement (TscMeasurement *tm) {
	rdtsc (tm->tsc_low, tm->tsc_high);
}

inline void tsc_stop_measurement (TscMeasurement *tm) {
	rdtsc (tm->tsc_low1, tm->tsc_high1);
}

inline long long unsigned tsc_get_ticks (const TscMeasurement *tm)
{
	long long unsigned tsc, tsc1;
	tsc = (long long unsigned) tm->tsc_high << 32 |
		((long long unsigned) tm->tsc_low & 0xffffffff);
	tsc1 = (long long unsigned) tm->tsc_high1 << 32 |
		((long long unsigned) tm->tsc_low1 & 0xffffffff);
	return tsc1 - tsc;
}

#ifdef __cplusplus
}
#endif

#endif /*__TSC_TSCMEASUREMENT_H__*/

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

вместо

#define rdtsc(low,high) \ __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))

можно

#define rdtsc(tsc) \ __asm__ __volatile___( "rdtsc" : "=A" (tsc) );

дальше сами переделывайте

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

> можно

> #define rdtsc(tsc) \ __asm__ __volatile___( "rdtsc" : "=A" (tsc) );

точно, спасибо!

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