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

news2025/1/19 12:54:49

目录

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.coloradmin.cn/o/1881025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音视频入门基础:H.264专题(7)——FFmpeg源码中 指数哥伦布编码的解码实现

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

【Apache Doris】周FAQ集锦:第 9 期

【Apache Doris】周FAQ集锦&#xff1a;第 9 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

2024 InForSec@BCS网络空间安全国际学术研究交流会,同探网安技术创新与应用前沿

6月6日&#xff0c;2024年InForSecBCS网络空间安全国际学术研究交流会在北京国家会议中心成功举办&#xff0c;线上线下近千人参加了本次研讨会。 本次学术研究交流会主题为“网络安全技术创新与应用前沿”&#xff0c;邀请了国内从事人工智能安全、互联网基础设施安全、电磁安…

APP逆向 day7 JAVA基础2

一.前言 昨天我们讲了点java基础&#xff0c;大家是不是觉得就特别简单&#xff0c;今天讲点稍微难一丢丢的基础&#xff0c;也就是java基础2.0&#xff0c;今天我要和大家说的内容十分的重要&#xff0c;直接关乎到下一节的内容&#xff0c;所以&#xff0c;好好学&#xff0…

Python基础小知识问答系列-随机数相关

1. 问题&#xff1a; 如何生成x-y之间的随机整数&#xff1f; 如何生成0-1之间的随机浮点数&#xff1f; 如何生成x-y之间的随机浮点数&#xff1f; 如何从列表中随机获取一个元素&#xff1f; 如何从列表中随机获取多个元素&#xff1f; 如…

VQVAE:Neural Discrete Representation Learning

论文名称&#xff1a;Neural Discrete Representation Learning 开源地址 发表时间&#xff1a;NIPS2017 作者及组织&#xff1a;Aaron van den Oord,Oriol Vinyals和Koray Kavukcuoglu, 来自DeepMind。 1、VAE 简单回顾下VAE的损失函数&#xff0c;ELBO的下界为&#xff1a; …

qt for android 使用打包sqlite数据库文件方法

1.在使用sqlite数据库时&#xff0c;先将数据库文件打包&#xff0c;放置在assets中如下图: 将文件放置下android中的assets下的所有文件都会打包在APK中&#xff0c;可以用7zip查看apk文件 2.在qt代码读取数据文件&#xff0c;注意在assets下的文件都是Read-Only&#xff0c;需…

初阶数据结构之堆讲解

本篇文章带大家学习的是堆&#xff0c;还请各位观众老爷给个三连 正片开始 堆的概念 如果有一个关键码的集合 K { &#xff0c; &#xff0c; &#xff0c; … &#xff0c; } &#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满…

HarmonyOS开发实战:加密类组件使用方法-API

加密类组件 模块介绍RSA提RSA供生成密钥加解密验签等系列方法(基于HarmonyOS API)AES提供AES生成密钥加解密等系列方法(基于HarmonyOS API)DES提供3DES生成密钥加解密等系列方法(基于HarmonyOS API)SM2提供SM2生成密钥加解密等系列方法(基于HarmonyOS API)SM3提供SM3生成摘要,…

vue 自定义组件 实现跟使用

新建文件组件 选择器作用 ~ 波浪线这个是选择 li 后面的所有 a标签 调用 到使用的文件下引入 使用 效果

类似李跳跳的软件有什么,强烈推荐所有安卓手机安装!!!

今天阿星分享一款让安卓手机更顺滑的神器——智慧岛。你问我李跳跳&#xff1f;由于大家都知道的原因&#xff0c;那是个曾经让广告无处遁形的神兵利器&#xff0c;可惜现在它已经退休了。不过别担心&#xff0c;智慧岛接过了接力棒&#xff0c;继续为我们的安卓体验保驾护航。…

爱情再启:庄国栋笑谈“玫瑰人生”爱情觉悟

庄国栋&#xff0c;这位电视剧《玫瑰的故事》中的男主角&#xff0c; 最近在一次采访中坦言&#xff1a;“如果给我一次重来的机会&#xff0c; 我绝对会毫不犹豫地选择爱情&#xff01;” 听到这话&#xff0c; 我不禁想&#xff0c;庄先生&#xff0c;您是不是被剧里的玫瑰…

42.HOOK引擎核心代码

上一个内容&#xff1a;41.HOOK引擎设计原理 以 40.设计HOOK引擎的好处 它的代码为基础进行修改 主要做的是读写寄存器 效果图 添加一个类 htdHook.h文件中的实现 #pragma once class htdHook { public:htdHook(); };htdHook.cpp文件中的实现&#xff1a; #include "…

Java并发编程基础知识点

目录 Java并发编程基础知识点1、线程&#xff0c;进程概念及二者的关系进程相关概念线程相关概念进程与线程的关系补充小知识点&#xff1a; 2、线程的状态Java线程的状态&#xff1a;Java线程不同状态之间的切换图示 3、Java程序中如何创建线程&#xff1f;①、继承Thread类②…

深入解析Java和Go语言中String与byte数组的转换原理

1.Java String与byte[]互相转换存在的问题 java中&#xff0c;按照byte[] 》string 》byte[]的流程转换后&#xff0c;byte数据与最初的byte不一致。 多说无益&#xff0c;上代码&#xff0c;本地macos机器执行&#xff0c;统一使用的UTF-8编码。 import java.nio.charset.S…

办理河南公司企业信用等级3A证书流程和条件

企业信用等级3A证书属于一种荣誉资质&#xff0c;是提升企业公信力和影响力保障的一项资质。信用等级是信用 (资信)评估机构根据企业资信评估结果对企业信用度划分的等级类别&#xff0c;它反映了企业信用度的高低。AAA信用等级是一种等级划分。代指企业的信用经过行业、机构评…

【Chapter4】汇编语言及其程序设计,《微机系统》第一版,赵宏伟

一、汇编语言概述 **指令&#xff1a;**指使计算机完成某种操作的命令。 **程序&#xff1a;**完成某种功能的指令序列。 **软件&#xff1a;**各种程序总称。 **机器语言&#xff1a;**计算机能直接识别的语言。用机器语言写出的程序称为机器代码。 **汇编语言&#xff1…

【Python】已解决ModuleNotFoundError: No module named ‘tensorflow‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决ModuleNotFoundError: No module named ‘tensorflow‘ 一、分析问题背景 ModuleNotFoundError: No module named ‘tensorflow’ 是一个常见的错误&#xff0c;通常在Pytho…

2024.6.30周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、模型架构 四、文章解读 一、Introduction 二、创新点 三、RBM 四、贪心算法 五、实验 六、结论 二、代码复现 总结 摘要 本周我阅读了一篇题目为Generative Pre-Trained Physics-Informed Neural Netwo…

SA 注册流程

目录 1. UE开机后按照3GPP TS 38.104定义的Synchronization Raster搜索特定频点 2.UE尝试检测PSS/SSS&#xff0c;取得下行时钟同步&#xff0c;并获取小区的PCI&#xff1b;如果失败则转步骤1搜索下一个频点&#xff1b;否则继续后续步骤&#xff1b; 3.解析Mib&#xff0c;…