Timer wysokiej wydajności w Delphi

W przypadku rutynowych aplikacji bazodanowych dodawanie jednej sekundy do czasu wykonania zadania rzadko stanowi różnicę dla użytkowników końcowych - ale gdy trzeba przetworzyć miliony liści drzew lub wygenerować miliardy unikatowych liczb losowych, szybkość wykonywania staje się ważniejsza.

Przekroczono limit czasu Twojego kodu

W niektórych aplikacjach bardzo dokładne i bardzo precyzyjne metody pomiaru czasu są ważne i na szczęście Delfy zapewnia wysoce wydajny licznik, aby zakwalifikować się do tych czasów.

Korzystanie z RTL Teraz Funkcjonować

Jedna opcja wykorzystuje Teraz funkcjonować. Teraz, zdefiniowane w SysUtils jednostka zwraca bieżącą datę i godzinę systemową.

Kilka linii kodu mierzy czas, który upłynął między „rozpoczęciem” i „zatrzymaniem” jakiegoś procesu:

Funkcja Now zwraca bieżącą datę i godzinę systemową z dokładnością do 10 milisekund (Windows NT i nowszy) lub 55 milisekund (Windows 98).

W bardzo małych odstępach czasami precyzja „Teraz” nie wystarcza.

Korzystanie z interfejsu API Windows GetTickCount

instagram viewer

Aby uzyskać jeszcze bardziej precyzyjne dane, użyj GetTickCountWindows API funkcjonować. GetTickCount pobiera liczbę milisekund, które upłynęły od uruchomienia systemu, ale funkcja ma tylko dokładność 1 ms i nie zawsze może być dokładna, jeśli komputer pozostaje włączony przez długi czas czas.

Upływający czas jest zapisywany jako wartość DWORD (32-bit). Dlatego czas będzie się zmniejszał do zera, jeśli system Windows będzie działał nieprzerwanie przez 49,7 dni.

GetTickCount jest również ograniczona do dokładności timera systemowego (10/55 ms).

Wysoka precyzja wygasza Twój kod

Jeśli twój komputer obsługuje licznik wydajności wysokiej rozdzielczości, użyj QueryPerformanceFrequency Funkcja Windows API do wyrażania częstotliwości, w liczbie na sekundę. Wartość liczby zależy od procesora.

The QueryPerformanceCounter funkcja pobiera bieżącą wartość licznika wydajności o wysokiej rozdzielczości. Wywołując tę ​​funkcję na początku i na końcu części kodu, aplikacja używa licznika jako timera o wysokiej rozdzielczości.

Dokładność timerów o wysokiej rozdzielczości wynosi około kilkuset nanosekund. Nanosekunda to jednostka czasu reprezentująca 0,000000001 sekundy - lub 1 miliardową sekundę.

TStopWatch: Implementacja Delphi licznika o wysokiej rozdzielczości

Z ukłonem do konwencji nazewnictwa .Net, licznik podobny TStopWatch oferuje rozwiązanie Delphi o wysokiej rozdzielczości do precyzyjnych pomiarów czasu.

TStopWatch mierzy upływ czasu, zliczając tyknięcia zegara w leżącym u jego podstaw mechanizmie zegara.

  • The IsHighResolution właściwość wskazuje, czy licznik czasu jest oparty na liczniku wydajności o wysokiej rozdzielczości.
  • The Początek metoda rozpoczyna pomiar upływającego czasu.
  • The Zatrzymać metoda przestaje mierzyć upływ czasu.
  • The ElapsedMilliseconds Właściwość pobiera całkowity czas, który upłynął w milisekundach.
  • The Upłynęło właściwość pobiera całkowity czas, który upłynął w tyknięciu zegara.

Oto przykład użycia: