C++ Builder Snippets  


Zeitmessungen mit Auflösung < 0,1 ms:
 
Die meisten Zeitmessungen in BCB-Programmen können durch die Bildung der Differenz aus Systemzeiten, die zu Beginn und Ende der Messung ermittelt werden vollkommen ausreichend.

Es allerdings auch Anwendungen, in den die Genauigkeit des Systemzeit (ca. 15-30 ms) nicht mehr ausreichend ist. Dies kann z.B. bei der Protokollierung schneller Abläufe oder bei der Bestimmung von Ausführungszeiten der Funktionen der Fall sein.

In solchen Fällen kann die Zeitmessung mit Hilfe des hochauflösenden Peformance-Zählers (high resolution performance counter) realisiert werden. Der Performance Counter ist in der Hardware des Rechners implementiert, seine Frequenz liegt zw. 0,1 und > 3,1 MHz (bei P III). Laut Windows SDK soll es auch Rechner geben, die dieses Feature nicht unterstützen, diese sind aber heutzutage wohl nicht mehr anzutreffen - zumindest nicht unter Win32-tauglichen PCs.

Der aktuelle Zählerstand des Performance Counters wird mit Hilfe der API-Funktion QueryPerformanceCounter() bestimmt. Funktion QueryPerformanceFrequency() liefert die Zählerfrequenz:

//--------- Initialisierung der Zeitmessung ------------------
// Frequenz des hochauflösenden Performance Counters bestimmen:
LARGE_INTEGER ilPerfFreq;
QueryPerformanceFrequency(&ilPerfFreq);
// Zählerstand des Performance Counters auslesen:
LARGE_INTEGER ilStartTime;
QueryPerformanceCounter(&ilStartTime);
//-------------------------------------------------------------

// Aufruf der Funktion, deren Ausführungsdauer 
// bestimmt werden soll:
foo();

//--------- Berechnung der Zeitdifferenz ----------------------
// Zählerstand des Performance Counters auslesen:
LARGE_INTEGER ilCurrentTime;
QueryPerformanceCounter(&ilCurrentTime);
// Zeitdifferenz in Sekunden berechnen:
if(ilCurrentTime.QuadPart && ilPerfFreq.QuadPart &&ilStartTime.QuadPart)
{
  double dlTimeElapsed = (long double)(ilCurrentTime.QuadPart -
    ilStartTime.QuadPart)/((long double)ilPerfFreq.QuadPart);
  Label1->Caption = "Ausführungsdauer: " + FormatFloat("0.0000",
    dlTimeElapsed) + " s";
}
else Label1->Caption = EmptyStr;
//-------------------------------------------------------------

  Download BCB6
Projekt-Quellcode
Download
Demo-Exe

© '99-2003 by S. Kreutzmann