clock函数的时间单位_简单的c++时间测量

2023-10-27

在生产系统上面,测量系统的运行性能,定位问题,都会用到一个参考值,就是某段代码对运行时间。这个功能时间也简单,就是在代码的开始位置以及结束位置各去执行一下时间获取的操作,然后求下得到的两个值的差值就能获得,像下面这代码一样

time_t beginTime = time();
func();
time_t endTime = time();
int32_t diff = endTime - beginTime;

逻辑确实非常简单,如果情况都像上面这样,只需要定位到函数粒度的话,问题还是还是相对容易处理的,但是如果要测量的下面这样每个实例代码中每个函数的耗时的话,情况就会相对复杂了,结束测量的埋点需要大量入侵到代码中,像下面这样

void func1(){
     time_t beginTime = time();
     if( func2() ){
        time_t endTime = time();
        int32_t diff = endTime - beginTime;
        return;
    }

     if ( condition ){
        time_t endTime = time();
        int32_t diff = endTime - beginTime;
        throw exception;
     }
     time_t endTime = time();
     int32_t diff = endTime - beginTime;
}

这业务代码还没有埋点代码多。所以,我们需要做一个测量工具,至少需要解决下面两个痛点

  • 自动结束,不管函数是被中间返回还是异常结束
  • 尽量少入侵代码

如果这是在python中,可以做一个包装器来实现,但是c++没法实现包装器,怎么办呢?也许有同学会想到了,就是RAII。

在c++11之前,标准库一直没有提供时间相关的库实现,所以对于这种功能,我们一遍会使用linux的系统调用 gettimeofday() 来完成的,下面给一个简单的实例

#include <sys/time.h>
#include <iostream>
#include <string>

class ScopeTime{
public:
    ScopeTime( const std::string& task ):mTask(task){
        gettimeofday( &mBeginTime, NULL );
    }
    ~ScopeTime(){
        struct timeval endTime;
        gettimeofday( &endTime, NULL );
        std::cout << mTask <<" cost: " 
                  << (endTime.tv_sec-mBeginTime.tv_sec)*1000 + (endTime.tv_usec - mBeginTime.tv_usec)/1000 
                  << " ms" << std::endl;
    }
private:
    std::string mTask;
    struct timeval mBeginTime;
};

int main(){
    ScopeTime st("main");
    do_something();
}

这对于没有系统移植需要,也不介意系统调用开销的应用而言,其实已经足够了,但是如果需要做到跨平台,这个简单封装就没有办法了。不过好在c++11提供了一套时间相关的库 chrono ,这个库包含了不少的功能点,在这里我就不去啰嗦太多了,大家可以自己点链接进去阅读官网,下面我们只是简单展示下怎样用这个库来解决我们时间测量工具不可移植的痛点。

#include <chrono>
#include <string>
using namespace std;
using namespace std::chrono;

class TimeMeasure{
public:
    TimeMeasure( ):m_begin(high_resolution_clock::now()){

    }
    void reset() { m_begin = high_resolution_clock::now(); }

    int64_t elapsed() const
    {
        return duration_cast<chrono::milliseconds>(high_resolution_clock::now() - m_begin).count();
    }

    int64_t elapsed_micro() const
    {
        return duration_cast<chrono::microseconds>(high_resolution_clock::now() - m_begin).count();
    }

    int64_t elapsed_nano() const
    {
        return duration_cast<chrono::nanoseconds>(high_resolution_clock::now() - m_begin).count();
    }

    int64_t elapsed_seconds() const
    {
        return duration_cast<chrono::seconds>(high_resolution_clock::now() - m_begin).count();
    }

    int64_t elapsed_minutes() const
    {
        return duration_cast<chrono::minutes>(high_resolution_clock::now() - m_begin).count();
    }

    int64_t elapsed_hours() const
    {
        return duration_cast<chrono::hours>(high_resolution_clock::now() - m_begin).count();
    }
private:
    time_point<high_resolution_clock> m_begin;
};


class ScopeTime{
public:
    ScopeTime( const std::string& task):mTask(task){ mBegin = Singleton<TimeMeasure>::instance().elapsed(); }
    ~ScopeTime(){
        std::cout << mTask <<" cost: " << Singleton<TimeMeasure>::instance().elapsed() - mBegin << " ms" << std::endl;
    }
private:
    std::string mTask;
    int64_t mBegin;
};

int main(){
    ScopeTime st("main");
    do_something();
}

//Singleton 是一个非入侵的单例的包装类,大家可以自行实现,这里就不贴代码了。
//至于TimeMeasure不以成员变量的形式而是用一个单例呢?这是由于析构时首先会析构成员变量,所以在打印之前,成员变量可能已经被析构了。
//如果还是搞不明白的同学,自行复习c++的基础知识
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

clock函数的时间单位_简单的c++时间测量 的相关文章

  • 内核LED驱动框架讲解以及led设备注册示例代码

    1 驱动框架介绍 1 内核中驱动部分维护者针对每个种类的驱动设计一套成熟的 标准的 典型的驱动实现 然后把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好 再把不同部分留出接口给具体的驱动开发工程师来实现 这就叫驱动框架 2 内核维护者在
  • 涉密服务器 远程,一种具有远程定位功能的涉密移动存储系统及其实现方法专利_专利查询 - 天眼查...

    1 一种具有远程定位功能的涉密移动存储系统 其特征在于 该系统包括定位管理服 务器和移动存储介质 移动存储介质内设置有移动供电模块 定位通信模块 数据销毁模块 和数据存储模块 移动供电模块分别电连接定位通信模块 数据销毁模块和数据存储模块
  • adworld-pwn-level2

    必要知识点 32位系统函数调用使用堆栈传参 其调用时栈的结构如下 返回地址 gt 参数n gt 参数n 1 gt gt 参数1 将elf文件扔到IDA中 跟进到vulnerable函数 里面有输入函数 可以用来做栈溢出 再看到有system
  • 物联网LoRa系列-19:LoRa终端--射频芯片SX1261 SX1262的6种操作模式及其设置

    本文根据SX1261 2芯片手册 阐述SX161 2射频芯片的8种操作模式及其设置 目录 一 MCU与射频芯片之间的操作接口 二 SX1261 2射频芯片的6种工作模式的含义 三 SX1261 2射频芯片工作模式的设置 四 SX1261 2
  • 数组对象找重复值

    对象内容 let empListData lastName lin phone 154393456 lastName lin phone 154393456 lastName lin phone 154393456 找重方法 let new
  • linux-kali利用BeEF 执行 XSS 攻击

    一 配置靶机环境 1 登录win7靶机 2 访问https www xp cn 下载phpstudy软件 下载最新版的就可以 phpstudy软件可以用来进行站点搭建 3 解压后开始安装phpstudy 4 点击启动Apache服务与MyS
  • 关于 QML Tumbler 自定义日历在响应onWheel事件后,其他原有mouse事件无法响应

    程序是在QWidget窗体上嵌套QML 响应触屏和非触屏上面的一些鼠标滚动 滑动功能 在Tumbler下面的MouseArea中 onWheel响应了鼠标滚轮事件后 原来的其他鼠标事件没响应 help 求指点 工程上传到了百度云 链接 ht
  • 修改JAVA环境变量切换JAVA版本不生效问题

    最近因为项目原因 需要在java8和java11环境来回切换 windows切换环境变量没有Linux简单 通过shell脚本操作也会受到环境变量配置的影响 在修改环境变量来切换java版本时也会时不时出现没有生效的问题 一般出现这种问题
  • 2022年浙江省中职组“网络空间安全”赛项模块B--Linux渗透测试

    2022年中职组浙江省 网络空间安全 赛项 B 2 Linux渗透测试 漏洞原理解析 一 竞赛时间 420分钟 共计7小时 吃饭一小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段 单兵模式系统渗透测试 任务一 Wi
  • 万一 Github不让用了,Gitee同步指南请收好

    大家好 我是秋风 最近很多开源项目让一个本该纯粹的地方混入了政治色彩 例如 Node 还有 React 这些超明星级的项目 目前来看 React 的issues 已经沦陷了 大家都在反对一个原本纯粹的地方为什么会有了政治 如果说开源项目涉及
  • 相机 (2)旋转

    1 1 LookAt矩阵 用这3个轴外加一个平移向量来创建一个矩阵 并且你可以用这个矩阵乘以任何向量来将其变换到那个坐标空间 R是右向量 U是上向量 D是方向向量 P是摄像机位置向量 glm LookAt函数需要一个位置 目标和上向量以得到
  • CUDA unknown error - this may be due to an incorrectly set up environment

    运行mmaction2时报错 builtins RuntimeError CUDA unknown error this may be due to an incorrectly set up environment e g changin
  • 最全Arduino控制电机教程说明和资料分享

    1 电机介绍 1 1 作用 电机 gt 电磁感应 电能转化为动能 1 2 电机分类 工作电源 直流电机 DC 交流电机 AC 和交直流两用电机 直流电机分类 有刷直流电机和无刷直流电机 1 3 有刷直流电机模型及工作原理 左手定则 这种情况
  • 一篇文章教会你利用Python网络爬虫实现豆瓣电影采集

    一 项目背景 豆瓣电影提供最新的电影介绍及评论包括上映影片的影讯查询及购票服务 可以记录想看 在看和看过的电影电视剧 顺便打分 写影评 极大地方便了人们的生活 今天以电视剧 美剧 为例 批量爬取对应的电影 写入csv文档 用户可以通过评分
  • (Matlab实现)K-means算法及最佳聚类数目的确定

    目录 摘要 1 K means算法 2 Calinski Harabasz Criterion 卡林斯基 哈拉巴斯指标 CH值 3 Davies Bouldin Criterion 戴维斯 博尔丁指标 DB值 4 Gap Value Gap
  • ChatGPT大流行的思考-设想篇

    在ChatGPT火热当下 我们不妨设想一下它可以应用到我们生活和工作的哪些方面 作者在对ChatGPT有所了解后 从行业 宏观及微观的角度进行设想 积累灵感 并投身到模型建设中 希望对你也有所启发 一 宏观及微观角度的设想 1 宏观角度 行
  • SQL Server远程连接的设置

    SQL Server正常连接时 若不需要远程操控其他电脑 可以用Windows身份验证模式 但是涉及到远程处理时 需要通过SQL Server身份验证登录 具体操作如下 首先 我们在登录时 选择Windows身份验证 然后连接到服务器 图1
  • pip 下载慢——解决方法

    国内源 新版ubuntu要求使用https源 要注意 清华 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun com pypi simple 中国科技大学 http
  • 手把手教你10分钟快速部署Kubernetes集群

    本文介绍的部署过程主要是为了让读者能够理解 K8S 的运行原理 为了简化流程 这里不涉及高可用 高性能等解决方案 安装说明 本文仅仅是在两个节点上部署所有的组件 如图所示包括 MASTER 和 NODE 所有的组件都安装在 opt comp

随机推荐

  • Java程序开发学习之组件及事件处理

    学习参考书 Java2实用教程第5版 一 GUI编程 容器类 Container 和组件类 Component javax swing包中JComponent类是java awt包中Container类的一个直接子类 java awt包中C
  • 虚拟机环境搭建-CentOS篇

    文章目录 VMware Workstation软件安装 略 Linux环境安装 使用CentOS7 环境配置 基本配置 用 Xshell 访问虚拟机 参考文档 VMware Workstation软件安装 略 VMware Workstat
  • kmalloc分配大小的限制

    kmalloc是通过cache来实现的 只不过每次kmalloc的大小不同 因此是从不同的cache中分配 include linux slab h 注意kmalloc是在头文件中定义的 static inline void kmalloc
  • C语言--浮点数的比较

    先说结论 浮点数不能直接用 进行比较 观察代码 看如下代码 分析输出 void testDoubleCompare float a float 0 1 float b float 0 1 float c float 0 1 double d
  • 超炫酷的 Docker 终端 UI lazydocker,想看哪里点哪里

    有开发者开源了一个用于 Docker 和 docker compose 的简单终端 UI lazydocker 才短短几天目前已经收获了 2k star 作者表示记住 Docker 命令很难 并且在多个终端窗口中跟踪容器几乎是不可能的 la
  • loadrunner error:27796解决方法

    使用loadrunner进行web性能测试时 高并发场景以及高性能的服务器 负载机可能导致压测出现大量Error 27796 Failed to connect to server 10 2 9 147 80 10048 服务器ip和端口
  • 树莓派交叉编译(PS交叉编译链下载安装、配置永久环境变量、带WiringPi库交叉编译、软链接)

    目录 一 本章概述 二 交叉编译工具链的下载安装 下载 安装 交叉编译链临时有效 交叉编译链永久有效 三 交叉编译的使用 对比gcc与armgcc PC端交叉编译发送到树莓派运行 四 带WiringPi库的交叉编译如何处理 复制树莓派上的W
  • 解决pytorch中执行图像不显示报错的问题

    num epochs 10 d2l train ch3 net train iter test iter loss num epochs trainer 在图像识别之前改变matplotlib的版本 pip3 uninstall matpl
  • oppo笔试印象

    选择 20道考察了计算机组成中 最先存储 最优存储 最小桶排序 平衡二叉树成功比较次数 检索方法r tree b tree数组 哈希 计算机网络 传输层 第0层 操作系统死锁等 笔试第一题 忘记了 笔试第二题 找规律 第一层循环宏观上遍历6
  • 跟我一起写 Makefile(七)

    跟我一起写 Makefile 七 本文来自于CSDN 陈皓博主 网址http blog csdn net haoel article details 2892 详细内容请参考其经典文章 跟我一起写makefile 陈皓
  • Unity使用c#开发HoloLens2项目(十八)(使用MRTK后点击 Holographic Remoting For Play Mode无反应或Remote Host Port是多少)

    文章目录 成品展示 前言 问题 在unity中Play项目无反应 点击瞬间跳出 1 选择MRTK并进入Holographic Remoting For Play Mode 2 进入远程编辑界面 3 检查IP及端口状态 4 参考GitHub内
  • jquery修改display属性

    jquery修改display属性
  • Spring AOP 详解

    Spring AOP 详解 一 什么是 Spring AOP 二 为何要用 AOP 三 Spring AOP 3 1 AOP 组成 3 1 1 切面 Aspect 3 1 2 连接点 Join Point 3 1 3 切点 Pointcut
  • 初学者使用MyBatis开发步骤详解

    MyBatis开发步骤 1 建表 create table t users id int primary key auto increment name varchar 50 password varchar 50 sex varchar
  • 请谈谈你对Hadoop的理解

    一 请谈谈你对Hadoop的理解 1 Hadoop是什么 What is Hadoop Hadoop是Apache软件基金会的一个开源项目 是一个分布式处理海量数据的软件框架 它为开发者提供了一个分布式系统的基础架构 用户可以在不了解分布式
  • 怎么在局域网中设置共享文件夹?

    在工作中 我们经常会使用到共享文件夹 它能很好的提高我们的工作效率 但是有些小伙伴却并不会设置 下面小编就来用图文为大家讲解一下如何设置共享文件夹 共享文件夹设置方法 1 在需要共享的文件夹上单击鼠标右键 选择 属性 2 在上方选项栏选择共
  • 蓝牙Bluetooth模块介绍

    1 蓝牙模块 基础知识介绍 https blog csdn net wwt18811707971 article details 77833602 2 常见蓝牙模块介绍和AT指令 https blog csdn net qlexcel ar
  • java logback.xml详解

    一 java日志输出演进 0 控制台输出 System out println 1 java标准库内置日志包 java util logging Logger logger Logger getGlobal logger info 局限性
  • 开源软件不等于免费软件(弄清开放源代码许可证很重要)

    转载 https www ramostear com blog 2020 04 09 xfz464y9 html 树下魅狐 似乎提到开源软件 往往给人一种错觉 我拿到了软件源代码 接下来我是不是可以大刀阔斧为所欲为 其实非也 开源软件不等于
  • clock函数的时间单位_简单的c++时间测量

    在生产系统上面 测量系统的运行性能 定位问题 都会用到一个参考值 就是某段代码对运行时间 这个功能时间也简单 就是在代码的开始位置以及结束位置各去执行一下时间获取的操作 然后求下得到的两个值的差值就能获得 像下面这代码一样 time t b