Genaue Zeitmessung unter Windows

Für die exakte Zeitmessung mit Windows ruft man zunächst mit der Funktion QueryPerformanceFrequency() die Frequenz des Timers ab. Man erhält eine LARGE_INTEGER-Unions, die ein 64 Bit Integer, bzw. zwei 32 Bit Integers mit der Frequenz enthält.

#include <windows.h>
 
LARGE_INTEGER start, end, frequency;
 
if(!QueryPerformanceFrequency(&frequency))
{
  /* PerformanceCounter wird nicht unterstützt */
}

Auf dem Testrechner hier wird eine Frequenz von 2533370000 Signalen pro Sekunde zurückgegeben. Das bedeutet, dass ein Signal etwa alle 0,00000039 ms gezählt wird. Das bedeutet nicht, dass wir nun jedes Mal in so kurzer Zeit informiert werden, das ist die Auflösung der Zeit, in der dieser Computer die Zeit angibt.

Wenn wir also zwischen zwei Messpunkten 2533370000 Signale gezählt wurden, so ist eben eine Sekunde vergangen.

Die Funktion gibt einen Wert zurück. Ist diese Null (also false), so wird der PerformanceCounter nicht unterstützt. Das sollte aber nur bei sehr, sehr alten PCs vorkommen. Die Funktion selbst ist ab Windows2000 verfügbar.

Nun können wir die Zeit messen, die ein Vorgang benötigt:

QueryPerformanceCounter(&start);
 
/* Programmabschnitt, dessen Zeit gemessen werden soll */
 
QueryPerformanceCounter(&end);

Die benötigte Zeit lässt sich nun wie folgt in Sekunden berechnen:

double elapsed = (double)(end.QuadPart  - start.QuadPart) / (double)(frequency.QuadPart);