目录
1、chrono库函数
2、gettimeofday函数
3、计算时间demo
在写程序中,我们常常需要计算程序性能(程序性能_百度百科 (baidu.com)),评价程序的性能需要计算程序段的运行时间和程序内存,本文提供以下两种计算程序运行时间。
头文件:#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) ) 的要求,依此递归。
满足该要求的标准库类有下面几个
///
(3)std::chrono::duration:该类表示时间间隔,定义如下:
template
参数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表示要转换的duation,返回值:转换为ToDuration类型时长的d。
上面的知识详细介绍可参考:
std::chrono::duration - cppreference.com
头文件:#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博客
#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;
}
第一次运行结果如下:
第三次运行结果如下
由上面几次结果可以看出,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博客