This is my solution: i don't know where I found this source, but its quite good: and with comments ;-P #include #pragma comment(lib, "winmm.lib") DWORD GetCPUSpeed() { LARGE_INTEGER ulFreq, ulTicks, ulValue, ulStartCounter, ulEAX_EDX; // Query for high-resolution counter frequency (this is not the CPU frequency): if (QueryPerformanceFrequency(&ulFreq)) { // Query current value: QueryPerformanceCounter(&ulTicks); // Calculate end value (one second interval); this is (current + frequency) ulValue.QuadPart = ulTicks.QuadPart + ulFreq.QuadPart; // Read CPU time-stamp counter: __asm RDTSC // And save in ulEAX_EDX: __asm mov ulEAX_EDX.LowPart, EAX __asm mov ulEAX_EDX.HighPart, EDX // Store starting counter value: ulStartCounter.QuadPart = ulEAX_EDX.QuadPart; // Loop for one second (measured with the high-resolution counter): do { QueryPerformanceCounter(&ulTicks); } while (ulTicks.QuadPart <= ulValue.QuadPart); // Now again read CPU time-stamp counter: __asm RDTSC // And save: __asm mov ulEAX_EDX.LowPart, EAX __asm mov ulEAX_EDX.HighPart, EDX DWORD tmp = (DWORD) ((ulEAX_EDX.QuadPart - ulStartCounter.QuadPart) / 1000000); timediff = tmp/10000000.0*0.001; // Calculate number of cycles done in interval; 1000000 Hz = 1 MHz return tmp; } else { // No high-resolution counter present: return 0; } } Thanks for all information, =Sendel=