linux测试函数耗时tick数,C语言中怎样测验函数执行时间
有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语言中怎样测验函数执行时间相关推荐
- 在linux下,如何在C语言中使用正则表达式
http://hi.baidu.com/d_south/blog/item/9d22a34b1fc2bcf483025c53.html 在linux下,如何在C语言中使用正则表达式(整理) 2008- ...
- c语言读取文件字节数,怎么在C语言中利用fstat函数获取文件的大小
怎么在C语言中利用fstat函数获取文件的大小 发布时间:2021-01-22 17:03:17 来源:亿速云 阅读:110 作者:Leah 怎么在C语言中利用fstat函数获取文件的大小?针对这个问 ...
- C语言中比较大小的函数模板,C语言中实现模板函数小结 : 不敢流泪
--by boluor 2009/5/20 如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求- 考 ...
- c语言函数编写格式,在c语言中如何实现函数模板?
如果要写个函数支持多种数据类型,首先想到的就是C++的模板了,但是有时候只能用C语言,比如在linux内核开发中,为了减少代码量,或者是某面试官的要求- 考虑了一阵子后,就想到了qsort上.qsor ...
- C 语言中的 time 函数总结
C 语言中的 time 函数总结 分类 编程中经常用到时间表达及转换的函数,它们都定义在 time.h 库函数中,在此做一下总结,以方便后续查看使用. 几个时间概念: 1:Coordinated Un ...
- python文件定位函数_C语言中文件定位函数总结
C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...
- c语言itoa函数用指针怎么写,C语言中实现itoa函数的实例
搜索热词 C语言中实现itoa函数的实例 一.原型: char *itoa( int value,char *string,int radix); 二.函数说明: value:欲转换的数据. stri ...
- c程序设计语言实现itoa,C语言中实现itoa函数的实例
C语言中实现itoa函数的实例 2020-02-26 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了C语言中实现itoa函数的实例,编程之家小编觉得挺不错的,现 ...
- C语言中内联函数的作用 inline
C语言中内联函数的作用 inline C语言中内联函数到底有什么作用? 试想一下,每当我们在假设就在主函数中调用另外一个函数的时候,那么这个函数就要入栈或者出栈,比如说下面的一个例子: 点击(此处)折 ...
最新文章
- mSystems和Microbiology Spectrum杂志“肠道微生态专题”论文征稿
- 【算法系列】一道面试算法题
- 在请求和响应中使用 XML
- 关于this的指向问题
- Angular2学习笔记——NgModule
- laravel5.5事件系统
- [转]经典的C语言著作,“C语言四书五经”
- 循环神经网络以及 LSTM 及其变体
- 笔记本电脑如何强制关机_笔记本按电源按钮不能关机只是关闭屏幕的解决办法...
- Spark 1.0.1源码安装
- s5原生android 5.0,三星Galaxy S5/S4吃上原生安卓5.0棒棒糖
- DB9 串口母对母转接头是个坑
- V4L2 pixel format 格式参考
- 【DL】第 12 章: 生成式深度学习
- js Array的push pop shift unshift 方法
- hadoop到底是什么
- HLS(一)Vivado高层次综合概述
- c语言开头的作用是什么,C语言为什么开头都加;#includestdio.h有什么作用?
- 考驾照--驾驶证考试
- C++核心准则边译边学-P.9 不要浪费时间和空间
热门文章
- 火狐最实用的几款插件介绍[含附件]
- oracle怎样修改表名、列名、字段类型、添加表列、删除表列
- jenkins用ssh agent插件在pipeline里实现scp和远程执行命令
- 使用ffmpeg 将mp4文件转化未hls文件
- ssh 怎么通过跳板机传文件到内网_黑客攻击内网穿透
- linux切换目录使用命令,linux命令切换目录的使用方法
- Java读取hdfs目录下所有文件_Java API 读取HDFS目录下的所有文件
- js获取ip地址_(原创)Node.JS实战31:大名鼎鼎的Express!
- python分治算法_分治法及其python实现例子
- button 样式_缩减 SCSS 50%样式代码的 14 条实战经验