C++工具:显示时间函数-计算函数运行时间

文章介绍了两个C++工具,ctimel和ctimes,用于计算和显示函数执行时间以及实时时间。ctimel专注于函数运行时间的测量,提供纳秒级精度,支持多点时间记录和显示。ctimes则用于打印可视化时间,支持自定义格式化输出。通过示例代码展示了如何使用这两个工具进行性能测试和时间戳的存储与打印。
摘要由CSDN通过智能技术生成
//!
//! C++工具: 显示时间函数-计算函数运行时间
//!
//! ===== 工具简介 =====
//! 简单的时间显示工具,来之C++11的时间库
//!     ctimel : 打印时间间隔,主要用于计算函数运行的时间
//!     ctimes : 打印可视化时间,用于显示现在的时间,支持格式化输出
//! ===== 工具简介 =====
//!
//! 结束语:
//!     ctimel.h文件已经附录在文章最后
//!
#include "../include/ctimel.h"
#include <iostream>

using namespace std;

void test_1()
{
    cout<<"===== test_1 ====="<<endl;

    auto func = [](){
        for(int i=0;i<10000;i++)
            for(int i=0;i<10000;i++){}
    };

    //创建临时区域,等待退出时打印
    {
        cout<<"===== 一次计算 ====="<<endl;
        ctimel tm;
        func();
    }
    {
        cout<<"===== 更新时间 ====="<<endl;
        ctimel tm;

        func();
        tm.show();
        tm.update();

        func();
        tm.show();
        tm.update();

        func();
        tm.show();
        tm.update();
    }
    {
        cout<<"===== 保存时间点等待未来打印 ====="<<endl;
        ctimel tm;

        func();
        auto s1 = tm.to_point();

        func();
        auto s2 = tm.to_point();

        cout<<"paint: "<<tm.to_string(s1)<<endl;
        cout<<"paint: "<<tm.to_string(s2)<<endl;
    }
    {
        cout<<"===== 多点时间测试 ====="<<endl;
        ctimel tm;

        func();
        tm.add_point();

        func();
        tm.add_point();

        func();
        tm.add_point();

        func();
        tm.add_point();

        tm.show_vec();
    }
    {
        cout<<"===== 多点时间测试并每次重新计时 ====="<<endl;
        ctimel tm;

        func();
        tm.add_point_re();

        func();
        tm.add_point_re();

        func();
        tm.add_point_re();

        func();
        tm.add_point_re();

        tm.show_vec();
    }
    {
        cout<<"===== 人类可视化时间:ctimes ====="<<endl;
        ctimes ct;
        cout<<ct.to_now()<<endl;
        cout<<ct.to_now("%H:%M:%S")<<endl; //自定义打印格式

        //保留时间点并在未来打印
        time_t t1 = ct.time_now();
        cout<<ct.to_format(t1)<<endl;
    }
}

int main()
{
    cout<<"===== begin ====="<<endl;
    test_1();

    cout<<"===== end ====="<<endl;
    return 0;
}


/*
 * 计算函数时间测试结果:
 *
===== begin =====
===== test_1 =====
===== 一次计算 =====
[nan: 288974927|mic: 288974|mil: 288|sec: 0]
===== 更新时间 =====
[nan: 291067824|mic: 291067|mil: 291|sec: 0]
[nan: 287929075|mic: 287929|mil: 287|sec: 0]
[nan: 287614887|mic: 287614|mil: 287|sec: 0]
[nan: 866809334|mic: 866809|mil: 866|sec: 0]
===== 保存时间点等待未来打印 =====
paint: [nan: 288384552|mic: 288384|mil: 288|sec: 0]
paint: [nan: 576289512|mic: 576289|mil: 576|sec: 0]
[nan: 576362262|mic: 576362|mil: 576|sec: 0]
===== 多点时间测试 =====
[nan: 304235552|mic: 304235|mil: 304|sec: 0]
[nan: 591549148|mic: 591549|mil: 591|sec: 0]
[nan: 878842238|mic: 878842|mil: 878|sec: 0]
[nan: 1166150134|mic: 1166150|mil: 1166|sec: 1]
[nan: 1166241424|mic: 1166241|mil: 1166|sec: 1]
===== 多点时间测试并每次重新计时 =====
[nan: 287540339|mic: 287540|mil: 287|sec: 0]
[nan: 286082889|mic: 286082|mil: 286|sec: 0]
[nan: 286608348|mic: 286608|mil: 286|sec: 0]
[nan: 286342874|mic: 286342|mil: 286|sec: 0]
[nan: 1146695529|mic: 1146695|mil: 1146|sec: 1]
===== 人类可视化时间:ctimes =====
2023-06-08 21:01:01
21:01:01
2023-06-08 21:01:01
===== end =====
*/
//!
//! ctimel.h
//!
#ifndef CTIMEL_H
#define CTIMEL_H

//!
//! C++工具: 显示时间函数-计算函数运行时间
//!
//! ===== 工具简介 =====
//! 简单的时间显示工具,来之C++11的时间库
//!     ctimel : 打印时间间隔,主要用于计算函数运行的时间
//!     ctimes : 打印可视化时间,用于显示现在的时间,支持格式化输出
//! ===== 工具简介 =====
//!
#include <iostream>
#include <chrono>
#include <vector>

using namespace std::chrono;

//!
//! 功能:打印时间间隔
//!
//! 说明:主要用于计算函数运行的时间,测试函数性能
//!         steady_clock时间:精确到纳秒的均速时间
//! 原理:构建对象时开始计时,析构时打印时间
//!
//! 例子:
//!     {
//!         ctimel tm;
//!         func();
//!     } //到这里析构退出并打印时间
//!
class ctimel
{
public:
    ctimel() { _pass = steady_clock::now(); _begin = _pass; }
    ~ctimel() { nanoseconds loss = steady_clock::now() - _pass; show_point(loss); }

    inline nanoseconds to_point()
    {
        nanoseconds loss = steady_clock::now() - _begin;
        return loss;
    }

    inline std::string to_string(const nanoseconds &loss)
    {
        //顺序 [纳秒|微秒|毫秒|秒]
        std::string str =
                "[nan: " + std::to_string(loss.count()) +
                "|mic: " + std::to_string(duration_cast<microseconds>(loss).count()) +
                "|mil: " + std::to_string(duration_cast<milliseconds>(loss).count()) +
                "|sec: " + std::to_string(duration_cast<seconds>(loss).count()) +
                "]";
        return str;
    }

    inline void show_vec()
    {
        for(auto a:_vec)
        { std::cout<<to_string(a)<<std::endl; }
    }

    inline void show_point(const nanoseconds &loss) { std::cout<<to_string(loss)<<std::endl; }
    inline void show() { show_point(to_point()); }
    inline void update() { _begin = steady_clock::now(); }
    inline void add_point() { _vec.push_back(to_point()); }
    inline void add_point_re() { _vec.push_back(to_point()); update(); }

protected:
    time_point<steady_clock,nanoseconds> _begin;    //用于计算上一个时间点
    time_point<steady_clock,nanoseconds> _pass;     //计算生存时间,析构时打印
    std::vector<nanoseconds> _vec;                  //多点打印记录
};


//!
//! 功能:显示可视化的时间
//!
class ctimes
{
public:
    //现在的时间点-可视化
    std::string to_now(const std::string &format = "%Y-%m-%d %H:%M:%S")
    {
        char ret[64];
        time_t t = system_clock::to_time_t(system_clock::now());
        strftime(ret,sizeof(ret),format.c_str(),localtime(&t));
        return ret;
    }

    //格式化时间-可视化
    std::string to_format(const time_t &t,
        const std::string &format = "%Y-%m-%d %H:%M:%S")
    {
        char ret[64];
        strftime(ret,sizeof(ret),format.c_str(),localtime(&t));
        return ret;
    }

    time_t time_now(){ time_t t; return time(&t); }; //当前时间
};
//===== ctimel =====

#endif // CTIMEL_H

(1) 测试日期类成员函数,在主函数中列出菜单选项,可以完成日期的加减比较等测试功能。 (2) 完善程序功能,在日期相加的菜单选项中增加日期加天数,结果为新日期;日期家月份,结果为新日期,要考虑闰年情况。 (3) 完善程序功能,在日期相减的菜单选项中增加日期减天数,结果为新日期;日期减月份,结果为新日期,要考虑闰年情况。 (4) 显示日期时增加显示星期及英文形式的月份的功能。 (5) 增加输入的甄别功能,即输入非法数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。 (1) 仿照日期类编写时间类CTime_t,可以完成时间的设置、运算、比较等功能。 (2) 增加时间的输入功能,既可以选择输入格式,可以输入hh:mm:ss格式的信息。 (3) 增加时间的输出格式,可以输出12小时的时间格式。 (4) 编写时间和日期的派生类CDati,完成日期与时间的联合设置、运算、比较等功能,要求该派生类可以完成:日期时间加天数或时间等于新的日期时间,日期时间减天数或等于新的日期时间,两个日期时间相减等于天数或时间等工作,在程序中考虑闰年等具体情况,并重载各种运算符。 (5) 增加输入的甄别功能,即输入非法数据,即输入非法数据(如负数、日期超过31天、时间超过24小时等情况)的识别显示功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值