c/c++测试运行函数时间的方法

测试函数:

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++测试运行函数时间的方法

猜你喜欢

转载自blog.csdn.net/W_J_F_/article/details/81664176