C/C++下测量函数运行时间

C/C++下测量函数运行时间

time.h介绍

C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。

clock_t clock( void );

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:

#ifndef _CLOCK_T_DEFINED 
 typedef long clock_t; 
#define _CLOCK_T_DEFINED 
#endif

很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:

#define CLOCKS_PER_SEC ((clock_t)1000) //CLOCKS_PER_SEC为系统自定义的

可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。

写法

#include<stdio.h>
#include<time.h>

int main()
{
  clock_t cBeg=clock();
  //···
  //调用函数
  //···
  clock_t cEnd=clock();
  printf("program exection time: %.3f\n",(double)(cEnd-cBeg)/CLOCKS_PER_SEC);
  return 0;
}

例子

#include<stdio.h>
#include<time.h>

//直接递归
long long fib1(int n)
{
    if(n==1||n==0)
        return 1;
    else
        return fib1(n-1)+fib1(n-2);
}

//尾递归
long long fib2(int n,long long f,long long s)
{
    if(n<2)
        return s;
    else
        return fib2(n-1,s,f+s);
}

//迭代
long long fib3(int n)
{
    long long f=1;
    long long g=0;
    while(n--)
    {
        f=f+g;
        g=f-g;
    }
    return f;
}

int main()
{
    clock_t tBeg,tEnd;
    tBeg=clock();
    printf("%lld\n",fib1(40));
    tEnd=clock();
    printf("fib1 execution time: %.3f s\n",(double)(tEnd-tBeg)/CLOCKS_PER_SEC);

    tBeg=clock();
    printf("%lld\n",fib2(40,1,1));
    tEnd=clock();
    printf("fib1 execution time: %.3f s\n",(double)(tEnd-tBeg)/CLOCKS_PER_SEC);

    tBeg=clock();
    printf("%lld\n",fib3(40));
    tEnd=clock();
    printf("fib1 execution time: %.3f s\n",(double)(tEnd-tBeg)/CLOCKS_PER_SEC);
}

执行结果如下:

(尾递归由于编译器优化和迭代比直接递归快很多)

另外,linux下可直接 time ./执行程序测试时间。

posted @ 2017-11-14 15:51  Neptune15  阅读(372)  评论(0编辑  收藏  举报