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

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();}}// ...
};

相关文章:

  • 2025-03-15-位运算
  • 树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
  • Canfestival的移植思想
  • SpringBoot项目报错汇总
  • 磐维数据库的权限使用
  • 7.6 Finetuning the LLM on instruction data
  • SciencePlots——绘制论文中的图片
  • 软件开发和嵌入式开发岗位的面试题
  • PLC入门【7】基本指令的总结(MC、MCR)
  • threadlocal的实现说明
  • Doris “_stream_load“ 方式批量导入数据
  • 使用Ajax从前端向后端发起请求
  • 算法第12天|继续学习二叉树:翻转二叉树、对称二叉树、二叉树最大深度、二叉树的最小深度
  • 铭豹扩展坞 USB转网口 突然无法识别解决方法
  • 蓝奏云(Lanzou Cloud)一款国内知名的免费网盘和文件分享服务 以及蓝奏云的api
  • APM32芯得 EP.10 | 基于APM32F411控制的一个软开关电路设计分享
  • Word-- 制作论文三线表
  • Python 字符串、字节串与编解码:数据转换的奥秘
  • 【Python】 -- 趣味代码 - 扫雷游戏
  • Jaeger开源分布式追踪平台深度剖析(三)Jaeger默认存储Badger原理剖析
  • 淄博网赢网站建设/沈阳网站seo公司
  • 外贸网站建设流程/如何建立自己的网站?
  • 大连网站建设讯息/杭州seo网络推广
  • 惠州专业的免费建站/百度客服电话
  • 那个网站做任务赚钱/批量关键词排名查询工具
  • 网站建设与实训/深圳网络推广外包