Hoogwaardige timer in Delphi

Voor routinematige desktopdatabasetoepassingen maakt het toevoegen van een seconde aan de uitvoeringstijd van een taak zelden verschil voor eindgebruikers - maar wanneer u miljoenen boombladeren moet verwerken of miljarden unieke willekeurige getallen moet genereren, wordt de snelheid van uitvoering belangrijker.

Time-out van uw code

In sommige toepassingen zijn zeer nauwkeurige, zeer nauwkeurige tijdmeetmethoden belangrijk en gelukkig Delphi biedt een hoogwaardige teller om deze tijden te kwalificeren.

RTL's gebruiken Nu Functie

Een optie gebruikt de Nu functie. Nu, gedefinieerd in de SysUtils eenheid, geeft de huidige systeemdatum en -tijd terug.

Een paar regels code meten de verstreken tijd tussen het "starten" en "stoppen" van een bepaald proces:

De functie Nu retourneert de huidige systeemdatum en -tijd die tot 10 milliseconden (Windows NT en hoger) of 55 milliseconden (Windows 98) nauwkeurig is.

Voor zeer korte intervallen is de precisie van "Nu" soms niet genoeg.

Met behulp van Windows API GetTickCount

instagram viewer

Voor nog preciezere gegevens gebruikt u de GetTickCountWindows API functie. GetTickCount haalt het aantal milliseconden op dat is verstreken sinds het systeem is gestart, maar de functie heeft dat alleen de nauwkeurigheid van 1 ms en is mogelijk niet altijd nauwkeurig als de computer lange tijd ingeschakeld blijft tijd.

De verstreken tijd wordt opgeslagen als een DWORD-waarde (32-bits). Daarom zal de tijd rondlopen tot nul als Windows gedurende 49,7 dagen continu wordt uitgevoerd.

GetTickCount is ook beperkt tot de nauwkeurigheid van de systeemtimer (10/55 ms).

Hoge precisie Timing van uw code

Als uw pc een teller met hoge resolutie ondersteunt, gebruik dan de QueryPerformanceFrequency Windows API-functie om de frequentie uit te drukken, in tellingen per seconde. De waarde van de telling is afhankelijk van de processor.

De QueryPerformanceCounter functie haalt de huidige waarde van de prestatieteller met hoge resolutie op. Door deze functie aan het begin en einde van een codedeel aan te roepen, gebruikt een toepassing de teller als een timer met hoge resolutie.

De nauwkeurigheid van timers met hoge resolutie is ongeveer een paar honderd nanoseconden. Een nanoseconde is een tijdseenheid die 0,000000001 seconden vertegenwoordigt - of 1 miljardste van een seconde.

TStopWatch: Delphi Implementatie van een teller met hoge resolutie

Met een knipoog naar .Net-naamgevingsconventies, een teller zoals TStopWatch biedt een Delphi-oplossing met hoge resolutie voor nauwkeurige tijdmetingen.

TStopWatch meet de verstreken tijd door timertikken in het onderliggende timermechanisme te tellen.

  • De IsHighResolution eigenschap geeft aan of de timer is gebaseerd op een prestatieteller met hoge resolutie.
  • De Begin methode begint met het meten van de verstreken tijd.
  • De Hou op methode stopt met meten verstreken tijd.
  • De Verstreken Milliseconden eigenschap krijgt de totale verstreken tijd in milliseconden.
  • De Verstreken eigenschap krijgt de totale verstreken tijd in timertikken.

Hier is een voorbeeld van gebruik:

instagram story viewer