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;
}
Output:

通过比对数据我们分析出 testwork()函数耗时较大,很可能就是项目中的瓶颈。

9.以下我们看看这个程序在各个平台的Unix/Linux执行怎样呢?

在RHEL7上

在RHEL6上

在Solaris上

在MAC上

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间相关推荐

  1. Unix/Linux环境C编程入门教程(16) LinuxMint CCPP开发环境搭建

    1. Linux Mint由Linux Mint Team团队于2006年开始发行,是一份基于Debian和Ubuntu的Linux发行版.其目标是提供一种更完整的即刻可用体验,这包括提供浏览器插件. ...

  2. Unix/Linux环境C编程入门教程(18) kali-linuxCCPP开发环境搭建

    1. Kali linux是BT5的晋级版本,用于信息安全.基于Debian7内核.新建虚拟机. 2. 选择默认虚拟机 3. 选择稍后安装操作系统 4.选择Linux Debian7 64位,因为Ka ...

  3. Unix/Linux环境C编程入门教程(39) shell命令之系统管理

    df命令 用于检测文件系统的磁盘空间占用和空余情况,可以显示所有文件系统对节点和磁盘块的使用情况.命令的使用格式如下: df  [选项] 常用参数及含义如下表所示. df -a:显示所有文件系统的磁盘 ...

  4. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

     上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  5. Unix/Linux环境C编程入门教程(27) 内存那些事儿

    calloc() free() getpagesize() malloc() mmap() munmap()函数介绍 calloc(配置内存空间) 相关函数 malloc,free,realloc,b ...

  6. linux 建站命令,Linux 服务器建站新手教程(小白宝塔建站全流程)-不需要敲一行命令,...

    Linux 服务器建站新手教程(小白宝塔建站全流程)-不需要敲一行命令, Linux 服务器配置.运行.不用敲命令 WordPress 建站攻略--助力新手快速利用Linux系统建立属于自己的站点-- ...

  7. ESP-01S开发环境搭建及新手教程点灯教程全解详细配图(ESP8266-01s)

    ESP-01S开发环境搭建及新手教程点灯教程全解相当详细(ESP8266-01s) 一.模组简介 二.开发工具 三.开发软件 四.点亮第一盏灯 五.至此完成了ESP-01S在arduino开发环境下点 ...

  8. Linux环境高级编程函数,Linux环境高级编程--出错处理(CLStatus)

    很多程序库对外提供若干类,每个方法出错时如何告知调用者是否出错,以及出错码(在Linux上在error.h中的全局errno就是保存我们Linux程序执行的出错码的)?方法很多,为了简化起见,函数将返 ...

  9. Linux环境多线程编程基础设施

    Linux环境多线程编程基础设施 来源:Yebangyu 本文介绍多线程环境下并行编程的基础设施.主要包括: Volatile __thread Memory Barrier __sync_synch ...

最新文章

  1. 在3ds Max和Vray中创建赛博朋克圣诞老人室内场景
  2. 利用python 提取log 文件里的关键句子,并进行统计分析
  3. 6.二元查找树的后序遍历结果[PostOrderOfBST]
  4. bread是可数还是不可数_​面包bread是可数名词还是不可数
  5. SAP Spartacus 页面标题的更改机制 - 谁动了我的页面标题?
  6. c语言 overflow_C语言和其他语言的不得不说的差别!
  7. ts获取服务器数据_怎么使用Satruts2实现页面列表数据导出到Excel表格
  8. C 语言,你真的懂递归了吗?
  9. 以“百钱买百鸡”问题练习使用 C语言 goto 语句
  10. cefpython基础入门
  11. rosbag使用方法汇总
  12. 斗地主服务器维护中,天天斗地主真人版进不了怎么办 登录不了解决方案
  13. LocalDateTime返回的时间中带有T
  14. ios是什么?ios有什么特点?
  15. D. Sequence and Swaps
  16. 【Kubernetes】Kubeadm安装的K8s集群的版本升级过程测试(二)
  17. Elastic实战:canal自定义客户端,实现mysql多表同步到es
  18. HashMap的四种遍历方法,及效率比较(简单明了)
  19. win7系统损坏无法开机_win7系统网络适配器无法启动怎么办
  20. 农业计算机英语词汇,考研英语作文主题词汇:农业

热门文章

  1. [React] Web应用:Hello World
  2. 【QwQ】乱七八糟的置顶
  3. jquery-validate remote验证,返回不同的消息内容
  4. pyCharm编辑器激活使用
  5. java基础----数据结构与算法----Java API:集合 以及 排序相关API
  6. Android典型界面设计(4)——使用ActionBar+Fragment实现tab切换
  7. Win8.1下Node.js连接oracle
  8. .net中下载文件的方法(转)
  9. Python模块学习——optparse
  10. linux 条件判断