Chinaunix首页 | 论坛 | 博客
  • 博客访问: 252012
  • 博文数量: 45
  • 博客积分: 802
  • 博客等级: 军士长
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-08 12:21
文章分类
文章存档

2014年(4)

2013年(4)

2012年(37)

我的朋友

分类: LINUX

2012-05-10 09:45:28

    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也是不错的,尤其是考虑到它的通用性。

阅读(3942) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~