//warning C4035: 'RDTSC' : no return value
#pragma
warning
(
disable
:4035)
#include
<Windows.h>
//RDTSC-Read Time-Stamp Counter
//
自开机以来
CPU
经历的时钟周期数
unsigned
__int64
RDTSC
()
{
__asm
_emit
0x0F;
__asm
_emit
0x31;
}
//CPU
的频率
double
CpuFrequency
()
{
//On a multiprocessor machine, it should not matter which processor is called.
//However, you can get different results on different processors due to bugs in
//the BIOS or the HAL. To specify processor affinity for a thread, use the SetThreadAffinityMask function.
HANDLE
hThread
=
GetCurrentThread
();
SetThreadAffinityMask
(
hThread
,0x1);
//
主板上高精度定时器的晶振频率
//
这个定时器应该就是一片
8253
或者
8254
//
在
intel ich7
中集成了
8254
LARGE_INTEGER
lFrequency
;
QueryPerformanceFrequency
(&
lFrequency
);
//printf("高精度定时器的晶振频率:%1.0fHz.\n",(double)lFrequency.QuadPart);
//
这个定时器每经过一个时钟周期,其计数器会
+1
LARGE_INTEGER
lPerformanceCount_Start
;
QueryPerformanceCounter
(&
lPerformanceCount_Start
);
//RDTSC
指令
:
获取
CPU
经历的时钟周期数
__int64
_i64StartCpuCounter
=
RDTSC
();
//
延时长一点
,
误差会小一点
//int nTemp=100000;
//while (--nTemp);
Sleep
(200);
LARGE_INTEGER
lPerformanceCount_End
;
QueryPerformanceCounter
(&
lPerformanceCount_End
);
__int64
_i64EndCpuCounter
=
RDTSC
();
//f=1/T => f=
计数次数
/(
计数次数
*T)
//
这里的
“
计数次数
*T”
就是时间差
double
fTime
=((
double
)
lPerformanceCount_End
.
QuadPart
-(
double
)
lPerformanceCount_Start
.
QuadPart
)
/(
double
)
lFrequency
.
QuadPart
;
return
(
_i64EndCpuCounter
-
_i64StartCpuCounter
)/
fTime
;
}
int
main
(
int
argc
,
char
*
argv
[])
{
printf
(
"CPU
频率为
:%1.6fMHz.\n"
,
CpuFrequency
()/1000000.0);
return
0;
}