Какому из этих способов измерения верить?
Вот функция rdtsc() ( подсмотрено тут -
http://www.iakovlev.org/index.html?p=536)
extern __inline__ uint64_t rdtsc() {
uint64_t x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
Соответственно, для измерения интервала времени используется следующая конструкция:
ini = rdtsc();
usleep(0);
end = rdtsc();
time = (end -ini) / MHz;
printf("usleep itself : %llu ticks,\t %fµs\n\n", end - ini, time);
,где MHz - частота процессора.
Используя эту штуку, я контролирую частоту оборотов цикла в thread'е:
void myThread::run()
{
...
while( cycleflag )
{
...
Ini = rdtsc();
for( j = 0; j < 8; j++)
{
...
if( j == 7)
{
do { End = rdtsc();
loopTime = (End - Ini) / CPU_MHz;
} while( loopTime < 78930); // надо 100000(?), пауза в мкс
cerr << loopTime << " ";
Ini = End;
}
}
}
}
Мне надо, чтобы цикл while выполнялся 10 раз в секунду (за это время 80 раз выполняется цикл for). То есть после выполнения 8-ми оборотов цикла for я жду пока "натикает" до 0.1 секунды. Быстродействия хватает с головой.
Проблемы начались, когда я начал с каждым оборотом while выводить в файл время QTime с миллисекундами. Согласно этому времени, период цикла while был не 100 мс, а примерно 120 мс.
Кому больше верить QTime или rdtsc(), по кому из них синхронизировать цикл?
Кто, вообще, может что-нибудь сказать про стабильность rdtsc() ?