博客日历
| 2026年03月 | ||||||
| 一 | 二 | 三 | 四 | 五 | 六 | 七 |
| 23 | 24 | 25 | 26 | 27 | 28 | 1 |
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
存档
2025年03月 11月 2024年
03月 04月 05月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
RDTSC指令实现微秒级计时器
//!微秒级别的计时器
//ExactTimer.h
#pragma once
#include <math.h>
BOOL ReadDwordKey(IN HKEY hRootKey,IN LPCTSTR lpSubKey,
IN LPCTSTR lpKey,OUT DWORD& dwValue){
HKEY hk;
if (ERROR_SUCCESS!=RegOpenKey(hRootKey,lpSubKey,&hk))
return FALSE;
DWORD dwType=REG_DWORD,dwLength=sizeof(DWORD);
if (ERROR_SUCCESS!=RegQueryValueEx(hk,lpKey,NULL,&dwType,(LPBYTE)&dwValue,&dwLength))
return FALSE;
RegCloseKey(hk);
RegCloseKey(hk);
if (dwType!=REG_DWORD)
return FALSE;
return TRUE;
}
class CExactTimer
{
public:
/**
* 构造函数:将获取CPU的主频,精确到MHz
*/
CExactTimer(){}
~CExactTimer(void){}
/**
* 获取流逝的时间,us
*/
double GetTimeSpanMicrosecond(){
DWORD dwCpuFrequency=0;
if (!ReadDwordKey(HKEY_LOCAL_MACHINE,_T("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"),_T("~MHz"),dwCpuFrequency))
return -1;
return (_EndTime-_StartTime)/(dwCpuFrequency*1.0);
}
/**
* 停止计时
*/
void Stop(){
_EndTime=GetCycleCount();
}
/**
* 开始计时
*/
void Start(){
_StartTime=GetCycleCount();
}
private:
unsigned __int64 _StartTime;
unsigned __int64 _EndTime;
double _nFrequencyMHz;
inline unsigned __int64 GetCycleCount(){
//RDTSC-Read Time-Stamp Counter
//自开机以来CPU经历的时钟周期数
__asm
{
_emit 0x0F;
_emit 0x31;
}
}
};
使用方法:
CExactTimer TimeSpan;
TimeSpan.Start();
int i=100000;
while(--i);
TimeSpan.Stop();
TRACE("%1.6fus\n",TimeSpan.GetTimeSpanMicrosecond());
上一篇: 农业部张喜武,韩国前总统卢武铉
下一篇: Primitive: Cacls.exe组件未添加导致部分软件无法在XP Embedded上安装
分类:Win32/C++ 查看次数:8197 发布时间:2009/5/24 23:36:48