怎样获得CPU频率?

dancingelephant 2003-11-11 04:20:07
怎样获得CPU频率?
...全文
97 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
pheavecn 2003-11-26
  • 打赏
  • 举报
回复
楼上的用Sleep函数,延时不准。
我一般用rdtsc和QueryPerformanceCounter结合使用。
ccrun.com 2003-11-19
  • 打赏
  • 举报
回复
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);
}
pheavecn 2003-11-19
  • 打赏
  • 举报
回复
rdtsc需要用db 0xf;db 0x31代替。
编译器不支持。
zhangxxlyl 2003-11-11
  • 打赏
  • 举报
回复
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;
}

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧