C++11 Chrono全面解析
C++11出现了一组新的时间库——Chrono,可以方便进行时间戳计算和时间间隔计算,最高精度可达纳秒级别,比操作系统的时间函数更准确。
Chrono的基本元素
- duration:表示一段时间的长度,由数值和时间单位组成,例如
std::chrono::duration<int, std::ratio<1, 1000>>
表示一段时间长度为整数毫秒,std::chrono::duration<double, std::ratio<1, 10>>
表示一段时间长度为小数秒。 - time_point:表示某个时刻,由一个 duration 和一个特定时间点组成。例如,时钟原点(epoch)固定在1970年1月1日格林威治时间00:00:00。
系统时钟
- system_clock:时间点类型,表示操作系统时间,不一定是稳定的时间点,例如可能受到夏令时等因素的影响。
- steady_clock:时间点类型,表示系统内部稳定的时间点,通常用于衡量代码片段执行的时间。
- high_resolution_clock:时间点类型,提供高精度计时,但其对应的时间点可能不稳定。
示例
下面展示几个示例,说明如何使用Chrono进行时间计算和定时操作。
计算程序执行时间
#include <iostream>
#include <chrono>
int main()
{
auto start = std::chrono::high_resolution_clock::now();
// do some operations
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::nano> elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << " nanoseconds." << std::endl;
return 0;
}
上面的程序通过 high_resolution_clock
来获取程序执行开始和结束时的时间点,然后计算时间间隔,最后输出计算结果。
定时器
#include <iostream>
#include <chrono>
#include <thread>
void foo()
{
std::cout << "Hello, World!" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
std::chrono::seconds interval(1);
auto start = std::chrono::system_clock::now();
while (true)
{
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
if (elapsed_seconds >= interval)
{
foo();
start = end;
}
}
return 0;
}
上面的程序演示了如何使用Chrono实现一个1秒钟循环一次的定时器,每次执行一次 foo
函数,等待1秒钟再继续执行。其中,循环中使用 system_clock
来获取当前时间。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++11 chrono全面解析(最高可达纳秒级别的精度) - Python技术站