如何取得CPU的主频
作者:ImMcss 欢迎转载,请以超链接形式保留原文地址。
先看一下什么是主频
主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度。CPU的工作频率(主频)包括两部分:外频与倍频,两者的乘积就是主频。倍频的全称为倍频系数。CPU的主频与外频之间存在着一个比值关系,这个比值就是倍频系数,简称倍频。倍频可以从1.5一直到23以至更高,以0.5为一个间隔单位。外频与倍频相乘就是主频,所以其中任何一项提高都可以使CPU的主频上升。由于主频并不直接代表运算速度,所以在一定情况下,很可能会出现主频较高的CPU实际运算速度较低的现象。因此主频仅仅是CPU性能表现的一个方面,而不代表CPU的整体性能 。
取得CPU主频的方法有两种:
一种是从注册表中直接读取主频的信息,另外一只就是自己测CPU的主频了。
废话少说,贴代码了。(以下代码在XP(SP2和Vista上测试通过))
第一种方法,从注册表读取代码
#include
"
stdafx.h
"
#include
<
windows.h
>
#include
<
iostream
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
using
namespace
std;
DWORD GetCpuClock()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
DWORD cpuClock = 0;
HKEY hKey;
LPCTSTR StrKey=(WCHAR *)_T("HARDWARE/DESCRIPTION/System/CentralProcessor/0");
if (ERROR_SUCCESS==RegOpenKeyEx(HKEY_LOCAL_MACHINE,StrKey,NULL,KEY_READ,&hKey))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
DWORD type = REG_DWORD;
DWORD val;
DWORD count = sizeof(val);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
LPCTSTR KeyValue=(WCHAR *)_T("~MHz");
if (ERROR_SUCCESS==RegQueryValueEx(hKey,KeyValue,0, &type, (LPBYTE)&val, &count) )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cpuClock = val;
}
RegCloseKey(hKey);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return cpuClock;
}
int
_tmain(
int
argc, _TCHAR
*
argv[])
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
DWORD clock = GetCpuClock();
return 0;
}
第二种方法,自己测CPU的主频
#include
"
stdafx.h
"
#include
<
windows.h
>
#include
<
iostream
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
using
namespace
std;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
DWORD GetCpuClock()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
LARGE_INTEGER c1;
QueryPerformanceCounter( &c1 );
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
LARGE_INTEGER c2;
QueryPerformanceCounter( &c2 );
unsigned __int64 start = __rdtsc();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
DWORD startTickCount = GetTickCount();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while( GetTickCount() - startTickCount < static_cast<DWORD>( 100 ) ) ...{}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
LARGE_INTEGER c3;
QueryPerformanceCounter( &c3 );
unsigned __int64 end = __rdtsc();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
LARGE_INTEGER freq;
QueryPerformanceFrequency( &freq );
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
unsigned __int64 e = ( c3.QuadPart - c2.QuadPart ) - ( c2.QuadPart - c1.QuadPart );
double elapsed = static_cast<double>( e ) / static_cast<double>( freq.QuadPart );
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return (static_cast<double>( ( end - start ) / elapsed ) )/1000000;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
_tmain(
int
argc, _TCHAR
*
argv[])
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
DWORD clock = GetCpuClock();
return 0;
}