2.1.std::chrono::system_clock
的用法和示例
取当前时间
cpp
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
从time_point
取具体时间
cpp
std::time_t tt = std::chrono::system_clock::to_time_t(now);
std::tm* ptm = std::localtime(&tt);
std::cout << "Current time is: " << std::put_time(ptm,"%c") << std::endl;
时间运算
cpp
std::chrono::system_clock::time_point in_an_hour = std::chrono::system_clock::now() + std::chrono::hours(1);
2.2.std::chrono::steady_clock
的用法和示例
取当前时间
cpp
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
计算经过的时间
cpp
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::chrono::steady_clock::duration elapsed = end - start;
转换时间单位
cpp
long long elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(elapsed).count();
2.3.std::chrono::high_resolution_clock
的用法和示例
取当前时间
cpp
std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
计算经过的时间
cpp
std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now();
std::chrono::high_resolution_clock::duration elapsed = end - start;
转换时间单位
cpp
long long elapsed_microseconds = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
3
.取时间戳
cpp
auto now = std::chrono::system_clock::now();
取当前时间点
的详细日期和时间
cpp
auto now = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&t);
取时间戳
的应用
3.2
.时间戳
的转换和应用
按具体日期和时间转换时间戳
cpp
auto now = std::chrono::system_clock::now();
std::time_t t = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&t);
char buffer[80];
std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", now_tm);
std::cout << "Current time: " << buffer << std::endl;
转换时间单位
cpp
std::chrono::seconds sec(1);
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(sec);
在实际问题
中应用时间戳
cpp
auto start = std::chrono::high_resolution_clock::now();
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << "ns\n";
测量性能
cpp
auto start = std::chrono::high_resolution_clock::now();
//代码们
auto stop = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
std::cout << "Time taken by function: " << duration.count() << " microseconds" << std::endl;
记录日志
cpp
auto now = std::chrono::system_clock::now();
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::cout << "Log event happened at " << std::ctime(&now_c);
计算时间戳
cpp
auto t1 = std::chrono::system_clock::now();
//...一些代码...
auto t2 = std::chrono::system_clock::now();
auto duration = t2 - t1;
std::cout << "Duration between t1 and t2: " << duration.count() << " seconds\n";
4
.实现计时器
4.1
使用std::chrono
库实现基本计时器
实现基本计时器
cpp
#include <iostream>
#include <chrono>
int main() {
auto start = std::chrono::high_resolution_clock::now();
//开始计时你需要测量的代码块
auto end = std::chrono::high_resolution_clock::now();
//结束计时
std::chrono::duration<double> diff = endstart;
//计算`时间差`
std::cout << "Code executed in " << diff.count() << " seconds" << std::endl;
return 0;
}
4.2
高级计时器功能与实现(如:挂起,重置)
挂起与恢复计时器
cpp
#include <iostream>
#include <chrono>
class Timer {
private:
bool running;
std::chrono::time_point<std::chrono::high_resolution_clock> start_time, end_time;
public:
Timer() : running(false) {}
void start() {
running = true;
start_time = std::chrono::high_resolution_clock::now();
}
void stop() {
if (running) {
end_time = std::chrono::high_resolution_clock::now();
running = false;
}
}
double elapsed() {
if (running) {
return std::chrono::duration<double>(std::chrono::high_resolution_clock::now() - start_time).count();
}
else {
return std::chrono::duration<double>(end_time - start_time).count();
}
}
void reset() {
running = false;
}
};
int main() {
Timer timer;
timer.start();
//一些代码
timer.stop();
std::cout << "Elapsed time: " << timer.elapsed() << " seconds." << std::endl;
//继续计时器
timer.start();
//一些代码
timer.stop();
std::cout << "Total elapsed time: " << timer.elapsed() << " seconds." << std::endl;
return 0;
}
5
.按通用的时间参数使用std::chrono
5.1std::chrono::duration
的应用
5.1.1
创建时长
对象
cpp
std::chrono::duration<int> twenty_seconds(20);
std::chrono::duration<double, std::ratio<60>> half_a_minute(0.5);
std::chrono::duration<long, std::ratio<1,1000>> one_millisecond(1);
5.1.2
操作时长对象
cpp
std::chrono::seconds work_day(8*60*60);
//8小时
std::chrono::seconds work_week = 5*work_day;
5.2.1
转换时间单位
cpp
std::chrono::milliseconds ms(1000);
std::chrono::seconds sec = std::chrono::duration_cast<std::chrono::seconds>(ms);
5.2.2std::chrono
中的时间单位
std::chrono
库中定义了许多常用的时间单位
,比如:
cpp
std::chrono::hours
std::chrono::minutes
std::chrono::seconds
std::chrono::milliseconds
std::chrono::microseconds
std::chrono::nanoseconds
此外,你也可用std::ratio
创建自定义
的时间单位
,比如:
cpp
using half_seconds = std::chrono::duration<double, std::ratio<1, 2>>;
上面代码中,half_seconds
代表半秒
.
6
.深入探讨std::chrono::system_clock::time_point
6.1.time_point
的定义和主要特性
time_point
的使用示例
cpp
#include <iostream>
#include <chrono>
int main() {
//取当前的`时间点`
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
//按`时间戳`转换并打印
std::time_t now_c = std::chrono::system_clock::to_time_t(now);
std::cout << "当前时间:" << std::ctime(&now_c) << std::endl;
return 0;
}
6.2
.time_point
的常见操作与示例
加减运算
cpp
#include <iostream>
#include <chrono>
int main() {
//取`当前时间点`
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
//创建一个1小时的`时长`对象
std::chrono::hours one_hour(1);
//通过加法运算得到1小时后的`时间点`
std::chrono::system_clock::time_point one_hour_later = now + one_hour;
return 0;
}
比较操作
cpp
#include <iostream>
#include <chrono>
int main() {
//取`当前时间点`
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
//创建一个1秒后的`时间点`
std::chrono::system_clock::time_point one_sec_later = now + std::chrono::seconds(1);
//比较两个`时间点`
if (one_sec_later > now) {
std::cout << "one_sec_later is later than now.\n";
} else {
std::cout << "one_sec_later is not later than now.\n";
}
return 0;
}
6.3
.time_point
,在实际问题
中的应用示例
分发事件
cpp
#include <iostream>
#include <chrono>
#include <thread>
void schedule_event(std::chrono::system_clock::time_point event_time) {
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
if (event_time > now) {
//计算需要等待的时间
std::chrono::duration<double> wait_time = event_time - now;
//等待相应的时间
std::this_thread::sleep_for(wait_time);
}
//执行事件
std::cout << "Event executed at " << std::chrono::system_clock::to_time_t(now) << std::endl;
}
int main() {
//分发在5秒后执行事件
std::chrono::system_clock::time_point event_time = std::chrono::system_clock::now() + std::chrono::seconds(5);
schedule_event(event_time);
return 0;
}
网络通信的超时控制
cpp
#include <iostream>
#include <chrono>
#include <thread>
bool try_connect(std::chrono::system_clock::time_point deadline) {
while (std::chrono::system_clock::now() < deadline) {
//试连接
bool success = false;
//这里只是示例,实际应用中需要调用具体的连接函数
if (success) {
return true;
}
//等待然后再试
std::this_thread::sleep_for(std::chrono::seconds(1));
}
//超时,连接失败
return false;
}
int main() {
//试在`10`秒内创建连接
std::chrono::system_clock::time_point deadline = std::chrono::system_clock::now() + std::chrono::seconds(10);
bool connected = try_connect(deadline);
if (connected) {
std::cout << "Connected.\n";
} else {
std::cout << "Failed to connect within 10 seconds.\n";
}
return 0;
}
7
.深入探讨std::chrono::duration
7.2.1
创建时长
cpp
std::chrono::seconds sec(5);
7.2.2
执行算术运算
cpp
std::chrono::seconds sec1(5);
std::chrono::seconds sec2(3);
auto sec3 = sec1 + sec2;
//`sec3`为8秒
auto sec4 = sec1 - sec2;
//`sec4`为2秒
7.2.3
比较时长
cpp
std::chrono::seconds sec1(5);
std::chrono::seconds sec2(3);
if (sec1 > sec2) {
//做点什么
}
7.2.4
,按不同单位转换
cpp
std::chrono::minutes min(1);
auto sec = std::chrono::duration_cast<std::chrono::seconds>(min);
//秒是`60`秒
7.3
时长在实际问题
中的应用示例
7.3.1
计算代码执行时间
cpp
auto start = std::chrono::high_resolution_clock::now();
//要测量的代码...
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> diff = endstart;
std::cout << "Code executed in " << diff.count() << " seconds\n";
7.3.2
实现延迟
cpp
std::chrono::seconds delay(5);
//延迟5秒
std::this_thread::sleep_for(delay);
8.1
.微秒
及其他时间单位
的定义和特性
cpp
std::chrono::microseconds microSec(1000);
//创建一个表示`1000`微秒的`时长`对象
类似地,可创建其他`时间单位`的实例,如:
std::chrono::seconds sec(60);
//创建一个表示`60`秒的`时长`对象
std::chrono::hours hr(1);
//创建一个表示1小时的`时长`对象
一些使用std::chrono::microseconds
和其他时长
类型的常见操作的示例:
cpp
std::chrono::microseconds usec1(1000);
std::chrono::microseconds usec2(2000);
//加法
auto usec3 = usec1 + usec2;
//`usec3`现在是`3000`微秒减法
auto usec4 = usec2 - usec1;
//`usec4`现在是`1000`微秒乘法
auto usec5 = 2 * usec1;
//`usec5`现在是`2000`微秒除法
auto half = usec1 / 2;
//`half`现在是`500`微秒比较
if (usec1 < usec2) {
//该条件是真,因为`1000`微秒小于`2000`微秒
}
8.3
.微秒
及其他时间单位
在实际问题
中的应用示例
cpp
std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
//处理音频或视频帧...
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::chrono::microseconds processing_time = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
第九章:std::chrono
在模板编程和元模板中的应用
cpp
template <typename T>
void print_duration(T d) {
auto value = std::chrono::duration_cast<std::chrono::microseconds>(d).count();
std::cout << "Duration: " << value << " microseconds\n";
}
template <typename T>
class Timer {
public:
void start() {
start_time = std::chrono::steady_clock::now();
}
T elapsed() {
auto end_time = std::chrono::steady_clock::now();
return std::chrono::duration_cast<T>(end_time - start_time);
}
private:
std::chrono::steady_clock::time_point start_time;
};
9.2std::chrono
在元模板编程中的使用
cpp
template <typename FromDuration, typename ToDuration>
struct duration_converter {
static constexpr double ratio =
double(ToDuration::period::num) / FromDuration::period::num *
double(FromDuration::period::den) / ToDuration::period::den;
static ToDuration convert(FromDuration d) {
return ToDuration(static_cast<long long>(d.count() * ratio));
}
};
9.3
模板编程和元模板编程中std::chrono
的高级应用示例
本例中,可定义一个可根据当前的std::chrono::duration
应用不同特效
的EffectController
类:
cpp
template <typename T>
class EffectController {
public:
void applyEffect(T duration) {
if (duration < std::chrono::seconds(10)) {
applyMorningEffect();
} else if (duration < std::chrono::seconds(20)) {
applyNoonEffect();
} else {
applyNightEffect();
}
}
private:
void applyMorningEffect() {
//应用晨间效果...
}
void applyNoonEffect() {
//应用正午效果...
}
void applyNightEffect() {
//应用夜间效果...
}
};
template <typename T, typename Ratio>
class EffectController {
public:
void applyEffect(T duration) {
constexpr auto switch_point = std::chrono::duration<int, Ratio>(1);
if (duration < switch_point) {
applyMorningEffect();
} else if (duration < 2 * switch_point) {
applyNoonEffect();
} else {
applyNightEffect();
}
}
// ...
};