Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

QueryPerformanceCounter and QueryPerformanceFrequency

373
02 мая 2005 года
unmoved
216 / / 28.11.2004
Кто нибудь, когда нибудь работал с этими функциями? Мне нужно измерить по времени выполнение функции, я в ее начале запрашиваю QueryPerformanceCounter, а затем в конце еще раз ее запрашиваю и отнимаю предыдущие значение. Я так понял, что она считает время по 100 наносекунд, засек на своих карманных часах выполнение функции - 7 секунд, а она мне сказала что прошло 25 секунд. Может я что-то не так делаю? GetThreadTimes вообщ ни куда не годиться, показывает, только те значения, которые больше чем 0,01 секунда.:(
406
05 мая 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by unmoved
Кто нибудь, когда нибудь работал с этими функциями? Мне нужно измерить по времени выполнение функции, я в ее начале запрашиваю 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);
}

7.1K
09 мая 2005 года
miXme
44 / / 10.04.2005
Если я отношусь к категории "ктонить", то работал :).
1. Почитай вот тут про классику ошибок с энтими фанкшанами.
2. Что значит на карманных??? Они подключаются к компу через USB *-) ?
3. Если хочешь конкретного мнения конкретных людей выложи кусок кода замера или хотя бы пример кода - как ты это делаешь.

PS. 2 vitaly2003s. Исчерпывающе!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог