首页 > 运维 > linux运维 > 正文

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

蓮花仙者
发布: 2025-07-21 11:54:11
原创
876人浏览过

大家好,又见面了,我是全栈君。

  1. 问:知道程序执行时间我们能够做什么?

在《C++应用程序性能优化》一书中,相信大家对性能优化这一块一定很上心,书中通过对比优化前后的时间给我们直观的感受。

那么,我们如何利用C语言提供的库函数获取一个应用程序各阶段的执行效率,通过数据分析出该程序的瓶颈并进行优化呢?

本文将为大家介绍clock()函数。

  1. 我们首先看一看C/C++标准文档对于clock()函数的解说

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

立即学习C++免费学习笔记(深入)”;

  1. 函数原型 clock_t clock (void);

函数返回值:clock()返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数。

Returns the processor time consumed by the program. 返回程序所消耗的处理器时间。

  1. 两个重要的概念需要理解一下

epoch:时间点。

时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。

通过时钟作为参考的划时代系统有所不同,但它是关系到执行程序(通常是它的启动)。要计算一个程序的实际处理时间,由时钟返回的值应比由曾经调用同一个函数返回的一个值。

clock tick:时钟计时单元,一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。

  1. 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.

时间点所参考的时钟在不同系统间有所不同,它是关系到程序执行(通常是它的启动)。要计算一个程序的实际处理器占用时间,由时钟返回的值应与曾经调用同一个函数返回的一个值相比。

参数:none 没有

返回值: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都是从开始赛跑到终点的计时。这就好比我们的程序开始启动了,我们在一些可能造成性能瓶颈的地方前掐秒表——调用clock()函数一下,完了再掐一下秒表,通过计算两次掐表的间隔来评估瓶颈的严重程度。

  1. 讲讲clock_t

clock_t是一个定义在ctime头文件里的类型,作为一个基本数据类型的别名。

在C语言中,clock_t定义的头文件就是time.h。

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

我们打开自己所在开发环境中的time.h,搜索一下clock_t便能够找到。

豆包AI编程
豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483
查看详情 豆包AI编程

例如以下显示:

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

从上如我们能够知道所谓的clock_t事实上就是一个long型。

  1. 讲讲CLOCKS_PER_SEC

前面我知道CLOCKS_PER_SEC是某一个特定的值。

进入time.h和查看clock_t的方法一样找到CLOCKS_PER_SEC。

显示样例如下:

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

能够看见CLOCKS_PER_SEC是一个宏,意味着在全部出现CLOCKS_PER_SEC的地方在编译的时候就会被替换成1000这个数值。

  1. 小试牛刀

现在我们就试验一下,我通过编写3个函数testinit()、testwork()、testend()来模拟程序执行的一些模块的执行时间。

代码语言:javascript 代码运行次数:0

运行 复制
#include <stdio.h>      /* printf */
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */
#include <math.h>       /* sqrt */
<p>int testinit (int n)
{
int num = n * n;
while(num)
{
--num;
}
return 0;
}</p><p>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;
}</p><p>int testend (int n)
{
int num = n * n;
while(num)
{
--num;
}
return 0;
}</p><p>int main ()
{
clock_t t;
int f;</p><p>//测试第一阶段 初始化
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);</p><p>//测试第二阶段 工作
t = clock(); //第一个clock() t表示从程序启动到现在这个时刻的时间
f = testwork(99999);
t = clock() - 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);</p><p>//测试第三阶段
t = clock(); //第一个clock() t表示从程序启动到现在这个时刻的时间
testend(1255);
t = clock() - t; //第二次调用clock()减去第一次获得的t的差值为两次掐表的间隔
printf ("It took %d clicks (%f seconds)to call testend().\n",t,((float)t)/CLOCKS_PER_SEC);</p><p>return 0;
}
登录后复制

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

  1. 以下我们看看这个程序在各个平台的Unix/Linux执行情况如何呢?

在RHEL7上:

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

在RHEL6上:

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

在Solaris上:

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

在MAC上:

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/de9cf7fc237bf2217c1c576e4f026fee

原文链接:https://www.php.cn/link/c8377ad2a50fb65de28b11cfc628d75c

以上就是Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号