❝脚步不停,终达卓越!更多优质文章及代码资源详见公众号 《开源519》
在C/C++开发中,测量代码执行时间是性能分析、定时任务或超时检测等场景的常见需求。虽然可以直接调用系统接口实现,但这种方式重复代码多、可维护性差。
高质量的程序员会倾向于将其封装为一个结构清晰、使用直观的类,以提升代码复用性和可读性,同时便于统一管理和功能扩展。面对此类需求,RAII(Resource Acquisition Is Initialization) 原则恰好为设计高效、可靠的计时器提供了理想的理论基础。
RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象。
基于日常开发对于计时器的使用需求,大致如下:
实现起来很简单,主要是在封装上做文章。
RunningTiming.h
#ifndef __RUNNING_TIMING_H__
#define __RUNNING_TIMING_H__
#include <stdint.h>
class RunningTiming
{
public:
RunningTiming();
~RunningTiming();
uint64_t GetElapsedTimeInSec();
uint64_t GetElapsedTimeInMSec();
private:
uint64_t GetCurTimeInMSec();
private:
uint64_t mStartTimeInMSec;
};
#endif // __RUNNING_TIMING_H__
RunningTiming.cpp
#include <time.h>
#include <sys/time.h>
#include "RunningTiming.h"
RunningTiming::RunningTiming()
{
mStartTimeInMSec = GetCurTimeInMSec();
}
RunningTiming::~RunningTiming()
{
}
uint64_t RunningTiming::GetCurTimeInMSec() {
timespec ts;
clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
uint64_t timeInMSec = static_cast<uint64_t>(ts.tv_sec) * 1000 + ts.tv_nsec / 1000000;
return timeInMSec;
}
uint64_t RunningTiming::GetElapsedTimeInSec()
{
uint64_t stopTimeInMsec = GetCurTimeInMSec();
return (stopTimeInMsec - mStartTimeInMSec) / 1000;
}
uint64_t RunningTiming::GetElapsedTimeInMSec() {
uint64_t stopTimeInMsec = GetCurTimeInMSec();
return stopTimeInMsec - mStartTimeInMSec;
}
实现思路
RunningTiming
类在构造时即自动记录起始时间,无需额外调用初始化接口,减少使用步骤,提升易用性。RunningTiming
对象定义开始,到调用 GetElapsedTimexxx
为止的时间跨度,用于统计该时间段内代码的执行耗时。因为对外接口单一,因此使用起来很方便
{
RunningTiming timer;
usleep(100 * 1000); // 休眠 100 毫秒
uint64_t elapsedTime = timer.GetElapsedTimeInMSec();
}
RAII
设计理念非常适合封装独立、无外部依赖的工具类。它能将资源生命周期与对象生命周期绑定,自动管理资源。但需注意:RAII
的前提是初始化必须成功
,若存在外部依赖或失败可能,则不适合使用。用心感悟,认真记录,写好每一篇文章,分享每一框干货。
更多文章内容包括但不限于C/C++、Linux、开发常用神器等,可进入“开源519公众号”聊天界面输入“文章目录” 或者 菜单栏选择“文章目录”查看。公众号后台聊天框输入本文标题,在线查看源码。 在聊天框输入“开源519资料” 获取Linux C/C++ 学习资料书籍。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有