zoukankan      html  css  js  c++  java
  • 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
    ",(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
    ",fib1(40));
        tEnd=clock();
        printf("fib1 execution time: %.3f s
    ",(double)(tEnd-tBeg)/CLOCKS_PER_SEC);
    
        tBeg=clock();
        printf("%lld
    ",fib2(40,1,1));
        tEnd=clock();
        printf("fib1 execution time: %.3f s
    ",(double)(tEnd-tBeg)/CLOCKS_PER_SEC);
    
        tBeg=clock();
        printf("%lld
    ",fib3(40));
        tEnd=clock();
        printf("fib1 execution time: %.3f s
    ",(double)(tEnd-tBeg)/CLOCKS_PER_SEC);
    }
    

    执行结果如下:

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

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

  • 相关阅读:
    金步国作品列表
    GCC编译优化指南【作者:金步国】
    g++优化选项
    C++中实现对map按照value值进行排序
    C++ STL中Map的相关排序操作:按Key排序和按Value排序
    How-To: add EPEL repository to Centos 6.x is Easy!
    如何为linux释放内存和缓存
    用Python对体积较大的CSV文件进行比较的经验
    The mmap module
    Python逐块读取大文件行数的代码
  • 原文地址:https://www.cnblogs.com/yueshangzuo/p/7832960.html
Copyright © 2011-2022 走看看