Meet nauwkeurig de verstreken tijd met Delphi Performance Counter

Voor routinematige desktopdatabasetoepassingen maakt het toevoegen van een seconde aan de uitvoeringstijd van een taak zelden een 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 biedt Delphi een hoogwaardige teller om deze tijden te kwalificeren.

RTL's gebruiken Nu Functie

Eén 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

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

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.