目前,存在着各种计时函数,它们的计时方式大都是下面这样的:
1.计时函数汇总
方法1,time()包含在< time.h >中,用于获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个long int类型,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数.
void test1()
{
time_t start,stop;
start = time(NULL);
Do_Something();
stop = time(NULL);
printf("Use Time:%ld\n",(stop-start));
}
方法2,clock()函数,包含在< time.h >中,它返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)
常量CLOCKS_PER_SEC用来表示一秒钟会有多少个时钟计时单元,或者理解为机器时钟每秒的打点数
void test2()
{
double result;
clock_t start,end;
start = clock();
Do_Something();
end = clock();
result = (double)(end - start);
printf("Use Time:%f\n",result/CLOCKS_PER_SEC);
}
方法3,timeGetTime()函数以毫秒计的系统时间。该时间为从系统开启算起所经过的时间,是windows API,所以要包含< Windows.h >
void test3()
{
DWORD t1,t2;
t1 = timeGetTime();
Do_Something();
t2 = timeGetTime();
printf("Use Time:%f\n",(t2-t1)*1.0/1000);
}
方法4,QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的每秒打点数的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒的打点数.
void test4()
{
LARGE_INTEGER t1,t2,tc;
QueryPerformanceFrequency(&tc);
QueryPerformanceCounter(&t1);
Do_Something();
QueryPerformanceCounter(&t2);
printf("Use Time:%f\n", \
(t2.QuadPart - t1.QuadPart)*1.0/tc.QuadPart);
}
方法5,GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD,包含在头文件< winbase.h >内。
void test5()
{
DWORD t1,t2;
t1 = GetTickCount();
Do_Something();
t2 = GetTickCount();
printf("Use Time:%f\n",(t2-t1)*1.0/1000);
}
方法6,使用Boost库中的timer
timer类可以测量时间的流逝,是小型计时器,提供毫秒级别的计时精度。需要包含头文件< boost/timer.hpp >和命名空间boost
#include<boost/timer.hpp>
#include<iosream>
using namespace std;
using namespace boost;
void main()
{
timer time;
Do_Something();
cout<<"now:"<<time.elapsed()<<"s"<<endl;
}
2.测定函数的运行时间
根据类和对象的特点,如果在函数内部创建过对象,那么在函数执行结束的时候,就会自动调用类的析构函数,那么我们就可以按照这个思路来设计一个仅在DEBUG版本下有效的测定函数运行时间的方法:
思路:设计一个Time类,Time类的构造函数里面记录调用构造函数的当前时间,Time的析构函数里面记录调用析构函数的当前时间以及调用构造函数的时间和调用析构函数时间的时间差。
我们在函数开头的时候定义一个Time类的对象,在函数结尾的时候,就会自动调用Time类的析构函数,这样我们就可以得到这个函数的执行时间。
伪代码:
#ifdef _DEBUG //Debug版本下会定义_DEBUG这个宏
#define GET_TIME Time t
#else GET_TIME
#endif
class Time
{
public:
Time()
{
start_time;
}
~Time()
{
end_time;
end_time - start_time;
}
}
//使用实例
void func()
{
GET_TIME;
//code
}
PS:这是作者的脑力劳动成果,转载请注明出处。