QueryPerformaceCounter
4 отговора
118 прегледа
QueryPerformaceCounter
Необходимо ми е точно измерване на времезакъснения в Windows.
В момента съм решил проблема с API функциите QueryPerformanceFrequency
& QueryPerformanceCounter, които работят задоволително на
всичко от Pentium нагоре, обаче възникна следният проблем:
от време на време приложението ми излиза с "exit status 0" ???!?
и се оказа че в единствената допълнителна нишка, която ползвам,
последното, което се изпълнява, е точно QueryPerformanceCounter.
Като заменя функцията с GetTickCount всичко е ОК, обаче разделителната
способност е недостатъчна.
Някакви идеи откъде да намеря по-подробна информация за тези QueryPerformancе функции или друг portable начин за прецизно измерване на
време?
Защо в скапаните ПЦ-та няма свестен таймер? отврат :(
В момента съм решил проблема с API функциите QueryPerformanceFrequency
& QueryPerformanceCounter, които работят задоволително на
всичко от Pentium нагоре, обаче възникна следният проблем:
от време на време приложението ми излиза с "exit status 0" ???!?
и се оказа че в единствената допълнителна нишка, която ползвам,
последното, което се изпълнява, е точно QueryPerformanceCounter.
Като заменя функцията с GetTickCount всичко е ОК, обаче разделителната
способност е недостатъчна.
Някакви идеи откъде да намеря по-подробна информация за тези QueryPerformancе функции или друг portable начин за прецизно измерване на
време?
Защо в скапаните ПЦ-та няма свестен таймер? отврат :(
Re: QueryPerformaceCounter
Единствения проблем с тази ф-я (който ми е горещ, мамка им) е описан в
MSDN:
Q274323 - PRB: Performance Counter Value May Unexpectedly Leap Forward
[линк]
А иначе леко абсурдно ми се струва да гърми заради нея. Времето в компютрите е с точността на слънчев часовник.
MSDN:
Q274323 - PRB: Performance Counter Value May Unexpectedly Leap Forward
[линк]
А иначе леко абсурдно ми се струва да гърми заради нея. Времето в компютрите е с точността на слънчев часовник.
това върши ли работа?
__int64 r;
_asm{
rdtsc
lea ebx,r
mov [ebx],eax
mov [ebx+4],edx
}
return r;
ще ти върне броя на машинните тактове изпълнени от запалването на компота до сега. верно че трябва предварително да си измериш цепеуто, ама това да е само. аз го ползвам много и нямам оплаквания.
Re: това върши ли работа?
Ами знам го това и ми върши работа, ама ще трябва:
1. Да засека скоростта на ЦПУ-то (напр. като преброя тактовете за 1 секунда)
2. Да си направя някфа ДеЕлЕл функция, щото тук не става дума за Ц
Май в крайна сметка точно така ще направя. Утре.
п.п. еееех, как се надявах на този перформанце коунтер ....
1. Да засека скоростта на ЦПУ-то (напр. като преброя тактовете за 1 секунда)
2. Да си направя някфа ДеЕлЕл функция, щото тук не става дума за Ц
Май в крайна сметка точно така ще направя. Утре.
п.п. еееех, как се надявах на този перформанце коунтер ....
искаш ло готов клас?
имам си направен. има две функции
double GetTime() - връща времето в секунди
double GetPause() - връща интервала от предишното викане за същата инстанция. ползвам го за намиране на dt.
има и една променлива CPUClock
номера е следния - като се извика конструктора за първи път, то се измерва клока, и се вдига флаг че е измерен. меренето го правя като първо чакам да се смени резултата на GetTickCount() и после чакам да минат 100 млс. става доста точно.
double GetTime() - връща времето в секунди
double GetPause() - връща интервала от предишното викане за същата инстанция. ползвам го за намиране на dt.
има и една променлива CPUClock
номера е следния - като се извика конструктора за първи път, то се измерва клока, и се вдига флаг че е измерен. меренето го правя като първо чакам да се смени резултата на GetTickCount() и после чакам да минат 100 млс. става доста точно.