获取程序运行时间

1、使用机器指令RDTSC(Read TimeStamp Counter)【纳秒级的计时精度】

首先使用该指令获取CPU主频:

//获取CPU主频,单位:MHz
long GetCPUFreq() 
{
	int start,over;
	_asm 
	{
		RDTSC
			mov start,eax
	}
	Sleep(50);
	_asm 
	{
		RDTSC
			mov over,eax
	}
	return (over-start)/50000;
}
再使用该指令获取当前时间戳:
//获取当前时间戳
__int64 GetTime()
{
	DWORD dwLow;
	DWORD dwHigh;
	__asm       
	{
		RDTSC
			mov dwHigh, edx
			mov dwLow, eax
	}
	__int64 time = dwHigh;
	time = time << 32;
	time += dwLow;
	return time;
}
最后获取程序的运行时间:
void main()
{
	long CPU_FREQ = GetCPUFreq();	//CPU主频:单位MHz
	__int64 begin = GetTime();
	Sleep(1000);
	__int64 end = GetTime();
	cout<<"运行时间:"<<(end-begin)/(CPU_FREQ*1000)<<" ms"<<endl;	//运行时间:单位ms
}
测试:


Ref:vc 如何获取电脑型号SN等硬件信息-CSDN论坛-CSDN.NET-中国最大的IT技术社区


2、使用Window API函数QueryPerformanceFrequency和QueryPerformanceCounter

QueryPerformanceFrequency函数的描述:

//函数描述:
//		函数QueryPerformanceFrequency可用来获得计算机高精度性能计数器(如果存在)的频率,在PC上可能多获得的就是CPU的计算频率。这一值,在系统运行后就不会再改变。
//参数列表:
//		lpFrequency [out],输出参数,是一个LARGE_INTEGER的变量指针,用来存放返回的频率数值,单位为每秒。如果安装的硬件不支持高精度计数器,这一值可以是。
//返回值:
//		如果安装的硬件有支持高精度计数器,返回值不为;如果函数失败,返回结果为,错误码可通过GetLastError获得。
//函数信息:
//		最小支持:Windows 2000 Professional、Windows 2000 Server 
//		所在头文件:Winbase.h (include Windows.h) 
//		所在库文件:Kernel32.lib 
//		所在DLL:Kernel32.dll 
BOOL WINAPI QueryPerformanceFrequency(__out  LARGE_INTEGER *lpFrequency);

QueryPerformanceFrequency用于获取CPU的主频,QueryPerformanceCounter用于计算程序运行时间差,测试代码如下:

#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
	//首先获取CPU频率
	double dqFreq;                /*计时器频率*/
	LARGE_INTEGER f;            /*计时器频率*/
	QueryPerformanceFrequency(&f);
	dqFreq=(double)f.QuadPart;
	cout<<"CPU主频:"<<dqFreq<<"kHz"<<endl; //单位为秒,精度为000/(cpu主频)微秒

	//再获取程序运行时间
	_LARGE_INTEGER time_start;    /*开始时间*/
	_LARGE_INTEGER time_over;        /*结束时间*/
	QueryPerformanceCounter(&time_start);
	Sleep(1000);/*循环耗时*/
	QueryPerformanceCounter(&time_over); 

	cout<<"运行时间:"<<((time_over.QuadPart-time_start.QuadPart)/dqFreq)<<"second"<<endl;//单位为秒,精度为000/(cpu主频)微秒
}
测试:


Ref1:QueryPerformanceFrequencyfunction (Windows)

Ref2:使用QueryPerformanceFrequency计算程序执行时间 - 开源中国社区


3、使用GetTickCount()函数

GetTickCount函数返回从系统运行到现在所经历的时间(类型为DWORD),单位为ms。因为DWORD表示范围的限制,所以使用此种方法存在限制,即系统的运行时间的ms表示不能超出DWORD的表示范围。

#include<iostream>
#include<windows.h>
using namespace std;
void main()
{
	DWORD start_time=GetTickCount();
	{
		//do something
		Sleep(1000);
	}
	DWORD end_time=GetTickCount();
	cout<<"运行时间:"<<(end_time-start_time)<<" ms"<<endl;	//运行时间:单位ms
}
测试:



4、使用clock()函数

clock_t、clock()定义于time.h中,clock()函数返回从程序运行时刻开始的时钟周期数,类型为long。CLOCKS_PER_SEC定义了每秒钟包含多少了时钟单元数,因为计算ms,所以*1000。由上面分析可知,用clock()函数计算运行时间,表示范围一定大于GetTickCount()函数,所以,建议使用clock()函数。

#include<iostream>
#include<windows.h>
#include<time.h>
using namespace std;
void main()
{
	clock_t start_time=clock();
	{
		//do something
		Sleep(1000);
	}
	clock_t end_time=clock();
	cout<<"运行时间:"<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC*1000<<" ms"<<endl;	//运行时间:单位ms
}
测试:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值