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
}
测试:
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主频)微秒
}
测试:
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
}
测试: