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,就可以得到程序本身运行所占用的系统时间。

取消

评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 修改Db2主机名,对DB2服务器主机名的修改的正确操作流程

文章主要描述的是如何正确的对DB2服务器主机名的修改&#xff0c;在实际操作中由于出于多种原因&#xff0c;在DB2数据库的服务器的实际使用过程中&#xff0c;用户有可能对DB2数据库服务器的主机名进行修改&#xff0c;本文详细介绍了修改DB2的主机名需要做的修改工作。环境:产…

x86_64 arm制linux-gcc,arm-linux-gcc 制作

序言&#xff1a;其实&#xff0c;如果没有充裕的时间&#xff0c;交叉编译器完全不用自己建&#xff0c;网上下载直接拿来用就可以了。之所以写这博客&#xff0c;一是为了和大家交流&#xff0c;二是为了防止由于时间的流逝再也找不到当初的笔记。人说好记星不如烂笔头&#…

obs捕获窗口没有窗口_学习工具 | 视频录制软件OBS

小编今天为你们带来了一位新朋友&#xff0c;它就是&#xff1a;OBS了解OBSOBS是免费和开源软件的视频录制和实时流。在 Windows、Mac 或 Linux 上都能够快速轻松地下载并开始流式传输。小知识&#xff1a;流式传输&#xff1a;主要指通过网络传送流媒体(如视频、音频)的技术总…

linux webshell 页面管理,instantbox:30s内快速搭建可通过webshell管理的Linux系统

点击上方蓝色字体&#xff0c;关注我们如何快速搭建一个Linux环境&#xff0c;肯定非docker莫属。但通过instantbox&#xff0c;可以带给我们比docker更好的体验&#xff1a;在不到 30s 内快速搭建一个干净、开箱即用的多个临时的Linux 系统&#xff0c;如Ubuntu、Centos、Arch…

局域网共享工具_局域网文件共享

局域网文件共享的方式都有哪些&#xff1f;局域网文件共享的方式还是比较多的&#xff0c;有几种可参考操作&#xff1a; 在多台电脑上开启网上邻居共享&#xff0c;这样电脑直接打开网上邻居就可以访问对方的文件夹和资料了。 可以安装辅助软件&#xff0c;比如&#xff1a;坚…

linux重启was控制台报错,IHS启动时报错,从was控制台传播插件失败

IHS启动时报错&#xff0c;从was控制台传播插件失败集群IHSWAS&#xff0c;以前单独访问某一个节点http://ip:9080可以访问&#xff0c;最近无法访问(9080可以telnet通)&#xff0c;通过日志发现&#xff0c;以下问题请各前辈帮帮忙IHS启动时报错&#xff1a; 版本6.1.0.31[Th…

sdp ddp内存怎么分_旗舰手机跑分66万+,缩短与PC差距,手机成生产力工具也许不是梦...

现在人们无论是在买电脑还是买手机的时候总是喜欢拿跑分来衡量产品的硬件性能&#xff0c;其实长时间的使用产品才是体验产品性能最真实的体验&#xff0c;但是往往需要先有机会拿到产品才行。除此之外也许跑分是最直观的手段。虽然跑分不代表最终体验&#xff0c;但是通过横向…

wave6000可以c语言编程吗,WAVE6000使用教程初步.doc

PAGEPAGE 12WAVE集成调试软件使用初步说明&#xff1a;本文档是对WAVE集成调试软件使用的初步说明&#xff0c;其中调试软件中有许多功能没有涉及&#xff0c;希望同学们通过使用进一步掌握。一、启动启动WAVE可以通过两种方式&#xff1a;(1)桌面上WAVE快捷方式。(2)安装目录下…

安卓虚拟机_安卓中的安卓虚拟机,那些闪退应用有救了

“我们坚持最优质的分享&#xff0c;努力做你身边的资源助手“VMOS VMOS堪称安卓中的安卓虚拟机&#xff0c;可以在手机里面再运行一个全新的安卓系统&#xff0c;由于是独立在运行的操作系统&#xff0c;可以运用的场景非常多&#xff0c;例如多开应用&#xf…

c语言表达式与变量区别,C语言实战开发————基础秘籍1(C与C++的区别,输入输出,函数,变量,运算符)...

(一)学前思考学习目标1 面试2 后期服务 :JNI(C语言)C JAVA 编程思想 编程能力(二)所学内容C语言与C的区别1.C是面向过程 C面向对象2.面向过程与面向对象最大的区别在于前者更直接&#xff0c;但后者略显含蓄&#xff0c;相较于前者而言&#xff0c;后者更为完善&#xff0c;正如…

电脑一开机出rebootand_北京联想电脑维修点【蓝伟博达笔记本维修吧】

联想笔记本电脑维修,多年从事联想笔记本的维修,我公司总结出联想leovo笔记本电脑常见故障,能准确快速判断出联想笔记本出现该故障的相应损坏部件&#xff0c;欢迎联想电脑维修 北京联想笔记本电脑主板维修。用户到店体验、免费检测、一对一维修服务、检测免费&#xff0c;修不好…

c语言用while和if颠倒整数,【连载】(循环执行语句while和if)乐创DIY C语言讲义​——3.8节(3)...

2 循环执行语句计算机有一个强大的能力&#xff0c;快速地重复执行某一计算&#xff0c;这种重复计算多次的方法&#xff0c;是通过软件中的循环执行语句去实现的。C语言中实现循环语句结构的方式有三种&#xff0c;第一种为“for”循环&#xff0c;第二种为“while”循环&…

怎样查看电脑系统版本_用什么软件查维修记录 思域HATCHBACK怎样查询维保记录_汽车事故车查询...

请点击上方快速关注思域HATCHBACK很火。这款被誉为“国产Type R”的思域HATCHBACK版本在三厢车的基础上&#xff0c;集成了更运动化乃至更具战斗感的套件包围、中置排气和手动变速箱。对于本田粉、改装粉、操控粉们而言&#xff0c;“C位客信仰落地”的名言&#xff0c;就像是火…

安卓4.4.4安装哪个微信版本_??微信又更新!暗黑模式可独立设置,新增群接龙固定入口...

前段时间微信支持设置暗黑模式引起了大众的关注&#xff0c;但有小伙伴表示&#xff1a;为啥微信不能单独设置&#xff0c;要随系统变化&#xff1f;这下好了&#xff0c;微信安卓版发布7.0.15内测版本&#xff0c;私信「安卓内测版」即可获取。可以看到&#xff0c;本次内测更…

c语言中申请内存并初始化,c语言中结构体的定义、初始化及内存分配

#include struct person{char *name;int age;};int main(){//结构体可以定义在函数内&#xff0c;也可以定义到函数外//相当于全局变量与局部变量// struct person// {// char *name;// int age;// };struct person p1;//补齐算法&#xff0c;分配的存储空间为结构体中占用内存…

postgresql c语言,任意语言访问PostgreSQL:C语言接口

开源软件的一个好处是可以根据需要修改程序代码。如果程序后台使用PostgreSQL数据库&#xff0c;可以很容易用各种语言对其进行访问。本文作为系列文章的第一篇&#xff0c;会陆续介绍C、C、PHP、Tcl、Python及Perl等编程语言对PostgreSQL的访问方法。  需要说明的是&#xf…

某系统有6台输出设备 有多个进程均需要使用2台_系统设计硬核知识(4)——操作系统的设备管理...

在计算机系统中&#xff0c;除了处理器和内存之外&#xff0c;其他的大部分硬设备称为外部设备。它包括输入/输出设备&#xff0c;辅存设备及终端设备等。这些设备种类繁多&#xff0c;特性各异&#xff0c;操作方式的差异很大&#xff0c;从而使操作系统的设备管理变得十分繁杂…

esp8266单片机透传_基于WeMos D1(ESP8266)的校园卡门禁系统

刷卡https://www.zhihu.com/video/1107591334902345728电脑端控制https://www.zhihu.com/video/1107591363079733248手机端控制https://www.zhihu.com/video/1107591388040052736一、项目背景随着网络技术和嵌入式技术的发展&#xff0c;物联网开始引领新一波热潮。制作这个项目…

c语言调用android surface,Android GUI SurfaceFlinger

本文涉及的源代码基于 Android-7.1.1r。一、Android GUI 框架SurfaceFlinger 是 Android GUI 的核心&#xff0c;但是从 OpenGL_ES 的角度来看&#xff0c;它也只是个“应用程序”。Android 的显示系统大致框架图下图所示&#xff1a;GUI_STRUCT.png下面就“由下向上”来逐一分…

bat 取得服务列表_解读浩泽净水2018业绩:稳定增长背后的服务深化和科技跃进...

北京时间3月26日凌晨&#xff0c;苹果以一场没有任何硬件亮相的“软”发布会&#xff0c;宣告公司将向服务转型&#xff0c;欲以可持续的服务收入抵消iPhone遭遇的增长瓶颈。此举在大洋彼岸的中国引发了热烈反响。分析师们普遍认为苹果在“偷师”中国的BAT等互联网企业&#xf…