Android常用C++特性之std::chrono

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。

std::chrono 是 C++11 引入的标准库中的时间处理工具,提供了以多种精度进行时间测量、处理和操作的功能。它允许开发者处理时间点(time_point)和时间间隔(duration),并且支持从高精度(如纳秒)到较大单位(如秒、分钟)的转换。

主要组件

std::chrono 主要由以下几个组件组成:

  1. 时间点 (time_point):表示一个特定的时间。
  2. 时间间隔 (duration):表示两个时间点之间的差异。
  3. 时钟 (clock):用于获取当前时间的工具。

1. duration(时间间隔)

std::chrono::duration 用于表示两个时间点之间的时间差异,可以以不同的时间单位表示,如秒、毫秒、微秒、纳秒等。常见的时间单位有:

  • std::chrono::nanoseconds:以纳秒为单位的时间间隔。
  • std::chrono::microseconds:以微秒为单位的时间间隔。
  • std::chrono::milliseconds:以毫秒为单位的时间间隔。
  • std::chrono::seconds:以秒为单位的时间间隔。
  • std::chrono::minutes:以分钟为单位的时间间隔。
  • std::chrono::hours:以小时为单位的时间间隔。
示例:使用 duration
cpp 复制代码
#include <iostream>
#include <chrono>

int main() {
    std::chrono::seconds sec(1);              // 1 秒
    std::chrono::milliseconds ms = sec;       // 将秒转换为毫秒
    std::chrono::nanoseconds ns = sec;        // 将秒转换为纳秒

    std::cout << "1 second is " << ms.count() << " milliseconds." << std::endl;
    std::cout << "1 second is " << ns.count() << " nanoseconds." << std::endl;

    return 0;
}

2. time_point(时间点)

std::chrono::time_point 用于表示某一时刻的时间点。time_point 通常结合时钟使用,比如 std::chrono::system_clock 或 std::chrono::steady_clock。

示例:使用 time_point
cpp 复制代码
#include <iostream>
#include <chrono>
#include <thread>

int main() {
    // 获取当前时间点
    auto start = std::chrono::steady_clock::now();

    // 模拟一些工作
    std::this_thread::sleep_for(std::chrono::milliseconds(500));

    // 获取结束时间点
    auto end = std::chrono::steady_clock::now();

    // 计算经过的时间
    std::chrono::duration<double> elapsed_seconds = end - start;

    std::cout << "Elapsed time: " << elapsed_seconds.count() << " seconds." << std::endl;

    return 0;
}

3. clock(时钟)

std::chrono 提供了三种常用的时钟类型,用于获取当前时间点:

  1. std::chrono::system_clock:表示系统时间,通常用于获取当前的时间和日期。
  2. std::chrono::steady_clock:表示单调递增的时钟,适用于计算时间间隔,不会被系统时间调整所影响。
  3. std::chrono::high_resolution_clock :表示高精度的时钟,是 steady_clock 或 system_clock 的别名,取决于实现。
示例:使用 system_clock
cpp 复制代码
#include <iostream>
#include <chrono>
#include <ctime>

int main() {
    // 获取系统时间
    auto now = std::chrono::system_clock::now();

    // 将时间点转换为 time_t 类型
    std::time_t current_time = std::chrono::system_clock::to_time_t(now);

    std::cout << "Current time: " << std::ctime(&current_time) << std::endl;

    return 0;
}

4. 时间单位的转换

可以使用 std::chrono::duration_cast 来进行时间单位之间的转换。

示例:单位转换
cpp 复制代码
#include <iostream>
#include <chrono>

int main() {
    std::chrono::seconds sec(1);

    // 将 1 秒转换为毫秒
    std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(sec);

    std::cout << "1 second is " << ms.count() << " milliseconds." << std::endl;

    return 0;
}

5. 测量时间间隔

使用 steady_clock 或 high_resolution_clock 可以精确测量操作的执行时间。

示例:测量操作的执行时间
cpp 复制代码
#include <iostream>
#include <chrono>
#include <thread>

int main() {
    // 开始计时
    auto start = std::chrono::high_resolution_clock::now();

    // 模拟长时间操作
    std::this_thread::sleep_for(std::chrono::seconds(2));

    // 结束计时
    auto end = std::chrono::high_resolution_clock::now();

    // 计算耗时
    std::chrono::duration<double> elapsed = end - start;

    std::cout << "Operation took: " << elapsed.count() << " seconds." << std::endl;

    return 0;
}

总结

  • std::chrono 是 C++11 中提供的时间库,用于处理时间点和时间间隔。
  • 通过 duration 表示时间间隔,time_point 表示时间点。
  • 支持不同精度的时间单位,如纳秒、毫秒、秒等。
  • 提供了三种常用时钟类型:system_clock、steady_clock 和 high_resolution_clock。
  • 提供精确的时间测量和单位转换功能。
相关推荐
沫璃染墨6 分钟前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
wuminyu26 分钟前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
Zguigo1 小时前
【CUDA8】第一个CUDA C++ Kernel --vector add
java·开发语言·c++
-Marks-1 小时前
【C++编程】STL容器(二)--- vector底层模拟实现(常用接口实现 | 扩容机制 | 深浅拷贝 | 迭代器失效)
开发语言·c++·vector·内存管理·迭代器失效·vector底层模拟实现
Shadow(⊙o⊙)2 小时前
C++11并发支持库
开发语言·c++
ShineWinsu2 小时前
对于Redis:主从复制的解析
linux·数据库·c++·redis·缓存·面试·主从复制
无忧.芙桃3 小时前
C++ 并查集详解:原理、实现与应用
c语言·c++·算法·leetcode
智者知已应修善业4 小时前
【51单片机只有一个8*8点阵数据如何滚动起来一片595+一组IO+花样】2022-1-15
c++·经验分享·笔记·单片机·蓝桥杯·硬件架构
水饺编程4 小时前
第1章,[Win32 章节]:Windows 简史
c语言·c++·visual studio
无名猿6 小时前
手写一个线程池:任务队列、工作线程与停止顺序的三个设计点
c++·性能优化·并发编程·现代c++