Cronometru de înaltă performanță în Delphi

Pentru aplicațiile de bază de date desktop de rutină, adăugarea unei singure secunde la timpul de execuție al unei sarcini face rareori diferența pentru utilizatorii finali - dar când trebuie să procesați milioane de frunze de copac sau să generați miliarde de numere aleatorii unice, viteza de execuție devine mai importantă.

Eliminarea codului tău

În unele aplicații, metode de măsurare a timpului foarte precise și de mare precizie sunt importante și din fericire Delphi oferă un contor de înaltă performanță pentru a se califica în aceste momente.

Folosind RTL-uri Acum Funcţie

O opțiune folosește Acum funcţie. Acum, definit în SysUtils unitate, returnează data și ora actuală a sistemului.

Câteva linii de măsurare a codului au trecut timpul între „început” și „oprire” pentru un anumit proces:

Funcția Now returnează data și ora actuală a sistemului care sunt exacte până la 10 milisecunde (Windows NT și versiuni ulterioare) sau 55 milisecunde (Windows 98).

Pentru intervale foarte mici, precizia „Acum” nu este uneori suficientă.

instagram viewer

Utilizarea API-ului Windows GetTickCount

Pentru date și mai precise, utilizați butonul GetTickCountAPI-ul Windows funcţie. GetTickCount preia numărul de milisecunde care s-au scurs de la pornirea sistemului, dar funcția are doar precizia de 1 ms și este posibil să nu fie întotdeauna exact dacă computerul rămâne alimentat timp îndelungat timp.

Timpul scurs este stocat ca valoare DWORD (32 biți). Prin urmare, timpul se va încheia până la zero dacă Windows este rulat continuu timp de 49,7 zile.

GetTickCount se limitează, de asemenea, la precizia cronometrului sistemului (10/55 ms).

Codul tău de precizie de înaltă precizie

Dacă computerul dvs. acceptă un contor de performanță de înaltă rezoluție, utilizați butonul QueryPerformanceFrequency Funcția API pentru Windows pentru a exprima frecvența, în număr de pe secundă. Valoarea numărului depinde de procesor.

QueryPerformanceCounter funcția preia valoarea curentă a contorului de performanță de înaltă rezoluție. Apelând această funcție la începutul și la sfârșitul unei secțiuni de cod, o aplicație folosește contorul ca cronometru de înaltă rezoluție.

Precizia cronometrelor de înaltă rezoluție este de aproximativ câteva sute de nanosecunde. O nanosecundă este o unitate de timp reprezentând 0,000000001 secunde - sau o miliardime de secundă.

TStopWatch: implementarea Delphi a unui contor de înaltă rezoluție

Cu o încuviințare la convențiile de denumire .Net, un contor de genul TStopWatch oferă o soluție Delphi de înaltă rezoluție pentru măsurători precise ale timpului.

TStopWatch măsoară timpul scurs prin numărarea căpușelor de cronometru în mecanismul de cronometrare de bază.

  • IsHighResolution proprietatea indică dacă temporizatorul se bazează pe un contor de performanță de înaltă rezoluție.
  • start metoda începe să măsoare timpul scurs.
  • Stop metoda oprește măsurarea timpului scurs.
  • ElapsedMilliseconds proprietatea primește timpul total scurs în milisecunde.
  • Timpul scurs proprietatea primește timpul total scurs în căpușele de cronometru.

Iată un exemplu de utilizare: