HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Az idő precíz mérése programból


Példaprogram letöltése

11826 bájt

Ha valaki már használta a Timer komponenst, akkor tapasztalhatta, hogy az így készült időzítések bizony nem az Interval property-ben beállított értéktől függnek, hanem a processzor pillanatnyi kedvétől és szabadidejétől. Ha ugyanis a processzor terhelt más alkalmazás miatt, akkor a Timer időzítő is jelentős késéssel fogja csak az Tick eseményt generálni.
Szerencsére ennél pontosabb időmérésre is lehetőségünk nyílik programból. Adott minden számítógépen egy olyan pici hardver elem, melynek egyetlen feladata az idő múlásának számlálása méghozzá a processzortól függetlenül. E számláló aktuális értékét felhasználva már igen precízen mérhetjük az időt, akár milliomod másodpercnyi pontossággal is.

A mellékelt példa használatához szükséges a CounterComponentLibrary projekt lefordítása és az ebben található CounterComponent komponens felvétele a ToolBox-ra.
Ez a hardver elem számítógépenként már és más sebességgel számlálhatja az eltelt időt. Így mielőtt felhasználnánk az általa szolgáltatott értéket előbb meg kell tudnunk, hogy egy másodperc alatt hány számlálás történik. Nyilvánvaló, hogy ha ez az érték minél nagyobb, annál pontosabban történik az idő mérése.
Ennek lekérdezését a QueryPerformanceFrequency Windows függvény segítségével tehetjük meg. Paraméterként egy 64 bites egész számot tárolni képes változót kell átadnunk. Ha a függvény visszatérési értéke igaz, akkor sikeresen megtörtént a lekérdezés, hamis érték esetén az adott számítógép nem támogatja hardveresen ezt a funkciót. Ilyen géppel manapság viszont már nem igen találkozhatunk.
A számláló aktuális értékét a QueryPerformanceCounter Windows függvénnyel kérdezhetjük le. Paraméterként ez is egy 64 bites változót vár.
Készítsünk egy osztályt e két függvény használatához. Mindkét függvény a Kernel32.dll-ben található, így csak hivatkoznunk kell rájuk.
  public class Win32
  {
    [System.Runtime.InteropServices.DllImport("KERNEL32")]
    public static extern bool QueryPerformanceCounter(ref long lpPerformanceCount);
    [System.Runtime.InteropServices.DllImport("KERNEL32")]
    public static extern bool QueryPerformanceFrequency(ref long lpFrequency);                     
  }
Szükség lesz még egy változóra is, mely tárolja a számláló aktuális értékét.
   private long start = 0;
A Start függvénynél csak annyi a teendőnk, hogy lekérdezzük e számláló aktuális értékét és tároljuk a változónkban.
    public void Start()
    {
      Win32.QueryPerformanceCounter(ref start);
    }
Amikor az időmérést szeretnénk befejezni, akkor kell meghívni a Stop függvényt. Ekkor ismét lekérdezzük a számláló értékét, melyet most a stop nevű változóba tárolunk.
    public float Stop()
    {
      long stop = 0;
      Win32.QueryPerformanceCounter(ref stop);
Az eredmény kiszámításához szükségünk lesz az időmérő frekvenciájára is, melynek értéke a freq változóba kerül.
      long freq = 0;
      Win32.QueryPerformanceFrequency(ref freq);
E három változó értékének ismeretében már könnyedén kiszámítható az eltelt idő a Start és a Stop függvény meghívása között.
      return ((float)(stop-start)/(float)freq);
    }
A számlálót kiválóan felhasználhatjuk arra, hogy egy-egy programrészlet futási idejét lemérjük vele, de könnyen készíthetünk időzítőt is ez alapján.
    private void button1_Click(object sender, System.EventArgs e)
    {
      counterComponent1.Start();
      for (int i=0; i<10000000; i++)
      {
      }
      label1.Text = counterComponent1.Stop().ToString() + " sec";
    }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 237. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |