Timer ad alte prestazioni in Delphi

Per le normali applicazioni di database desktop, l'aggiunta di un solo secondo al tempo di esecuzione di un'attività fa raramente la differenza per gli utenti finali, ma quando è necessario elaborare milioni di foglie di alberi o generare miliardi di numeri casuali univoci, la velocità di esecuzione diventa più importante.

Timeout del tuo codice

In alcune applicazioni, i metodi di misurazione del tempo molto precisi e di alta precisione sono importanti e fortunatamente Delphi fornisce un contatore ad alte prestazioni per qualificare questi tempi.

Utilizzando RTL Adesso Funzione

Un'opzione utilizza il Adesso funzione. Adesso, definito in SysUtils unità, restituisce la data e l'ora correnti del sistema.

Alcune righe di codice misurano il tempo trascorso tra "start" e "stop" di alcuni processi:

La funzione Now restituisce la data e l'ora correnti del sistema che sono accurate fino a 10 millisecondi (Windows NT e successivi) o 55 millisecondi (Windows 98).

Per intervalli molto piccoli la precisione di "Now" a volte non è sufficiente.

instagram viewer

Utilizzo dell'API di Windows GetTickCount

Per dati ancora più precisi, utilizzare il GetTickCountAPI di Windows funzione. GetTickCount recupera il numero di millisecondi trascorsi dall'avvio del sistema, ma ha solo la funzione la precisione di 1 ms e potrebbe non essere sempre precisa se il computer rimane acceso per lunghi periodi di tempo.

Il tempo trascorso viene memorizzato come valore DWORD (32 bit). Pertanto, il tempo passerà a zero se Windows viene eseguito ininterrottamente per 49,7 giorni.

GetTickCount è inoltre limitato alla precisione del timer di sistema (10/55 ms).

Timing ad alta precisione del codice

Se il PC supporta un contatore delle prestazioni ad alta risoluzione, utilizzare il QueryPerformanceFrequency Funzione API di Windows per esprimere la frequenza, in conteggi al secondo. Il valore del conteggio dipende dal processore.

Il QueryPerformanceCounter La funzione recupera il valore corrente del contatore delle prestazioni ad alta risoluzione. Chiamando questa funzione all'inizio e alla fine di una sezione di codice, un'applicazione utilizza il contatore come timer ad alta risoluzione.

La precisione dei timer ad alta risoluzione è di circa alcune centinaia di nanosecondi. Un nanosecondo è un'unità di tempo che rappresenta 0,000000001 secondi - o 1 miliardesimo di secondo.

TStopWatch: implementazione di Delphi di un contatore ad alta risoluzione

Con un cenno alle convenzioni di denominazione .Net, un contatore piace TStopWatch offre una soluzione Delphi ad alta risoluzione per misurazioni precise del tempo.

TStopWatch misura il tempo trascorso contando i tick del timer nel meccanismo del timer sottostante.

  • Il IsHighResolution La proprietà indica se il timer si basa su un contatore delle prestazioni ad alta risoluzione.
  • Il Inizio il metodo inizia a misurare il tempo trascorso.
  • Il Fermare il metodo interrompe la misurazione del tempo trascorso.
  • Il ElapsedMilliseconds la proprietà ottiene il tempo totale trascorso in millisecondi.
  • Il trascorso la proprietà ottiene il tempo totale trascorso in tick del timer.

Ecco un esempio di utilizzo: