#include // Ermittelt die Taktfrequenz des Pentium-Prozessors // durch Auslesen des Time-Stamp Counters (rdtsc-Befehl). // Der Time-Stamp Counter wird bei jedem Taktzyklus in- // krementiert. // Der rdtsc-Befehl ist nur ab dem Pentium 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; timeBeginPeriod(1); // Auflösung unter NT auf 1 ms setzen dwTime1 = timeGetTime(); Sleep(20); // Timer "einschwingen" // 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) { timeEndPeriod(1); return 0; } // Meßzeit Sleep(dwTime); // Sleep arbeitet nicht unter Win32s // Systemzeit in ms abfragen dwTime2 = timeGetTime(); // Zweiter Meßpunkt timeEndPeriod(1); __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)); }