#include "StdAfx.h" #include ".\Chronometer.h" #include #using double TChronometer::Time1 = 0.0; double TChronometer::Time2 = 0.0; double TChronometer::CPUFrequence = 0.0; bool TChronometer::Initialized = false; TChronometer::TChronometer(void) { } TChronometer::~TChronometer(void) { } double TChronometer::RDTSC() { unsigned long a; unsigned long b; double x; __asm __emit 0x0F; __asm __emit 0x31; __asm { // db $0F , $31 mov [a] , eax mov [b] , edx }; x = b; x *= 4294967296; x += a; return x; } void TChronometer::Start() { TChronometer::Time1 = TChronometer::RDTSC(); } double TChronometer::Stop() { TChronometer::Time2 = TChronometer::RDTSC(); return 1000.0 * (TChronometer::Time2 - TChronometer::Time1) / TChronometer::CPUFrequence; } int TChronometer::Initialize() { TChronometer::Initialized = false; unsigned __int64 Fwin; unsigned __int64 Twin_avant, Twin_apres; double Tcpu_avant; double Tcpu_apres; double Fcpu; // Lit la frequence du chronometre Windows if (!QueryPerformanceFrequency((LARGE_INTEGER*)&Fwin)) return 0; // Avant Tcpu_avant = RDTSC(); QueryPerformanceCounter((LARGE_INTEGER*)&Twin_avant); // Pause de 500 ms Sleep(500); // Apres Tcpu_apres = RDTSC(); QueryPerformanceCounter((LARGE_INTEGER*)&Twin_apres); // Calcule la fréquence en MHz Fcpu = (Tcpu_apres - Tcpu_avant); Fcpu *= Fwin; Fcpu /= (double)(Twin_apres - Twin_avant); CPUFrequence = Fcpu; TChronometer::Initialized = true; return 1; }