Mit
der nachfolgenden Funktion können Sie die Taktfrequenz
Ihres Prozessors ermitteln.
Als
Parameter wird die Meßzeit in ms angegeben. Je länger,
um so genauer das Ergebnis. Bei langsamen CPU's (75 MHz)
sollte der Wert nicht unter 500 ms liegen.
// GetProcessorSpeed()
//
// Ermittelt die Taktfrequenz der Intel® Pentium®
Prozessoren
// durch Auslesen des Time-Stamp Counters (rdtsc-Befehl).
// Der Time-Stamp Counter wird bei jedem Taktzyklus
inkrementiert.
// Der rdtsc-Befehl ist nur ab dem Pentium® Chip verfügbar.
// Der Zugriff auf den rdtsc-Befehl kann auf Kernmodus-
// Anwendungen (Ring 0-Schicht) beschränkt werden.
//
#if _MSC_VER <
1100
#define rdtsc __asm _emit 0x0f __asm _emit 0x31
#endif // _MSC_VER < 1100
DWORD
GetProcessorSpeed(DWORD dwTime)
{
DWORD dwTime1, dwTime2;
ULARGE_INTEGER ulInstruct1, ulInstruct2;
// Systemzeit in
ms abfragen
dwTime1
= timeGetTime(); // Erster Meßpunkt
__try
{
__asm
{
rdtsc
; Time-Stamp
Counter auslesen
mov
ulInstruct1.LowPart, eax
mov
ulInstruct1.HighPart, edx
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return 0;
}
// Meßzeit
Sleep(dwTime);
// Sleep arbeitet
nicht unter Win32s
// Systemzeit in
ms abfragen
dwTime2
= timeGetTime(); // Zweiter Meßpunkt
__try
{
__asm
{
rdtsc
; Time-Stamp
Counter auslesen
mov
ulInstruct2.LowPart, eax
mov
ulInstruct2.HighPart, edx
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return 0;
}
// Meßergebnisse
überprüfen
if
((dwTime1 >= dwTime2) || ((dwTime2-dwTime1) < (dwTime/2))
|| (ulInstruct1.QuadPart >= ulInstruct2.QuadPart))
return 0;
// Aus den
Differenzen von Taktzyklen und Meßzeit in ms
// die
Taktfrequenz in MHz berechnen
return
(DWORD)((ulInstruct2.QuadPart-ulInstruct1.QuadPart) / ((dwTime2-dwTime1)
* 1000));
}
[ cpuspeed.c ]
[ <<
Vorheriger ] [ Übersicht ]
[ Nächster
>> ]
|