有4种方法可以达成测算程序运行时间的目的。

它们分别是使用clock, times, gettimeofday, getrusage来实现的。

下面就来逐一介绍,并比较它们的优劣点。

系统测试环境:

VirtualBox (Ubuntu 9.10)

gcc version 4.4.1

libc6 2.10.1-0ubuntu16

Core Duo T2500 2GMHz

例程如下:

只要修改第11行的定义值,就可以使用不同的测量方法了。

#include

#include

#include

#include

#include

#define TEST_BY_CLOCK (char)(0x00)

#define TEST_BY_TIMES (char)(0x01)

#define TEST_BY_GETTIMEOFDAY (char)(0x02)

#define TEST_BY_GETRUSAGE (char)(0x03)

#define TEST_METHOD (TEST_BY_GETTIMEOFDAY)

#define COORDINATION_X (int)(1024)

#define COORDINATION_Y (int)(1024)

static int g_Matrix[COORDINATION_X][COORDINATION_Y];

double getTimeval()

{

struct rusage stRusage;

struct timeval stTimeval;

if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)

{

gettimeofday(&stTimeval, NULL);

}

else if (TEST_METHOD == TEST_BY_GETRUSAGE)

{

getrusage(RUSAGE_SELF, &stRusage);

stTimeval = stRusage.ru_utime;

}

return stTimeval.tv_sec + (double)stTimeval.tv_usec*1E-6;

}

int main()

{

int i, j;

int n = 0;

clock_t clockT1, clockT2;

double doubleT1, doubleT2;

if (TEST_METHOD == TEST_BY_CLOCK)

{

clockT1 = clock();

}

else if (TEST_METHOD == TEST_BY_TIMES)

{

times(&clockT1);

}

else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)

{

doubleT1 = getTimeval();

}

else if (TEST_METHOD == TEST_BY_GETRUSAGE)

{

doubleT1 = getTimeval();

}

for (i = 0; i < COORDINATION_X; i++)

{

for (j = 0; j < COORDINATION_Y; j++)

{

g_Matrix[i][j] = i * j;

}

}

if (TEST_METHOD == TEST_BY_CLOCK)

{

clockT2 = clock();

printf("Time result tested by clock = %10.30f\n",(double)(clockT2 - clockT1)/CLOCKS_PER_SEC);

}

else if (TEST_METHOD == TEST_BY_TIMES)

{

times(&clockT2);

printf("Time result tested by times = %10.30f\n", (double)(clockT2 - clockT1)/sysconf(_SC_CLK_TCK));

}

else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)

{

doubleT2 = getTimeval();

printf("Time result tested by gettimeofday = %10.30f\n",(double)(doubleT2 - doubleT1));

}

else if (TEST_METHOD == TEST_BY_GETRUSAGE)

{

doubleT2 = getTimeval();

printf("Time result tested by getrusage = %10.70f\n", (double)(doubleT2 - doubleT1));

}

return 0;

}

1. 使用clock的方法:

clock是ANSI C的标准库函数,关于这个函数需要说明几点。

首先,它返回的是CPU耗费在本程序上的时间。也就是说,途中sleep的话,由于CPU资源被释放,那段时间将不被计算在内。

其次,得到的返回值其实就是耗费在本程序上的CPU时间片的数量,也就是Clock Tick的值。该值必须除以CLOCKS_PER_SEC这个宏值,才

能最后得到ss.mmnn格式的运行时间。在POSIX兼容系统中,CLOCKS_PER_SEC的值为1,000,000的,也就是

1MHz。

最后,使用这个函数能达到的精度大约为10ms。

2. 使用times的方法:

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

3. 使用gettimeofday的方法:

用gettimeofday直接提取硬件时钟进行运算,得到的结果的精度相比前两种方法提高了很多。

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

4. 使用getrusage的方法:

getrusage得到的是程序对系统资源的占用信息。只要指定了RUSAGE_SELF,就可以得到程序本身运行所占用的系统时间。

取消

评论

linux测试函数耗时tick数,C语言中怎样测验函数执行时间相关推荐

  1. 在linux下,如何在C语言中使用正则表达式

    http://hi.baidu.com/d_south/blog/item/9d22a34b1fc2bcf483025c53.html 在linux下,如何在C语言中使用正则表达式(整理) 2008- ...

  2. c语言读取文件字节数,怎么在C语言中利用fstat函数获取文件的大小

    怎么在C语言中利用fstat函数获取文件的大小 发布时间:2021-01-22 17:03:17 来源:亿速云 阅读:110 作者:Leah 怎么在C语言中利用fstat函数获取文件的大小?针对这个问 ...

  3. C语言中比较大小的函数模板,C语言中实现模板函数小结 : 不敢流泪

    --by boluor 2009/5/20 如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求- 考 ...

  4. c语言函数编写格式,在c语言中如何实现函数模板?

    如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求- 考虑了一阵子后,就想到了qsort上.qsor ...

  5. C 语言中的 time 函数总结

    C 语言中的 time 函数总结 分类 编程中经常用到时间表达及转换的函数,它们都定义在 time.h 库函数中,在此做一下总结,以方便后续查看使用. 几个时间概念: 1:Coordinated Un ...

  6. python文件定位函数_C语言中文件定位函数总结

    C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...

  7. c语言itoa函数用指针怎么写,C语言中实现itoa函数的实例

    搜索热词 C语言中实现itoa函数的实例 一.原型: char *itoa( int value,char *string,int radix); 二.函数说明: value:欲转换的数据. stri ...

  8. c程序设计语言实现itoa,C语言中实现itoa函数的实例

    C语言中实现itoa函数的实例 2020-02-26 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了C语言中实现itoa函数的实例,编程之家小编觉得挺不错的,现 ...

  9. C语言中内联函数的作用 inline

    C语言中内联函数的作用 inline C语言中内联函数到底有什么作用? 试想一下,每当我们在假设就在主函数中调用另外一个函数的时候,那么这个函数就要入栈或者出栈,比如说下面的一个例子: 点击(此处)折 ...

最新文章

  1. mSystems和Microbiology Spectrum杂志“肠道微生态专题”论文征稿
  2. 【算法系列】一道面试算法题
  3. 在请求和响应中使用 XML
  4. 关于this的指向问题
  5. Angular2学习笔记——NgModule
  6. laravel5.5事件系统
  7. [转]经典的C语言著作,“C语言四书五经”
  8. 循环神经网络以及 LSTM 及其变体
  9. 笔记本电脑如何强制关机_笔记本按电源按钮不能关机只是关闭屏幕的解决办法...
  10. Spark 1.0.1源码安装
  11. s5原生android 5.0,三星Galaxy S5/S4吃上原生安卓5.0棒棒糖
  12. DB9 串口母对母转接头是个坑
  13. V4L2 pixel format 格式参考
  14. 【DL】第 12 章: 生成式深度学习
  15. js Array的push pop shift unshift 方法
  16. hadoop到底是什么
  17. HLS(一)Vivado高层次综合概述
  18. c语言开头的作用是什么,C语言为什么开头都加;#includestdio.h有什么作用?
  19. 考驾照--驾驶证考试
  20. C++核心准则边译边学-P.9 不要浪费时间和空间

热门文章

  1. 火狐最实用的几款插件介绍[含附件]
  2. oracle怎样修改表名、列名、字段类型、添加表列、删除表列
  3. jenkins用ssh agent插件在pipeline里实现scp和远程执行命令
  4. 使用ffmpeg 将mp4文件转化未hls文件
  5. ssh 怎么通过跳板机传文件到内网_黑客攻击内网穿透
  6. linux切换目录使用命令,linux命令切换目录的使用方法
  7. Java读取hdfs目录下所有文件_Java API 读取HDFS目录下的所有文件
  8. js获取ip地址_(原创)Node.JS实战31:大名鼎鼎的Express!
  9. python分治算法_分治法及其python实现例子
  10. button 样式_缩减 SCSS 50%样式代码的 14 条实战经验