方法一:QueryPerformanceCounter和QueryPerformanceFrequency配合使用。DOS下使用需包含windows.h
QueryPerformanceCounter()这个函数返回高精确度性能计数器的值(读取了软件计数器当前的计数值),它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到。
QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.
QueryPerformanceFrequency() -基本介绍
类型:Win32API
原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬件支持的高精度计数器的频率。
返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。
VC的64位整数分别叫做__int64与unsigned __int64,其范围分别是[-2^63, 2^63)与[0,2^64),。应用如: typedef __int64 LONGLONG;
LARGE_INTEGER frequency,start,end;
::QueryPerformanceFrequency(&frequency); // 2604160,机器频率,2.6Mhz
::QueryPerformanceCounter(&start);
m_Dib.OSTU(pData); // 调用Dib类里的OSTU函数
::QueryPerformanceCounter(&end);
LONGLONG n64Time = (end.QuadPart - start.QuadPart) *1000 / frequency.QuadPart;
// 测试 执行大津法所用时间,精确到微秒
m_Dib.Draw(pdc,pData,CPoint(0,0),CSize(m_Dib.GetWidth(),m_Dib.GetHeight()));
CString str,str1;
str1 = "OSTU时间(ms): ";
str.Format("%d",n64Time);
str1 += str;
::AfxMessageBox(str1); // 输出大津法执行时间
利用这种方法测得的大津法执行时间为21.838毫秒,精确度在微秒级别。
方法二:使用_outp()和_inp()函数。没有掌握。。。。操作OS已经标识的硬件接口,最好用CreateFile,ReadFile和WriteFile来完成,用_inp这类的函数你自己要确保I/O地址是否正确,不同OS的I/O基址编码可能会不同

方法三:使用GetCycleCount(),
unsigned __int64 GetCycleCount(void)
{
_asm _emit 0x0f;
_asm _emit 0x31;
}
使用这个方法需要获得CPU主频,以下是获取CPU主频的程序
LONGLONG GetFrequency(DWORD dwSleepTime)//获取CPU主频
{
DWORD dwlow1 = 0, dwhigh1 = 0, dwlow2 = 0, dwhigh2 = 0;
LARGE_INTEGER fq, st, ed;
/*在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在
需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的技术
之差和时钟的频率,就可以计算出时间经历的精确时间。*/
::QueryPerformanceFrequency(&fq); //精确计时(返回硬件支持

本文介绍了在Windows环境下,通过QueryPerformanceCounter、_outp/_inp和GetCycleCount(RDTSC)三种方法获取程序执行时间,重点讲解了RDTSC指令的原理和优缺点。RDTSC能提供纳秒级的计时精度,适用于高精度计时需求,但存在数据抖动问题。此外,还给出了不同计时方法的简单示例。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



