精确测量函数的运行时间

3921阅读 0评论2012-05-10 kkmm0105
分类:LINUX

    1. #include <sys/time.h>
    2. #include<stdio.h>
    3. #include<unistd.h>

    4. main()
    5. {
    6.     struct timeval tpstart,tpend;
    7.     float timeuse;

    8.     gettimeofday(&tpstart,NULL);
    9.     function(); //测试函数
    10.     gettimeofday(&tpend,NULL);
    11.     timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
    12.     tpend.tv_usec-tpstart.tv_usec;
    13.     timeuse/=1000000;
    14.     printf("Used Time:%fs/n",timeuse);
    15.     exit(0);
    16. }

    以上是使用gettimeofday()方法的代码,精度为微妙。

    以下是摘自的关于几种方法的分析与对比。

    使用clock的方法:
    clock是ANSI C的标准库函数,关于这个函数需要说明几点。
    首先,它返回的是CPU耗费在本程序上的时间。也就是说,途中sleep的话,由于CPU资源被释放,那段时间将不被计算在内。
    其次,得到的返回值其实就是耗费在本程序上的CPU时间片的数量,也就是Clock Tick的值。该值必须除以CLOCKS_PER_SEC这个宏值,才能最后得到ss.mmnn格式的运行时间。在POSIX兼容系统中,CLOCKS_PER_SEC的值为1,000,000的,也就是1MHz。
    最后,使用这个函数能达到的精度大约为10ms。代码如下:

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

    3. int main(){
    4.     int i;
    5.     int cx = 0;
    6.     clock_t t1 = clock();
    7.     for(i = 0; i < 10000000; i++){
    8.         cx++;
    9.     }
    10.     clock_t t2 = clock();
    11.     double cha = (double)(t2-t1)/CLOCKS_PER_SEC;
    12.     printf("%.2f\n", cha);
    13.     
    14.     return 0;
    15. }

    使用times的方法:
    times的用法基本和clock类似,同样是取得CPU时间片的数量,所不同的是要除以的时间单位值为sysconf(_SC_CLK_TCK)。

    使用gettimeofday的方法:
    用gettimeofday直接提取硬件时钟进行运算,得到的结果的精度相比前两种方法提高了很多。
    但是也正由于它提取硬件时钟的原因,这个方法只能计算程序开始时间和结束时间的差值。而此时系统中如果在运行其他的后台程序,可能会影响到最终结果的值。如果后台繁忙,系统dispatch过多的话,并不能完全真实反映被测量函数的运行时间。

    使用getrusage的方法:
    getrusage得到的是程序对系统资源的占用信息。只要指定了RUSAGE_SELF,就可以得到程序本身运行所占用的系统时间。
    可以说是精度最高的测量方法了。

    自己试用了这四种方法,感觉需要高精度测试的话,getrusage和gettimeofday都可以选择。需要长时间测试的话,clock也是不错的,尤其是考虑到它的通用性。

上一篇:Linux下缓冲区溢出攻击的原理及对策
下一篇:Linux操作系统下/etc/hosts文件