Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间
1.问:知道程序执行时间我们能够做什么?
在《C++应用程序性能优化》一书中,假设大家读过相信大家一定对性能优化这一块很上心,文中总是对优化前后的时间对照很直观给我们一个感受。
那么我们怎样利用C语言提供的库函数获取一个应用程序的各阶段的执行效率,通过数据分析出该程序的瓶颈而且做出对应的优化。
本文给大家解说的clock()函数。
2.我们首先看一看C/C++标准文档对于clock()函数的解说
3.函数原型 clock_t clock (void);
函数返回值 clock()返回从"开启这个程序进程"到"程序中调用clock()函数"时之间的CPU时钟计时单元(clock tick)数
Returns the processor time consumed by the program.
返回程序所消耗的处理器时间
4.两个重要的概念须要理解一下
epoch:时间点。
时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。
通过时钟作为參考的划时代的系统有所不同,但它是关系到执行程序(通常它的发射)。要计算一个程序的实际处理时间,由时钟返回的值应比由曾经调用同一个函数返回一个值。
clock tick:时钟计时单元,一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期。而是C/C++的一个基本计时单位。
5.clock函数
The value returned is expressed in clock ticks, which are units of time of a constant but system-specific length (with a relation of CLOCKS_PER_SEC clock ticks per second).
返回的值是以时钟计时单元为单位表示,这是一个恒定的但系统特定长度的时间单位(CLOCKS_PER_SEC表示每秒多少时钟计时单元)。
The epoch used as reference by clock varies between systems, but it is related to the program execution (generally its launch). To calculate the actual processing time of a program, the value returned by clock shall be compared to a value returned by a previous call to the same function.
时间点所參考的时钟的在不同系统间,它是关系到程序执行(通常它的启动)。要计算一个程序的实际处理器占用时间。由时钟返回的值应与曾经调用同一个函数返回一个值相比。
时间点
Parameters
參数
none
没有
Return Value
返回值
The number of clock ticks elapsed since an epoch related to the particular program execution.
On failure, the function returns a value of -1.
假设失败,函数返回值是-1
一句话这个函数的作用就是:
启动这个程序到程序中调用clock()函数时之间的CPU时钟计时单元(clock tick)的计数。
举一个样例。调用clock的地方就像是我们在体育赛场上掐秒表的动作
100m开跑计时员開始计时,第一个到达终点掐一下显示的时间是9.502s 第二个是9.559s
9.502s和9.559s都是从開始赛跑到终点的计时。这就好比我们的程序開始启动了,我们在一些easy造成性能瓶颈的地方前掐秒表----调用clock()函数一下,完了再掐一下秒表通过计算两次掐表的间隔来评估瓶颈的严重程度。
6.讲讲clock_t
clock_t is a type defined in <ctime> as an alias of a fundamental arithmetic type.
clock_t是一个定义在ctime头文件里的类型 作为一个基本数据类型的别名。
在C语言中clock_t定义的头文件就是time.h
我们打开自己所在开发环境中的time.h 搜索一下clock_t便能够找到了
例如以下显示
从上如我们能够知道所谓的clock_t事实上就是一个long型
7.讲讲CLOCKS_PER_SEC
前面我知道CLOCKS_PER_SEC是某一个特定的值
进入time.h和查看clock_t的方法一样找到CLOCKS_PER_SEC
显演示样例如以下
能够看见CLOCKS_PER_SEC是一个宏 意味着在全部出现CLOCKS_PER_SEC的地方在编译的时候就会被替换成1000这个数值。
8. 小试牛刀
如今我们就试验一下 我通过编写3个函数testinit() testwork() testend()
来模拟程序执行的一些模块的执行时间
#include <stdio.h> /* printf */
#include <time.h> /* clock_t, clock, CLOCKS_PER_SEC */
#include <math.h> /* sqrt */ int testinit (int n)
{
int num = n * n;
while(num)
{
--num;
}
return 0;
}
int testwork (int n)
{
printf ("Begin Calculating...\n");
int i,j;
int freq=n-1;
for (i=2; i<=n; ++i)
for (j=sqrt(i);j>1;--j)
if (i%j==0)
{
--freq;
break;
}
return freq;
}
int testend (int n)
{
int num = n * n;
while(num)
{
--num;
}
return 0;
}
int main ()
{
clock_t t;
int f;
//測试第一阶段 初始化
printf ("Begin clock...\n");
t = clock();//第一个clock() t表示从程序启动到如今这个时刻的时间
testinit(1500);
t = clock() - t;//第二次调用clock()减去第一次获得的t的差值为两次掐表的间隔
printf ("It took %d clicks (%f seconds) to call testinit().\n",t,((float)t)/CLOCKS_PER_SEC); //測试第二阶段 工作
//第一个clock() t表示从程序启动到如今这个时刻的时间
t = clock();
f = testwork(99999);
//第二次调用clock()减去第一次获得的t的差值为两次掐表的间隔
t = clock() - t;
printf ("It took %d clicks (%f seconds)to call testwork().\n",t,((float)t)/CLOCKS_PER_SEC);
printf ("The number of primes lower than 100,000 is: %d\n",f); //測试第三阶段 //第一个clock() t表示从程序启动到如今这个时刻的时间
t = clock(); testend(1255);
//第二次调用clock()减去第一次获得的t的差值为两次掐表的间隔
t = clock() - t;
printf ("It took %d clicks (%f seconds)to call testend().\n",t,((float)t)/CLOCKS_PER_SEC);
return 0;
}
|
|
通过比对数据我们分析出 testwork()函数耗时较大,很可能就是项目中的瓶颈。
9.以下我们看看这个程序在各个平台的Unix/Linux执行怎样呢?
在RHEL7上
在RHEL6上
在Solaris上
在MAC上
Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间的更多相关文章
- Unix/Linux环境C编程入门教程(22) C/C++如何获取程序的运行时间
1.问:知道程序运行时间我们可以做什么? 在<C++应用程序性能优化>一书中,如果大家读过相信大家一定对性能优化这一块非常上心,文中总是对优化前后的时间对比非常直观给我们一个感受. 那么我 ...
- Unix/Linux环境C编程新手教程(5) Red Hat Enterprise Linux(RHEL)环境搭建
Unix/Linux版本号众多,我们推荐Unix/Linux刚開始学习的人选用几款典型的Unix/Linux操作系统进行学习. 通过./a.out ./Y.out运行出结果,证明C++程序编译成功.也 ...
- Unix/Linux环境C编程新手教程(21) 各个系统HelloWorld跑起来效果怎样?
版权声明:本文为博主尹成联系QQ77025077,微信18510341407原创文章,欢迎转载侵权不究. https://blog.csdn.net/yincheng01/article/detail ...
- Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...
- Unix/Linux环境C编程新手教程(24) MySQL 5.7.4 for Red Hat Enterprise 7(RHEL7)的安装
远观历史, MySQL的主要目的是为了可以在单处理器核心的商业服务器上执行.现在MySQL的一个变化用户可能不会注意到,那就是甲骨文已经開始又一次架构MySQL的代码,使它大量的模块化.如软件解析器, ...
- Unix/Linux环境C编程新手教程(30) 字符串操作那些事儿
函数介绍 rindex(查找字符串中最后一个出现的指定字符) 相关函数 index,memchr,strchr,strrchr 表头文件 #include<string.h> 定义函数 c ...
- Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释
上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- Unix/Linux环境C编程新手教程(40) 初识文件操作
1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown.unlink,fclose 表头文件 #include<unistd.h> 定义函数 int ...
- Unix/Linux环境C编程新手教程(37) shell经常使用命令演练
cat命令 cat命令能够用来查看文件内容. cat [參数] 文件名称. grep-指定文件里搜索指定字符内容. Linux的文件夹或文件. -path '字串' 查找路径名匹配所给字串的全部 ...
随机推荐
- proxy set 拦截
set方法用来拦截某个属性的赋值操作. 假定Person对象有一个age属性,该属性应该是一个不大于200的整数,那么可以使用Proxy保证age的属性值符合要求. let validator = { ...
- java与.net比较学习系列(7) 属性
文章摘自:http://www.cnblogs.com/mcgrady/p/3411405.html 说起属性,实际上java中没有属性这个概念,只有字段和方法,但是可以通过私有字段和声明get,se ...
- 几个检查当前运行的LINUX是在VM还是在实体机中的方法
昨天提到了VM中的逃逸问题,要想逃逸,首先要检测当前操作系统是否为VM,下面提供几个LINUX下的检查方法: 第一,首推facter virtual ,权限为普通用户,约定,普通用户命令提示符用$表示 ...
- Dynamics CRM2013 missing prvReadComplexControl privilege
左右ComplexControl 权限设置,SDK例如,在以下的说明,仅供内部使用的实体,但是你可以没有找到这个叫配置安全角色ComplexControl的东西的. 在msdn上面查下就会发现这么一段 ...
- BOOST 线程完全攻略 - 基础篇
http://blog.csdn.net/iamnieo/article/details/2908621 2008-09-10 12:48 9202人阅读 评论(3) 收藏 举报 thread多线程l ...
- django中使用原生sql
在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:raw:执行原始sql并返回模型实例 三:直接执行自定义Sql ( 这种方式完全不依赖 ...
- [Python][MachineLeaning]Python Scikit-learn学习笔记1-Datasets&Estimators
Scikit-learn官网:http://scikit-learn.org/stable/index.html Datasets 标准的数据集格式为一组多维特征向量组成的集合.数据集的标准形状(sh ...
- Cocoapods依赖管理
对于iOS App的开发,几乎都采用了Cocoapods来管理第三方库,那么对于开发人员来说,这是必备技能,必须要掌握如何使用.这篇文章就是介绍如何安装和使用CocoaPods的. 简单来说,就是专门 ...
- Java实现的 线程池
由于最近开始学习java,用到了线程池,按照之前c++的写法写出此java版的线程池 TaskRunnale实现相关任务的接口,具体要实现什么任务在相应的run函数中实现. package threa ...
- js post传值
一种是ajax传值,另一种是post传值, ajax传值: $.ajax({ url: "AjaxTxt/Fild.ashx?Name=duibi&dates=" suzk ...