28 Aralık 2016 Çarşamba

QueryPerformanceCounter

Giriş 
Şu satırı dahil ederiz.
#include <windows.h>
Hassasiyeti (precision) nanosaniye cinsinden . Windows'un doğruluğu (accuracy) 200-300 mikrosaniye civarında.

Örnek 1
Şöyle yaparız. Frequency 1 saniyedeki tick sayısıdır. (Tick sayısı / Frequency) bölümü bize saniye verir. Saniyeyi milisaniyeye çevirmek için 1000 ile çarparız.
long long milliseconds_now() {
  static LARGE_INTEGER s_frequency;
  static BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
  
  LARGE_INTEGER now;
  QueryPerformanceCounter(&now);
  return (1000LL * now.QuadPart) / s_frequency.QuadPart;
  
}
Daha sonra şöyle yaparız.
// Somewhere else...
// ...
long long start = milliseconds_now();
// ....
long long elapsed = milliseconds_now() - start;
Örnek 2
Milisaniyeye çevirmek için 1000 ile çarpma yerine frekansın birimini en baştan değiştirebiliriz. Şöyle yaparız.
#include <windows.h>

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()
{
  LARGE_INTEGER li;
  if(!QueryPerformanceFrequency(&li))
  cout << "QueryPerformanceFrequency failed!\n";

  PCFreq = double(li.QuadPart)/1000.0;

  QueryPerformanceCounter(&li);
  CounterStart = li.QuadPart;
}
double GetCounter()
{
  LARGE_INTEGER li;
  QueryPerformanceCounter(&li);
  return double(li.QuadPart-CounterStart)/PCFreq;
}

int main()
{
  StartCounter();
  Sleep(1000);
  cout << GetCounter() <<"\n";
  return 0;
}

Hiç yorum yok:

Yorum Gönder