嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间

目录

1 进程时间概念

2 times 函数

2.1 times 函数介绍

2.2 示例程序

3 clock 函数

3.1 clock 函数介绍

3.2 示例程序


1 进程时间概念

进程时间指的是进程从创建后(也就是程序运行后)到目前为止这段时间内使用 CPU 资源的时间总数,出于记录的目的,内核把 CPU 时间(进程时间) 分为以下两个部分:

  • 用户 CPU 时间:进程在用户空间(用户态)下运行所花费的 CPU 时间。有时也成为虚拟时间(virtual time)。
  • 系统 CPU 时间:进程在内核空间(内核态)下运行所花费的 CPU 时间。这是内核执行系统调用或代表进程执行的其它任务(譬如,服务页错误)所花费的时间。

一般来说,进程时间指的是用户 CPU 时间和系统 CPU 时间的总和,也就是总的 CPU 时间

Tips:进程时间不等于程序的整个生命周期所消耗的时间, 如果进程一直处于休眠状态(进程被挂起、不会得到系统调度),那么它并不会使用 CPU 资源,所以休眠的这段时间并不计算在进程时间中。

2 times 函数

2.1 times 函数介绍

times函数是用来获取进程占用CPU的时间信息的,函数返回自进程启动以来,在用户模式和内核模式下消耗的CPU时间。times函数的原型定义在sys/times.h头文件中,其定义如下: 

#include <sys/times.h>

clock_t times(struct tms *buf);
  • buf:times()会将当前进程时间信息存在一个 struct tms 结构体数据中,其定义如下:
struct tms {
    clock_t tms_utime;  // 用户模式下的CPU时间
    clock_t tms_stime;  // 内核模式下的CPU时间
    clock_t tms_cutime; // 子进程在用户模式下的CPU时间
    clock_t tms_cstime; // 子进程在内核模式下的CPU时间
};

返回值: 返回值类型为 clock_t(实质是 long 类型), 调用成功情况下,将返回从过去任意的一个时间点(譬如系统启动时间) 所经过的时钟滴答数(其实就是系统节拍数), 将(节拍数 / 节拍率)便可得到秒数,返回值可能会超过 clock_t 所能表示的范围(溢出); 调用失败返回-1,并设置 errno。

2.2 示例程序

下面的程序通过 times()来计算程序中某一段代码执行所耗费的进程时间和总的时间,测试程序如下所示:

#include <stdio.h>
#include <sys/times.h>
#include <unistd.h>
#include <time.h>

int main() {
    struct timespec start, end;
    clock_t start_clk_t, end_clk_t;
    struct tms start_tms, end_tms;
    long clock_ticks;
    int i;

    // 获取系统时钟的滴答数
    clock_ticks = sysconf(_SC_CLK_TCK);

    // 记录开始时间(CPU时间和实际时间)
    times(&start_tms);
    clock_gettime(CLOCK_MONOTONIC, &start);

    // 模拟一些工作,例如循环
    for (i = 0; i < 1000000; i++) {
        // 这里可以放置一些计算操作,比如 i * i
    }

    // 记录结束时间(CPU时间和实际时间)
    times(&end_tms);
    clock_gettime(CLOCK_MONOTONIC, &end);

    // 计算CPU时间差(用户模式和内核模式)
    clock_t total_utime = end_tms.tms_utime - start_tms.tms_utime;
    clock_t total_stime = end_tms.tms_stime - start_tms.tms_stime;

    // 计算实际运行时间差(秒和纳秒)
    long seconds = end.tv_sec - start.tv_sec;
    long nanoseconds = end.tv_nsec - start.tv_nsec;

    // 打印结果
    printf("User mode CPU time used: %ld seconds\n", total_utime / clock_ticks);
    printf("Kernel mode CPU time used: %ld seconds\n", total_stime / clock_ticks);
    printf("Real time used: %ld seconds and %ld nanoseconds\n", seconds, nanoseconds);

    return 0;
}

程序中使用 sysconf(_SC_CLK_TCK)获取到系统节拍率,程序还使用了一个库函数 sleep()模拟程序运行,可以看到用户 CPU 时间为 1.9 秒,系统 CPU 时间为 0 秒,也就是说测试的这段代码并没有进入内核态运行,所以总的进程时间 = 用户 CPU 时间 + 系统 CPU 时间 = 1.9 秒。运行结果如下:

3 clock 函数

3.1 clock 函数介绍

clock函数是用来获取程序的CPU时间(也就是进程时间)。函数返回自程序启动以来,程序所占用的CPU时间总量,包括用户模式和内核模式下的时间。clock函数的原型定义在time.h头文件中,其定义如下: 

#include <time.h>

clock_t clock(void);

注意:clock()函数虽然可以很方便的获取总的进程时间,但并不能获取到单独的用户 CPU 时间和系统 CPU 时间,在实际编程当中,根据自己的需要选择。

3.2 示例程序

下面是一个使用clock函数的简单示例:

#include <stdio.h>
#include <time.h>

int main() {
    clock_t start, end;
    double cpu_time_used;
    int i, j;

    start = clock(); // 记录开始时间

    for (i = 0; i < 20000; i++)
        for (j = 0; j < 20000; j++)
            ; // 空操作,用于消耗CPU时间

    end = clock(); // 记录结束时间

    // 计算CPU时间使用量(秒)
    cpu_time_used = (double)(end - start) / CLOCKS_PER_SEC;

    printf("CPU time used: %f seconds\n", cpu_time_used);

    return 0;
}

程序首先记录了程序开始时的CPU时间,然后执行了一些操作,接着记录了结束时的CPU时间。通过计算这两个时间的差值,我们得到了程序占用CPU的总时间,并将其转换为秒。程序运行结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

足球虚拟越位线技术FIFA OT(一)

此系列文章用于记录和回顾开发越位线系统的过程&#xff0c;平时工作较忙&#xff0c;有空时更新。 越位线技术 越位技术已被用于图形化分析足球中潜在的越位情况。 自 2018 年将视频助理裁判 &#xff08;VAR&#xff09; 引入比赛规则以来&#xff0c;人们越来越关注准确确…

力扣 单词规律

所用数据结构 哈希表 核心方法 判断字符串pattern 和字符串s 是否存在一对一的映射关系&#xff0c;按照题意&#xff0c;双向连接的对应规律。 思路以及实现步骤 1.字符串s带有空格&#xff0c;因此需要转换成字符数组进行更方便的操作&#xff0c;将字符串s拆分成单词列表…

ESP32实现UDP连接——micropython版本

代码&#xff1a; import network import socket import timedef wifiInit(name, port):ap network.WLAN(network.AP_IF) # 创建一个热点ap.config(essidname, authmodenetwork.AUTH_OPEN) # 无需密码ap.active(True) # 激活热点ip ap.ifconfig()[0] # 获取ip地址print(…

C++(Python)肥皂泡沫普拉托边界膜曲面模型算法

&#x1f3af;要点 &#x1f3af;肥皂泡二维流体模拟 | &#x1f3af;泡沫普拉托边界膜曲面模型算法演化厚度变化 | &#x1f3af;螺旋曲面三周期最小结构生成 &#x1f4dc;皂膜用例&#xff1a;Python计算物理粒子及拉格朗日和哈密顿动力学 | Python和MATLAB粘性力接触力动…

WordPress中文网址导航栏主题风格模版HaoWa

模板介绍 WordPress响应式网站中文网址导航栏主题风格模版HaoWa1.3.1源码 HaoWA主题风格除行为主体导航栏目录外&#xff0c;对主题风格需要的小控制模块都开展了敞开式的HTML在线编辑器方式的作用配备&#xff0c;另外预埋出默认设置的编码构造&#xff0c;便捷大伙儿在目前…

【python刷题】蛇形方阵

题目描述 给出一个不大于 99 的正整数n&#xff0c;输出n*n的蛇形方阵。从左上角填上1开始&#xff0c;顺时针方向依次填入数字&#xff0c;如同样例所示。注意每个数字有都会占用3个字符&#xff0c;前面使用空格补齐。 输入 输入一个正整数n,含义如题所述 输出 输出符合…

【每日刷题】Day77

【每日刷题】Day77 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 2. LCR 075. 数组的相对排序 - 力…

vue中【事件修饰符号】详解

在Vue中&#xff0c;事件修饰符是一种特殊的后缀&#xff0c;用于修改事件触发时的默认行为。以下是Vue中常见的事件修饰符的详细解释&#xff1a; .stop 调用event.stopPropagation()&#xff0c;阻止事件冒泡。当你在嵌套元素中都有相同的事件监听器&#xff08;如click事件…

Hadoop3:Yarn容量调度器配置多队列案例

一、情景描述 需求1&#xff1a; default队列占总内存的40%&#xff0c;最大资源容量占总资源60%&#xff0c;hive队列占总内存的60%&#xff0c;最大资源容量占总资源80%。 二、多队列优点 &#xff08;1&#xff09;因为担心员工不小心&#xff0c;写递归死循环代码&#…

5.x86游戏实战-CE定位基地址

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;4.x86游戏实战-人物状态标志位 上一个内容通过CE未知的初始值、未变动的数值、…

AI绘画 Stable Diffusion【实战进阶】:图片的创成式填充,竖图秒变横屏壁纸!想怎么扩就怎么扩!

大家好&#xff0c;我是向阳。 所谓图片的创成式填充&#xff0c;就是基于原有图片进行扩展或延展&#xff0c;在保证图片合理性的同时实现与原图片的高度契合。是目前图像处理中常见应用之一。之前大部分都是通过PS工具来处理的。今天我们来看看在AI绘画工具 Stable Diffusio…

利用GPT-4o秒杀100块的开题报告,让你轻松接私活

GPT4o秒杀100块的开题报告 使用网址 https://chatgpt-plus.top/ 需求 文档上传给GPT 让gpt提供下载链接 成品如下&#xff0c;只需要稍微排版即可。 本科毕业设计&#xff08;论文&#xff09;开题报告 1. 选题目的、意义及研究现状 选题目的&#xff1a; 建立一个基于Pyt…

大物3错题整理

平衡位置&#xff1a;在O点上的位置 相位&#xff1a; 当N很大的时候&#xff0c;wxwywz。因此&#xff0c;平均平动动能除以3&#xff0c;就是能量均分定理。 W F在x上的积分 Π时无单位 180&#xff0c;就是单位 1rad&#xff0c;rad就是单位 左手定则、右手定则、安培定…

DDD学习笔记五

模型引力场&#xff1a;聚合 强作用力体现&#xff1a; 某个领域模型是另一些模型存在的前提&#xff0c;没有前者&#xff0c;后者就失去了生存的意义。 一组领域模型之间存在关联的领域逻辑&#xff0c;任何时候都不能违反。 一组领域模型必须以一个完整的、一致的状态呈现给…

魔行观察-烤匠麻辣烤鱼-开关店监测-时间段:2011年1月 至 2024年6月

今日监测对象&#xff1a;烤匠麻辣烤鱼&#xff0c;监测时间段&#xff1a;2011年1月 至 2024年6月 本文用到数据源获取地址 魔行观察http://www.wmomo.com/ 品牌介绍&#xff1a; 2013年&#xff0c;第一家烤匠在成都蓝色加勒比广场开业&#xff0c;随后几年成都国金中心店…

类与对象的创建

1.类是一种抽象的数据类型&#xff0c;他是对某一类事务整体描述/定义&#xff0c;但是并不能代表某一个具体的事物 eg&#xff1a;动物&#xff0c;植物&#xff0c;手机&#xff0c;电脑... Person类&#xff0c;Pet类&#xff0c;Car类&#xff0c;这些类都是用来描述、定义…

VMware17.0 安装过程

VMware17.0 VMware 17.0 是一款功能强大的虚拟机软件&#xff0c;用于在计算机上创建和管理虚拟机。它能够同时运行多个操作系统&#xff0c;如 Windows、Linux 等&#xff0c;并且在这些虚拟机之间提供无缝的切换和共享功能。 VMware 17.0 支持最新的硬件和操作系统&#xf…

Markdown、Latex编辑小工具

Markdown、Latex编辑小工具 文章说明主要代码效果展示源码下载 文章说明 本文主要为了书写Latex的书写风格&#xff0c;以及了解自己实现一个markdown类型的编辑器的过程&#xff1b;目前实现了当前的效果&#xff1b;书写文章进行记录&#xff0c;方便后续查阅 目前还未添加好…

库存管理系统基于spingboot vue的前后端分离仓库库存管理系统java项目java课程设计java毕业设计

文章目录 库存管理系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 库存管理系统 一、项目演示 库存管理系统 二、项目介绍 基于spingboot和vue前后端分离的库存管理系统 功能模块&#xff…

鸿蒙开发设备管理:【@ohos.multimodalInput.inputEventClient (注入按键)】

注入按键 InputEventClient模块提供了注入按键能力。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接口均为系统接口&#xff0c;三方应用不支持调用。 导入模块 import inputEventCli…