当前位置: 首页 > backend >正文

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();}}// ...
};
http://www.xdnf.cn/news/13274.html

相关文章:

  • 搭建本地瓦片地图服务器的完整指南
  • 脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
  • SCAU期末笔记 - 数据分析与数据挖掘题库解析
  • 使用 ML.NET Model Builder 训练机器学习模型进行预测性维护
  • 60天python训练计划----day50
  • 连锁超市冷库节能解决方案:如何实现超市降本增效
  • spring中的ImportSelector接口详解
  • 《高等数学》(同济大学·第7版)第四章第一节不定积分的概念与性质
  • 微软PowerBI考试 PL300-在 Power BI 中设计语义模型 【附练习数据】
  • C++11列表初始化:从入门到精通
  • Python学习(8) ----- Python的类与对象
  • 用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
  • LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
  • OpenGL-什么是软OpenGL/软渲染/软光栅?
  • 【求出100~500之间所有每位数的乘积大于每位数的和的数。】2022-4-16
  • c语言(持续更新)
  • 第三章支线四 ·事件风暴 · 时序与响应的协奏
  • LangGraph 深度解析:下一代AI应用编排引擎
  • 五大主流多智能体框架分析
  • DAY 26 函数专题1
  • 如何在Shopify中集成API
  • break 语句和 continue 语句
  • 基于ThinkPHP8.*的后台管理框架--Veitool框架学习使用
  • 免费批量抠图工具使用说明
  • OD 算法题 B卷【最大岛屿体积】
  • Day1 java基础知识
  • raid存储技术
  • vs code无法ssh远程连接linux机器----解决方案
  • BugKu Web渗透之程序员本地网站
  • MQTT示例体验(C)