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

目录

1、chrono库函数

2、gettimeofday函数

3、计算时间demo


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

1、chrono库函数

  头文件:#include

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

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

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

///

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

  • 该类型必须满足时钟 (Clock) 要求。

  • 类型 TC::rep 、 TC::duration 及 TC::time_point 满足 可相等比较 (EqualityComparable) 、可小于比较 (LessThanComparable) 、可默认构造 (DefaultConstructible) 、可复制构造 (CopyConstructible) 、可复制赋值 (CopyAssignable) 、可析构 (Destructible) 及数值类型 (NumericType) 的要求。

  • TC::rep 、 TC::duration 及 TC::time_point类型的左值可交换 (Swappable) 。

  • 函数 TC::now() 不抛出异常。

  • 类型 TC::time_point::clock 满足平凡时钟 (平凡时钟 (TrivialClock) ) 的要求,依此递归。

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

  • std::chrono::system_clock
  • std::chrono::steady_clock
  • std::chrono::high_resolution_clock
  • std::filesystem::file_time_type::clock
  • std::chrono::file_clock

///

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

  template> class duration; 

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

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

template 
constexpr ToDuration duration_cast(const std::chrono::duration& d);

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

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

std::chrono::duration - cppreference.com

2、gettimeofday函数

头文件:#include

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 
#include 
#include 

#include 
using namespace std;


int main()
{
    cout << "-----------------  std::chrono ------------------------- " << endl;
    //获得从1971.1.1零时开始的时间戳
    auto ms = chrono::duration_cast(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 t1 = std::chrono::duration_cast(end- start);
    cout << "t1 " <<  t1.count() << endl;

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

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

第一次运行结果如下:

C++ 中chrono与gettimeofday获取时间与计算程序运行时间_第1张图片

 ​​​​第二次运行结果如下C++ 中chrono与gettimeofday获取时间与计算程序运行时间_第2张图片

 第三次运行结果如下

C++ 中chrono与gettimeofday获取时间与计算程序运行时间_第3张图片

由上面几次结果可以看出,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博客

你可能感兴趣的:(C/C++语言,c++,开发语言)