VC获取程序执行时间

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一: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);  //精确计时(返回硬件支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值