Поделиться 

Автор: Alexander Korolev
Иногда, а точнее почти всегда, необходимо замерять время выполнения некоторых участков кода. Для этого есть удобное и весьма точное средство — QueryPerformanceCounter. Однако при его использовании необходимы некоторые преобразования, чтобы получить результат в секундах.
Чтобы каждый раз не ковыряться с реализацией такого таймера, и уж тем более не вставлять повсеместно эти одинаковые преобразования в программе, я написал и использую следующий очень простой и удобный класс:
qpc_timer.h: #pragma once #include <windows.h> class QPC_Timer { private: double invfreq; LONGLONG oldticks; LARGE_INTEGER i; public: QPC_Timer() { QueryPerformanceFrequency(&i); invfreq = 1.0 / i.QuadPart; QueryPerformanceCounter(&i); oldticks = i.QuadPart; } inline double Get() { QueryPerformanceCounter(&i); return (i.QuadPart - oldticks) * invfreq; } inline double Reset() { QueryPerformanceCounter(&i); double delta = (i.QuadPart - oldticks) * invfreq; oldticks = i.QuadPart; return delta; } };
Замеры времени становятся до боли простыми:
#include <qpc_timer.h> int main() { QPC_Timer tmr; // Example #1 while (true) { ... // some code double deltaTime = tmr.Reset(); } // Example #2 tmr.Reset(); ... // some code double someCodeTiming = tmr.Get(); // etc. }
16 марта 2011
| Мизраэль | Постоялец | www | 16 мар. 2011 | 16:46 | #3 |
|---|
| MarkoPolo | Постоялец | www | 16 мар. 2011 | 17:18 | #5 |
|---|
Правка: 16 мар. 2011 17:19
| ElWray | Постоялец | www | 16 мар. 2011 | 19:12 | #6 |
|---|
| .L | Участник | www | 16 мар. 2011 | 20:05 | #7 |
|---|
#ifndef Timer_h__ #define Timer_h__ #define TIMER_QPC #ifndef TIMER_QPC #define TIMER_TGT #endif namespace Video { class Timer { private: #ifdef TIMER_TGT static int refCount = 0; DWORD lastTime, curTime, diff; #else __int64 lastTime, curTime, diff, perfFreq; #endif float timeElapsed; public: Timer() :timeElapsed(0) { #ifdef TIMER_TGT if(refCount == 0) timeBeginPeriod(1); refCount++; #else QueryPerformanceFrequency((LARGE_INTEGER *)&perfFreq); #endif } ~Timer() { #ifdef TIMER_TGT refCount--; if(refCount == 0) timeEndPeriod(1); #endif } void Start() { #ifdef TIMER_TGT lastTime = timeGetTime(); #else QueryPerformanceCounter((LARGE_INTEGER *)&lastTime); #endif } void Stop() { #ifdef TIMER_TGT curTime = timeGetTime(); diff = curTime - lastTime; timeElapsed = 1.0d / (double)diff; //time in SECONDS #else QueryPerformanceCounter((LARGE_INTEGER *)&curTime); if(lastTime == 0) timeElapsed = 0; else { timeElapsed = (float)((double)(curTime - lastTime) / (double)perfFreq); } #endif } float getTimeElapsed() { return timeElapsed; } }; } #endif // Timer_h__
| NULL_PTR | Постоялец | www | 16 мар. 2011 | 21:54 | #8 |
|---|
| GluKoBug | Постоялец | www | 16 мар. 2011 | 22:46 | #9 |
|---|
| NULL_PTR | Постоялец | www | 16 мар. 2011 | 23:23 | #10 |
|---|
| GluKoBug | Постоялец | www | 16 мар. 2011 | 23:30 | #11 |
|---|
Правка: 16 мар. 2011 23:30
| NULL_PTR | Постоялец | www | 16 мар. 2011 | 23:44 | #12 |
|---|
| KpeHDeJIb | Участник | www | 16 мар. 2011 | 23:53 | #13 |
|---|
| NULL_PTR | Постоялец | www | 16 мар. 2011 | 23:57 | #14 |
|---|
QueryPerformanceFrequency Function: The frequency cannot change while the system is running.
QueryPerformanceCounter Function: On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL).
/ Форум / Программирование игр / Общее