测试函数:
void test()
{
long i; //long类型比int类型表示范围更大
for (i = 0;i < 1600000000;i++)
{
long a = 0;
a = a + 1;
}
}
在标准C/C++中,最小的计时单位是1毫秒。
第一种方式:
time/difftime
函数原名:time
函数原型:time_t time(time_t *timer) //time_t 实际上就是长整 型long int
函数功能:得到日历时间
函数返回:返回字符串格式
函数名称: difftime
函数原型: double difftime(time_t time2, time_t time1)
函数功能: 得到两次机器时间差,单位为秒
函数返回: 时间差,单位为秒
参数说明: time1-机器时间一,time2-机器时间二.该参数应使用time函数获得
所属文件:
void test1()
{
time_t start, stop;
start = time(NULL); //time(NULL);//获取系统时间,单位为秒
test();
stop = time(NULL);
printf("time is :%f\n",difftime(stop , start));
}
定义一个time_t变量,让后把变量的地址传给它。
time();这个函数其实保存的是一个历史时间,函数会返回自1970年1月1日0点走过的秒数,同时把这个返回值保存在你传进来的那个time_t*指向的变量里面。
如果你传进来NULL的话,就不保存。所以需要用NULL把这个历史时间清空一下,time()就会自动保存当前时间了。你可以简单的理解为NULL就是给time()初始化。
第二种:
QueryPerformanceFrequency()
类型:Win32API
原型:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);//Query (询问)Performance(完成) Frequency(频率)
作用:返回硬件支持的高精度计数器的频率。
返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。
函数的原形是:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
QueryPerformanceFrequency
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
需包含windows.h头文件。
原理:在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。
void test2()
{
LARGE_INTEGER T1, T2, Tc;
QueryPerformanceFrequency(&Tc);
QueryPerformanceCounter(&T1);
test();
QueryPerformanceCounter(&T2);
//打印LONGLONG类型,使用llu%
printf("time: %llu s\n", ((T2.QuadPart - T1.QuadPart)/(Tc.QuadPart)) );
}
数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
typeef union _ LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
第三种:
timeGetTime
函数以 毫秒 计的系统时间。该时间为从系统开启算起所经过的时间。
在SDK中,可以用 DWORD timeGetTime(VOID)函数获取系统时间,其返回值是毫秒单位的。可以用其实现延时功能的函数。
注意timeGetTime函数是一个双字。这个值在0到2^32之间。大约49.71天。
**头文件:**Mmsystem.h或Windows.h
文件头部添加: #pragma comment( lib,”winmm.lib” )
void test3()
{
DWORD t1, t2;
t1 = timeGetTime();
test();
t2 = timeGetTime();
printf("time is %u s\n",(t2 - t1)/1000);
}
第四种
GetTickCount:
GetTickCount是一种函数。GetTickCount返回(retrieve)从操作系统启动所经过(elapsed)的毫秒数,它的返回值是DWORD。
它返回从操作系统启动到当前所经过的毫秒数,常常用来判断某个方法执行的时间,其函数原型是DWORD GetTickCount(void),返回值以32位的双字类型DWORD存储,因此可以存储的最大值是(2^32-1) ms约为49.71天,因此若系统运行时间超过49.71天时,这个数就会归0。
MSDN中也明确的提到了:”Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days.”。因此,如果是编写服务器端程序,此处一定要万分注意,避免引起意外的状况(如需避免此种情况可使用Ctime类或者是系统API的SYSTEMTIME进行判断)。
头文件: Windows.h
void test4()
{
DWORD t1, t2;
t1 = GetTickCount();
test();
t2 = GetTickCount();
printf("time is %u s\n", (t2 - t1)/1000 );
}
第五种:
clock()
clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。
clock_t clock(void) ;
简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从”开启这个程序进程”到”程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。
在time.h文件中,我们可以找到对它的定义:
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
void test5()
{
clock_t t1,t2;
t1 = clock();
test();
t2 = clock();
//CLOCKS_PER_SEC
//是标准c的time.h头函数中宏定义的一个常数,用于将clock()函数的结果转化为以秒为单位的量.
//。VC++6.0中该符号常量定义如下:#define CLOCKS_PER_SEC 1000但是这个量的具体是是与操作系统相关的。
printf("time is %f s\n", ((double)(t2 - t1)/ CLOCKS_PER_SEC) );
}
更多测试时间函数方法:
八种c/c++测试运行函数时间的方法