怎样获得CPU频率?
怎样获得CPU频率? 问题点数:20、回复次数:4Top
1 楼zhangxxlyl()回复于 2003-11-11 17:00:04 得分 10
int __fastcall Frequence_MHz()
{
LARGE_INTEGER ulFreq, ulTicks, ulValue, ulResult;
__int64 ulEAX_EDX, ulStartCounter;
DWORD PriorityClass, Priority;
PriorityClass = GetPriorityClass(GetCurrentProcess());
Priority = GetThreadPriority(GetCurrentThread());
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
// it is number of ticks per seconds
QueryPerformanceFrequency(&ulFreq);
// current valueofthe performance counter
QueryPerformanceCounter(&ulTicks);
// calculate one second interval
ulValue.QuadPart = ulTicks.QuadPart + ulFreq.QuadPart;
// read time stamp counter
// this asm instruction load the highorder 32 bit of the register into EDX
// and the lower order 32 bits into EAX
_asm {
rdtsc
mov DWORD PTR ulEAX_EDX, EAX
mov DWORD PTR (ulEAX_EDX + 4), EDX
}
// start no of ticks
ulStartCounter = ulEAX_EDX;
// loop for 1 second
do {
QueryPerformanceCounter(&ulTicks);
} while (ulTicks.QuadPart <= ulValue.QuadPart);
// get the actual no of ticks
_asm {
rdtsc
mov DWORD PTR ulEAX_EDX, EAX
mov DWORD PTR (ulEAX_EDX + 4), EDX
}
// calculate result
ulResult.QuadPart = ulEAX_EDX - ulStartCounter;
SetThreadPriority(GetCurrentThread(), Priority);
SetPriorityClass(GetCurrentProcess(), PriorityClass);
return (int)ulResult.QuadPart / 1000000;
}
Top
2 楼pheavecn(C超)回复于 2003-11-19 11:45:43 得分 2
rdtsc需要用db 0xf;db 0x31代替。
编译器不支持。Top
3 楼ccrun(老妖)(www.ccrun.com)回复于 2003-11-19 12:22:18 得分 6
int GetCpuSpeed()
{
int PriorityClass, Priority;
HANDLE hThread,hProcess;
hThread=GetCurrentThread();
hProcess=GetCurrentProcess();
PriorityClass = GetPriorityClass(hProcess);
Priority = GetThreadPriority(hThread);
SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(hThread,THREAD_PRIORITY_TIME_CRITICAL);
long lEAXValue,lEDXValue;
SleepEx(50,false);
_asm
{
xor eax,eax
rdtsc
mov lEAXValue,eax
mov lEDXValue,edx
}
if(SleepEx(500,false)==0)
{
_asm
{
xor eax,eax
rdtsc
sub eax,lEAXValue
sbb edx,lEDXValue
mov lEAXValue, eax
mov lEDXValue, edx
}
}
SetThreadPriority(hThread, Priority);
SetPriorityClass(hProcess, PriorityClass);
return lEAXValue/(1000.0*500);
}Top
4 楼pheavecn(C超)回复于 2003-11-26 09:49:12 得分 2
楼上的用Sleep函数,延时不准。
我一般用rdtsc和QueryPerformanceCounter结合使用。Top





