📄 cpu 测速(mhz)和高精度延时(微秒级).txt
字号:
一.高精度延时, 是 CPU 测速的基础
void DelayUs(__int64 Us)
{
LARGE_INTEGER CurrTicks, TicksCount;
QueryPerformanceFrequency(&TicksCount);
QueryPerformanceCounter(&CurrTicks);
TicksCount.QuadPart = TicksCount.QuadPart * Us / 1000000i64;
TicksCount.QuadPart += CurrTicks.QuadPart;
while(CurrTicks.QuadPart<TicksCount.QuadPart)
QueryPerformanceCounter(&CurrTicks);
}
二.测速程序
int CPU_Frequency(void) //MHz
{
LARGE_INTEGER CurrTicks, TicksCount;
__int64 iStartCounter, iStopCounter;
DWORD dwOldProcessP = GetPriorityClass(GetCurrentProcess());
DWORD dwOldThreadP = GetThreadPriority(GetCurrentThread());
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
QueryPerformanceFrequency(&TicksCount);
QueryPerformanceCounter(&CurrTicks);
TicksCount.QuadPart /= 16;
TicksCount.QuadPart += CurrTicks.QuadPart;
asm rdtsc
asm mov DWORD PTR iStartCounter, EAX
asm mov DWORD PTR (iStartCounter+4), EDX
while(CurrTicks.QuadPart<TicksCount.QuadPart)
QueryPerformanceCounter(&CurrTicks);
asm rdtsc
asm mov DWORD PTR iStopCounter, EAX
asm mov DWORD PTR (iStopCounter + 4), EDX
SetThreadPriority(GetCurrentThread(), dwOldThreadP);
SetPriorityClass(GetCurrentProcess(), dwOldProcessP);
return (int)((iStopCounter-iStartCounter)/62500);
}
前面是用 API 函数进行延时, 如果知道了 CPU 的工作频率, 利用循环, 也可以得到高精度的延时
int _CPU_FREQ = 0; //定义一个全局变量保存 CPU 频率 (MHz)
void CpuDelayUs(__int64 Us) //利用循环和 CPU 的频率延时, 参数: 微秒
{
__int64 iCounter, iStopCounter;
asm rdtsc
asm mov DWORD PTR iCounter, EAX
asm mov DWORD PTR (iCounter+4), EDX
iStopCounter = iCounter + Us*_CPU_FREQ;
while(iStopCounter-iCounter>0)
{
asm rdtsc
asm mov DWORD PTR iCounter, EAX
asm mov DWORD PTR (iCounter+4), EDX
}
}
void TestDelay(void)
{
_CPU_FREQ = CPU_Frequency(); //利用 CPU 频率初始化定时
CpuDelayUs(1000000); //延时 1 秒钟
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -