文章目录
1、std::chrono标准时间库
利用CPP强类型的特点,明确区分时间点和时间段,明确区分不同的时间单位。
- 时间点例子:2022年11月8日12点:55分:10秒。
- 时间段例子:1分30秒。
- 时间点类型:chrono::steady_clock::time_point等。
- 时间段类型:chrono::millseconds,chrono::seconds,chrono::minutes等。
- 方便的运算符重载:时间点+时间段=时间点,时间点-时间点=时间段。
示例代码如下:
auto t0=chrono::steady_clock::now(); //获取当前时间点
auto t1=t0+chrono::seconds(30); //当前时间点的30秒后
auto dt=t1-t0; //获取两个时间点的差(时间段)
auto sec=chrono::duration_cast<chrono::seconds>(dt).count(); //时间差的秒数
2、案例:计算花费时间
在所执行的程序未执行时,先通过chrono::steady_clock::now()获取当前时间点,然后执行程序,再通过chrono::steady_clock::now()获取执行程序后的时间点,最后两个时间点相减得到程序所耗费时间段,示例代码如下:
#include<iostream>
#include<thread>
#include<chrono>
//案例:计算花费时间(int类型)
int main()
{
auto startTime = std::chrono::steady_clock::now();
for (int i = 0; i < 10000000; i++);
auto endTime = std::chrono::steady_clock::now();
int dt = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
std::cout << "run time: " << dt << "ms"<<std::endl;
}
测试结果如下:
上面是执行时间段为整形,如下是输出double类型的时间段:
#include<iostream>
#include<thread>
#include<chrono>
//案例:计算花费时间(double类型)
int main()
{
auto startTime = std::chrono::steady_clock::now();
for (int i = 0; i < 10000000; i++);
auto endTime = std::chrono::steady_clock::now();
using double_ms = std::chrono::duration<double, std::milli>;
auto dt = std::chrono::duration_cast<double_ms>(endTime - startTime).count();
std::cout << "run time: " << dt << "ms"<<std::endl;
}
测试结果如下:
注意:duration_cast可以在任意的duration类型之间转换,duration表示用T类型表示,且时间单位用R。R省略不写就代表秒,std::milli就是毫秒,std::micro就是微秒。seconds是duration的类型别名。millseconds是duration< int64_t,std::mill >的类型别名。这里我们创建了double_ms作为duration< double,std::mill>的别名。
3、跨平台sleep:this_thread::sleep_for
可以使用std::this_thread::sleep_for代替Unix操作系统专有的usleep。它可以让当前线程休眠一段时间,然后继续运行,示例代码如下:
#include<iostream>
#include<thread>
#include<chrono>
int main()
{
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cout<<"hello world"<<std::endl;
return 0;
}
这里的休眠单位可以自己指定,比如这里是millseconds表示毫秒,也可以换成microseconds表示微秒,seconds表示秒,chrono的强类型让单位选择更自由,而且chrono时间库的精度更准确。
4、睡到时间点:std::this_thread::sleep_until
除了接受一个时间段sleep_for,还有接受一个时间点的sleep_until,表示让当前线程休眠到某个时间点。示例代码如下:
#include<iostream>
#include<thread>
#include<chrono>
int main()
{
auto t=std::chrono::steady_clock::now()+std::chrono::milliseconds(500);
std::this_thread::sleep_until(t);
return 0;
}