18 Haziran 2019 Salı

QueryPerformanceCounter metodu

Giriş
Şu satırı dahil ederiz.
#include <windows.h>
Açıklaması şöyle. Sistem saatinden bağımsızdır. Java'daki System.nano() ile aynıdır.
When you need time stamps with a resolution of 1 microsecond or better and you don't need the time stamps to be synchronized to an external time reference, choose QueryPerformanceCounter.
Windows 8
Açıklaması şöyle. TSC kısaltması Time Stamp Counter anlamına gelir. 64 bitlik bir register olarak düşünülebilir. HPET kısaltması High Precision Event Timer anlamına gelir.
QueryPerformanceCounter was always based on a TSC (as oppose to Windows 7, where it could be a TSC, HPET or the ACPI PM timer - the latter of which is especially rather inaccurate.)
Örnek - Saniye Süre Ölçme
Şöyle yaparız
LARGE_INTEGER frequency;
QueryPerformanceFrequency(&frequency);

LARGE_INTEGER start;
LARGE_INTEGER end;
QueryPerformanceCounter(&start);
...
QueryPerformanceCounter(end); 

double interval = (double) (end.QuadPart - start.QuadPart) / (frequency.QuadPart / 1000);
printf("%f ms\n", interval)
Örnek - Mikro saniye Süre Ölçme
Şöyle yaparız
long long unsigned int GetCurrentTimestamp()
{
   LARGE_INTEGER res;
   QueryPerformanceCounter(&res);
   return res.QuadPart;
}


long long unsigned int initalizeFrequency()
{
   LARGE_INTEGER res;
   QueryPerformanceFrequency(&res);
   return res.QuadPart;
}


//start time stamp

long long unsigned int start = GetCurrentTimestamp();

// ....
// execution that should be measured
// ....

std::cout << "Processing time is " << ((end - start) * 1000000 / initalizeFrequency()) 
            << " microsec "<< std::endl;
Sonuç olarak şunu alırız
Processing time is 24 microsec
Örnek
Şöyle yaparız.
SystemTime getSystemTime()
{
  LARGE_INTEGER t;
  
  if (!QueryPerformanceCounter(&t)) {
    return static_cast<SystemTime>(-1);
  }
  return static_cast<SystemTime>(t.QuadPart);
}
Örnek
Java kodu şöyle.
LARGE_INTEGER current_count;
QueryPerformanceCounter(&current_count);
double current = as_long(current_count);
double freq = performance_frequency;
jlong time = (jlong)((current/freq) * NANOSECS_PER_SEC);
return time;

Hiç yorum yok:

Yorum Gönder