2506C++,C++的时间库
2.1.std::chrono::system_clock
的用法和示例
取当前时间
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
从time_point
取具体时间
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;
时间运算
std::chrono::system_clock::time_point in_an_hour = std::chrono::system_clock::now() + std::chrono::hours(1);
2.2.std::chrono::steady_clock
的用法和示例
取当前时间
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::steady_clock::duration elapsed = end - start;
转换时间单位
long long elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(elapsed).count();
2.3.std::chrono::high_resolution_clock
的用法和示例
取当前时间
std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
计算经过的时间
std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now();
std::chrono::high_resolution_clock::duration elapsed = end - start;
转换时间单位
long long elapsed_microseconds = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
3
.取时间戳
auto now = std::chrono::system_clock::now();
取当前时间点
的详细日期和时间
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
.时间戳
的转换和应用
按具体日期和时间转换时间戳
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;
转换时间单位
std::chrono::seconds sec(1);
auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(sec);
在实际问题
中应用时间戳
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";
测量性能
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;
记录日志
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);
计算时间戳
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
库实现基本计时器
实现基本计时器
#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
高级计时器功能与实现(如:挂起,重置)
挂起与恢复计时器
#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
创建时长
对象
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
操作时长对象
std::chrono::seconds work_day(8*60*60);//8小时
std::chrono::seconds work_week = 5*work_day;
5.2.1
转换时间单位
std::chrono::milliseconds ms(1000);
std::chrono::seconds sec = std::chrono::duration_cast<std::chrono::seconds>(ms);
5.2.2std::chrono
中的时间单位
std::chrono
库中定义了许多常用的时间单位
,比如:
std::chrono::hours
std::chrono::minutes
std::chrono::seconds
std::chrono::milliseconds
std::chrono::microseconds
std::chrono::nanoseconds
此外,你也可用std::ratio
创建自定义
的时间单位
,比如:
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
的使用示例
#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
的常见操作与示例
加减运算
#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;
}
比较操作
#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
,在实际问题
中的应用示例
分发事件
#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;
}
网络通信的超时控制
#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
创建时长
std::chrono::seconds sec(5);
7.2.2
执行算术运算
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
比较时长
std::chrono::seconds sec1(5);
std::chrono::seconds sec2(3);
if (sec1 > sec2) {//做点什么
}
7.2.4
,按不同单位转换
std::chrono::minutes min(1);
auto sec = std::chrono::duration_cast<std::chrono::seconds>(min);//秒是`60`秒
7.3
时长在实际问题
中的应用示例
7.3.1
计算代码执行时间
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
实现延迟
std::chrono::seconds delay(5);//延迟5秒
std::this_thread::sleep_for(delay);
8.1
.微秒
及其他时间单位
的定义和特性
std::chrono::microseconds microSec(1000);//创建一个表示`1000`微秒的`时长`对象
类似地,可创建其他`时间单位`的实例,如:
std::chrono::seconds sec(60);//创建一个表示`60`秒的`时长`对象
std::chrono::hours hr(1);//创建一个表示1小时的`时长`对象
一些使用std::chrono::microseconds
和其他时长
类型的常见操作的示例:
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
.微秒
及其他时间单位
在实际问题
中的应用示例
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
在模板编程和元模板中的应用
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
在元模板编程中的使用
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
类:
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();}}// ...
};