Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Unix/Linux环境C编程新手教程(22) C/C++怎样获取程序的执行时间「建议收藏」

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

作者头像
全栈程序员站长
发布于 2022-01-30 06:09:56
发布于 2022-01-30 06:09:56
56700
代码可运行
举报
运行总次数:0
代码可运行

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

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()

来模拟程序执行的一些模块的执行时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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上

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/115834.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【算法】计算程序执行时间(C/C++)
我们在写算法时要考虑到算法的执行效率,有的题目规定了时间限制,我们需要在这个时间之内去解决问题。如果我们需要比对算法的好坏,就需要输出这个程序运行了多长时间。
摆烂小白敲代码
2024/11/24
4900
【算法】计算程序执行时间(C/C++)
C++ 计时
time.h 是最常用的 C++ 计时头文件,在 C++ 中,计时通常使用 <time.h> 头文件中的 clock() 函数记录CPU 单元的运行周期时间,可以在 Windows / Linux 等操作系统中使用,配合 CLOCKS_PER_SEC 实现对真实事件单位秒(s)等的转换。
为为为什么
2023/03/24
9240
C 程序关于时间和日期的操作详解
在 C 语言中可以用 time_t 类型表示时间,time_t 类型时间其实就是所谓的「日历时间」,在 Linux 系统中就是距离 1970-01-01 08:00:00 这个时间点所经过的秒数,通常 time_t 是一个和 long 一样长的整数,但它似乎无法表示 1970 年以前的时间。
用户3105362
2021/02/04
2.2K0
C 程序关于时间和日期的操作详解
C/C++获取本地时间常见方法
(1)UTC (Coordinated Universal Time):协调世界时,又称世界标准时间。曾由格林威治平均时间(Greenwich Mean Time,GMT)提供,现在由原子钟提供。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。
恋喵大鲤鱼
2018/08/03
1.4K0
现代c++中实现精确延时方法总结
这种非常不建议用,懒人做法。不够精确且换种环境系统处理速度不一样可能就是bug来源。
杨永贞
2022/11/21
4K0
现代c++中实现精确延时方法总结
c++怎么计算程序运行的时间
使用clock函数获得程序开始和结束的时间,相减就能得到程序运行的时间。clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:clock_t clock(void) ;简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。
杨鹏伟
2020/09/11
3.5K0
详细介绍下C/C++时间相关的那些函数
chrono是一个关于时间的库,起源于boost,现在是C++的标准,话说现在的C++标准好多都是源于boost,要进标准的特性似乎都会先在boost试验一番。
C语言与CPP编程
2020/12/02
8240
详细介绍下C/C++时间相关的那些函数
程序运行时间测试 - 使用libc 中 clock 函数
我们运行程序的时候,可以简单使用clock函数测试程序的运行时间:(本示例中以微秒为单位输出)
西湖醋鱼
2020/12/30
7280
c++ 在windows下获取时间和计算时间差的几种方法总结
1、获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 )。 精确到秒。
用户7886150
2021/02/08
6.3K0
c++计算时间
1、获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 )。 精确到秒。
用户7886150
2021/02/17
2K0
C++记录程序运行时间
方式一 #include<iostream> #include<ctime> using namespace std; int main() { clock_t startTime,endTime; // 计时开始 startTime = clock(); for (int i = 0; i < 2147483640; i++) { i++; } // 计时结束 endTime = clock(); cout << "运
ClearSeve
2022/02/10
9480
OpenMp多线程编程计时问题 原
在做矩阵乘法并行化测试的时候,在利用<time.h>的clock()计时时出现了一点问题。
Gaussic
2018/08/17
8750
求最大公约数的4种算法
for(z=0; z<10000000; z++) 循环只是为了增加程序的运行时间,让我们体会算法的时间复杂度。 算法一:短除法 想法,采用短除法找出2个数的所有公约数,将这些公因子相乘,结果就是2个数的最大公约数。【找公因子,只能使用蛮力法】 #include<stdio.h> #include<time.h> void main() { int m=28,n=72; int i,f=1; int z; clock_t start,finish; double duration; start=
热心的社会主义接班人
2018/04/27
2.3K0
求最大公约数的4种算法
求1000000以内的素数
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/79016354
Tyan
2019/05/25
1.5K0
C 语言的 互斥锁、自旋锁、原子操作
今天不整 GO 语言,我们来分享一下以前写的 C 代码,来看看 互斥锁,自旋锁和原子操作的 demo
阿兵云原生
2023/02/16
1.4K0
【C语言】时间函数详解
在C语言中,时间处理功能由标准库 time.h 提供。使用这些函数时,需要包含 #include <time.h> 头文件。以下是一些常用的时间函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
LuckiBit
2024/12/11
4470
【C语言】时间函数详解
linux环境下的时间编程
Linux下提供了丰富的api以供开发者们处理和时间相关的问题。然而这些接口看似各自为政实则有有着千丝万缕的联系,在学习和时间中引发了各种各样的混乱。因此时间处理成为了许多Linux开发者的梦魇,遇到时间处理往往避之不及。不过只要你稍微花费一点点精力,学会在Linux上优雅的处理时间和日期也并不是什么难事。
不会飞的小鸟
2020/03/27
3.7K0
深入浅出理解动态规划(一) | 交叠子问题
动态规划是一种将复杂问题分解成很多子问题并将子问题的求解结果存储起来避免重复求解的一种算法。
C you again
2020/09/10
1.2K0
linux获取进程执行时间方法示例
linux获取进程执行时间有两种方法可以获取,第一种是用time命令,time 进程。第二种是通过在程序中进行记录,首先利用sysconf函数获取时钟滴答数,再用times获取tms结构,详细看下面的示例代码
习惯说一说
2019/07/18
3.1K0
linux获取进程执行时间方法示例
详解C调用lua脚本效率测试
C调用lua脚本效率测试是本文要介绍的内容,以下代码以C语言为基准,测试了C调用Lua循环和循环调用Lua的效率。结论是不要频繁地穿越C/Lua边界.
用户4766018
2022/08/19
9710
相关推荐
【算法】计算程序执行时间(C/C++)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档