QueryPerformanceCounter and QueryPerformanceFrequency
Кто нибудь, когда нибудь работал с этими функциями? Мне нужно измерить по времени выполнение функции, я в ее начале запрашиваю QueryPerformanceCounter, а затем в конце еще раз ее запрашиваю и отнимаю предыдущие значение. Я так понял, что она считает время по 100 наносекунд, засек на своих карманных часах выполнение функции - 7 секунд, а она мне сказала что прошло 25 секунд. Может я что-то не так делаю? GetThreadTimes вообщ ни куда не годиться, показывает, только те значения, которые больше чем 0,01 секунда.:(
Цитата:
Originally posted by unmoved
Кто нибудь, когда нибудь работал с этими функциями? Мне нужно измерить по времени выполнение функции, я в ее начале запрашиваю QueryPerformanceCounter, а затем в конце еще раз ее запрашиваю и отнимаю предыдущие значение. Я так понял, что она считает время по 100 наносекунд, засек на своих карманных часах выполнение функции - 7 секунд, а она мне сказала что прошло 25 секунд. Может я что-то не так делаю? GetThreadTimes вообщ ни куда не годиться, показывает, только те значения, которые больше чем 0,01 секунда.:(
Кто нибудь, когда нибудь работал с этими функциями? Мне нужно измерить по времени выполнение функции, я в ее начале запрашиваю QueryPerformanceCounter, а затем в конце еще раз ее запрашиваю и отнимаю предыдущие значение. Я так понял, что она считает время по 100 наносекунд, засек на своих карманных часах выполнение функции - 7 секунд, а она мне сказала что прошло 25 секунд. Может я что-то не так делаю? GetThreadTimes вообщ ни куда не годиться, показывает, только те значения, которые больше чем 0,01 секунда.:(
Либо просто так:
LARGE_INTEGER lend;
S_PERFOMANCE_INFO spif;
float time_elapse=0;
//start time
QueryPerformanceFrequency(&spif.lfreq);
QueryPerformanceCounter(&spif.lstart);
//Do something
CallSomeFunc();
//end time
QueryPerformanceCounter(&lend);
time_elapse=((float)(lend.QuadPart-spif.lstart.QuadPart)/(float)(spif.lfreq.QuadPart));
//time_elapse consist result in sec
Либо Выдержка из MSDN:
Цитата:
#include "time.h"
enum { ttuUnknown, ttuHiRes, ttuClock } TimerToUse = ttuUnknown;
LARGE_INTEGER PerfFreq; // ticks per second
int PerfFreqAdjust; // in case Freq is too big
int OverheadTicks; // overhead in calling timer
void DunselFunction() { return; }
void DetermineTimer()
{
void (*pFunc)() = DunselFunction;
// Assume the worst
TimerToUse = ttuClock;
if ( QueryPerformanceFrequency(&PerfFreq) )
{
// We can use hires timer, determine overhead
TimerToUse = ttuHiRes;
OverheadTicks = 200;
for ( int i=0; i < 20; i++ )
{
LARGE_INTEGER b,e;
int Ticks;
QueryPerformanceCounter(&b);
(*pFunc)();
QueryPerformanceCounter(&e);
Ticks = e.LowPart - b.LowPart;
if ( Ticks >= 0 && Ticks < OverheadTicks )
OverheadTicks = Ticks;
}
// See if Freq fits in 32 bits; if not lose some precision
PerfFreqAdjust = 0;
int High32 = PerfFreq.HighPart;
while ( High32 )
{
High32 >>= 1;
PerfFreqAdjust++;
}
}
return;
}
double DoBench(void(*funcp)())
{
double time; /* Elapsed time */
// Let any other stuff happen before we start
MSG msg;
PeekMessage(&msg,NULL,NULL,NULL,PM_NOREMOVE);
Sleep(0);
if ( TimerToUse == ttuUnknown )
DetermineTimer();
if ( TimerToUse == ttuHiRes )
{
LARGE_INTEGER tStart, tStop;
LARGE_INTEGER Freq = PerfFreq;
int Oht = OverheadTicks;
int ReduceMag = 0;
SetThreadPriority(GetCurrentThread(),
THREAD_PRIORITY_TIME_CRITICAL);
QueryPerformanceCounter(&tStart);
(*funcp)(); //call the actual function being timed
QueryPerformanceCounter(&tStop);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
// Results are 64 bits but we only do 32
unsigned int High32 = tStop.HighPart - tStart.HighPart;
while ( High32 )
{
High32 >>= 1;
ReduceMag++;
}
if ( PerfFreqAdjust || ReduceMag )
{
if ( PerfFreqAdjust > ReduceMag )
ReduceMag = PerfFreqAdjust;
tStart.QuadPart = Int64ShrlMod32(tStart.QuadPart, ReduceMag);
tStop.QuadPart = Int64ShrlMod32(tStop.QuadPart, ReduceMag);
Freq.QuadPart = Int64ShrlMod32(Freq.QuadPart, ReduceMag);
Oht >>= ReduceMag;
}
// Reduced numbers to 32 bits, now can do the math
if ( Freq.LowPart == 0 )
time = 0.0;
else
time = ((double)(tStop.LowPart - tStart.LowPart
- Oht))/Freq.LowPart;
}
else
{
long stime, etime;
SetThreadPriority(GetCurrentThread(),
THREAD_PRIORITY_TIME_CRITICAL);
stime = clock();
(*funcp)();
etime = clock();
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
time = ((double)(etime - stime)) / CLOCKS_PER_SEC;
}
return (time);
}
1. Почитай вот тут про классику ошибок с энтими фанкшанами.
2. Что значит на карманных??? Они подключаются к компу через USB *-) ?
3. Если хочешь конкретного мнения конкретных людей выложи кусок кода замера или хотя бы пример кода - как ты это делаешь.
PS. 2 vitaly2003s. Исчерпывающе!