QueryPerformaceCounter

4 отговора 118 прегледа
#1

QueryPerformaceCounter

Необходимо ми е точно измерване на времезакъснения в Windows.
В момента съм решил проблема с API функциите QueryPerformanceFrequency
& QueryPerformanceCounter, които работят задоволително на
всичко от Pentium нагоре, обаче възникна следният проблем:
от време на време приложението ми излиза с "exit status 0" ???!?
и се оказа че в единствената допълнителна нишка, която ползвам,
последното, което се изпълнява, е точно QueryPerformanceCounter.
Като заменя функцията с GetTickCount всичко е ОК, обаче разделителната
способност е недостатъчна.
Някакви идеи откъде да намеря по-подробна информация за тези QueryPerformancе функции или друг portable начин за прецизно измерване на
време?

Защо в скапаните ПЦ-та няма свестен таймер? отврат :(

Отговор
в отговор на klapaucius #2

Re: QueryPerformaceCounter

Единствения проблем с тази ф-я (който ми е горещ, мамка им) е описан в
MSDN:
Q274323 - PRB: Performance Counter Value May Unexpectedly Leap Forward


[линк]

А иначе леко абсурдно ми се струва да гърми заради нея. Времето в компютрите е с точността на слънчев часовник.

Отговор
в отговор на klapaucius #3

това върши ли работа?


__int64 r;
_asm{
rdtsc
lea ebx,r
mov [ebx],eax
mov [ebx+4],edx
}
return r;

ще ти върне броя на машинните тактове изпълнени от запалването на компота до сега. верно че трябва предварително да си измериш цепеуто, ама това да е само. аз го ползвам много и нямам оплаквания.

Отговор
в отговор на zaphod #4

Re: това върши ли работа?

Ами знам го това и ми върши работа, ама ще трябва:
1. Да засека скоростта на ЦПУ-то (напр. като преброя тактовете за 1 секунда)
2. Да си направя някфа ДеЕлЕл функция, щото тук не става дума за Ц
Май в крайна сметка точно така ще направя. Утре.

п.п. еееех, как се надявах на този перформанце коунтер ....

Отговор
в отговор на klapaucius #5

искаш ло готов клас?

имам си направен. има две функции
double GetTime() - връща времето в секунди
double GetPause() - връща интервала от предишното викане за същата инстанция. ползвам го за намиране на dt.
има и една променлива CPUClock
номера е следния - като се извика конструктора за първи път, то се измерва клока, и се вдига флаг че е измерен. меренето го правя като първо чакам да се смени резултата на GetTickCount() и после чакам да минат 100 млс. става доста точно.

Отговор