C++ 中chrono与gettimeofday获取时间与计算程序运行时间

目录

1、chrono库函数

2、gettimeofday函数

3、计算时间demo


       在写程序中,我们常常需要计算程序性能(程序性能_百度百科 (baidu.com)),评价程序的性能需要计算程序段的运行时间和程序内存,本文提供以下两种计算程序运行时间。

1、chrono库函数

  头文件:#include <chrono>

   chrono是C++11增加的库文件,chrono中定义了很多时钟类。用于计算的常用时钟类如下:

(1)std::chrono::stdeay_clock:该类是单调时钟,时间点无法减少,随着物理时间向前移动。

(2)std::chrono::system_clock:该类是系统范畴类的时钟,可以在任何时候被调节。

///

上述两个类都满足TrivialClock要求,该要求如下:

满足该要求的标准库类有下面几个

///

(3)std::chrono::duration:该类表示时间间隔,定义如下:

  template<class Rep,class Period = std::ratio<1>> class duration; 

参数Rep表示计次数的算数类型,参数Period表示计次周期的 std::ratio (即每次的秒数)。默认是1个周期1s。

(4)std::chrono::duation_cast:该类将std::chrono::duration转换成不同类型ToDuraition的时长。定义如下:

template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const std::chrono::duration<Rep,Period>& d);

参数d表示要转换的duation,返回值:转换为ToDuration类型时长的d。

上面的知识详细介绍可参考:

std::chrono::duration - cppreference.com

2、gettimeofday函数

头文件:#include <sys/time.h>

gettimeofday函数定义如下:

int gettimeofday(struct timeval *tv, struct timezone *tz);

timeval为获取的当前时间信息,定义如下:
struct timeval
{
  __time_t tv_sec;		    /* 秒.  */
  __suseconds_t tv_usec;	/* 微秒.  */
};

timezone为时区,为nullptr时默认当前系统的时区,定义如下:
struct timezone
  {
    int tz_minuteswest;		/*格林威治时间往西方的时差  */
    int tz_dsttime;		   /* Nonzero if DST is ever in effect.  */
 };

关于gettimeofday的介绍参考如下:

C/C++获取时间方法:gettimeofday()_c++ gettimeofday_ShomyLiu的博客-CSDN博客

gettimeofday函数与时区的关系 & 时区的修改_gettimeof获取的时间与时区有关吗_正在起飞的蜗牛的博客-CSDN博客

3、计算时间demo

#include <iostream>
#include <chrono>
#include <thread>

#include <sys/time.h>
using namespace std;


int main()
{
    cout << "-----------------  std::chrono ------------------------- " << endl;
    //获得从1971.1.1零时开始的时间戳
    auto ms = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch());
    cout << ms.count() << endl;;

    auto start = std::chrono::steady_clock::now();
    std::this_thread::sleep_for(std::chrono::milliseconds(5));  //计时5毫秒
    auto end  = std::chrono::steady_clock::now();

    //方法1: std::chrono::duration默认周期1s
    std::chrono::duration<double> t1 = std::chrono::duration_cast<std::chrono::microseconds>(end- start);
    cout << "t1 " <<  t1.count() << endl;

    //方法2:std::chrono::duration默认周期1s
    auto t2 = std::chrono::duration_cast<std::chrono::duration<double>>(end- start).count();
    cout << "t2 " <<  t2 << endl;

    //方法3: std::chrono::duration周期ratio<1, 1000000>  推荐方法
    auto t3 = std::chrono::duration_cast<std::chrono::duration<double,std::micro>>(end- start).count();
    cout << "t3 " <<  t3 << endl;
    
    //方法4: std::chrono::duration周期ratio<1, 1000000>  推荐方法
    double t4 = std::chrono::duration<double,std::micro>(end-start).count();
    cout << "t4 " <<  t4 << endl;

    
    cout << "\n----------------- gettimeofday ------------------------- " << endl;
    //精度小于chrono
    struct timeval start1;
    struct timeval end1;
    gettimeofday(&start1,nullptr);
    std::this_thread::sleep_for(std::chrono::milliseconds(5));  //计时5毫秒
    gettimeofday(&end1,nullptr);

    //方法5: 推荐方法
    float useTime = 0;
    useTime = end1.tv_sec * 1000000 + end1.tv_usec - start1.tv_sec * 1000000 - start1.tv_usec;
    cout << "useTime " << useTime << endl;
    return 0;
}

第一次运行结果如下:

 ​​​​第二次运行结果如下

 第三次运行结果如下

由上面几次结果可以看出,std::chrono和gettimeofday都属于高精度的时间计算方法,不过两者都有波动。

//秒与其他时间单位关系
1s = 1 000                 ms  毫秒
1s = 1 000 000             us  微秒
1s = 1 000 000 000         ns  纳秒
1s = 1 000 000 000 000     ps  皮秒

附加:

1、其他计算时间的方法可参考:

Linux之获取系统时间(time函数、gettimeofday函数)_linux获取当前日期时间_夹心狗勾的博客-CSDN博客

2、std::this_thread::sleep_for精度

Windows下std::this_thread:sleep_for()休眠精度问题_std::this_thread::sleep_for_海将河推走的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值