在完成 *nix环境下的串口通信 时, 遇到了一些并行上的问题,于是尝试使用高精度计时器,来计算等待各个锁的时间,以进行进一步的分析,于是用到了 std::chrono 库,这个库是 C++11 标准后,提供与时间相关对象的库,用法如下.(终于不用考虑平台相关的API了!)
1 2 3 4 5 6 7 8 |
auto start = std::chrono::high_resolution_clock::now(); //system_clock以外的另一个高精度clock //不过在某些平台跟system_clock是一样的 //某些耗时的操作 auto end = std::chrono::high_resolution_clock::now(); auto span = end - start; printf("Duration:%lld", std::chrono::duration_cast<std::chrono::microseconds>(span).count()); |
在这个库中,比较核心的是 std::chrono::time_point 和 std::chrono::duration 两个类型,分别用于描述一个确定的时间点(一段时间的间隔(std::chrono::duration)与一个恒定的时钟基准(如 std::chrono::system_clock)结合,便成为了时间点),与一段时间(可以是两个时间点之间的差).
围绕着这两个核心的类型, std::chrono 还提供了一些时间转换常用的辅助工具,如 std::chrono::time_point 之间的减法(大概因为只有减法是有意义的吧) 以及对 std::chrono::duration 的加减乘除求余的运算,以及不同单位的互相转换(std::chrono::duration_cast),互相对比(运算符重载).
而在 C++14 以后,还加入了描述时间的文法,就像下面那样:
1 2 3 4 |
using namespace std::chrono_literals; std::chrono::seconds life; for (;;) life += 1s;//min,h之类的也同样可以 |
PS:另一个接触的原因,就是 std::condition_variable 之类的许多地方也都使用 std::chrono::duration 来描述时间.
PS2:依然是f7(eiki)哇!
PS3: std::chrono 里的那些类型都可以指定实际存储时间的类型(long long uint之类的感觉),不过有对于s必须用至少35位长度的数据类型 之类的限制!
PS4: std::chrono::steady_clock 也是一个特殊的clock,不过不保证每次程序启动时间的起点是一致的,不过更适合时间间隔的获取.
PS5:之前的字节流缓冲区…因为线程同步问题…出现了点挫折,得再试试(T T)