C++中std::chrono::duration怎么计算时差

来源:网站主作者:小雨头衔:草根站长
导读:本期聚焦于小伙伴创作的《C++中std::chrono::duration怎么计算时差》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++中std::chrono::duration怎么计算时差》有用,将其分享出去将是对创作者最好的鼓励。

在C++的标准库中,std::chrono::duration是用于表示时间间隔的核心类型,它可以配合std::chrono::time_point完成两个时间点之间时差的计算,同时支持不同时间单位之间的灵活转换,能够满足高精度时间统计的需求。

C++中std::chrono::duration怎么计算时差

std::chrono::duration基础概念

std::chrono::duration是一个模板类,定义形式为template<class Rep, class Period = std::ratio<1>> class duration;,其中Rep是存储时间计数的数值类型,通常是整数或浮点数;Period是表示时间单位的std::ratio类型,用来定义每个计数对应的实际时间长度。

标准库已经预定义了很多常用的duration类型:

  • std::chrono::hours:小时,Period为std::ratio<3600>
  • std::chrono::minutes:分钟,Period为std::ratio<60>
  • std::chrono::seconds:秒,Period为std::ratio<1>
  • std::chrono::milliseconds:毫秒,Period为std::ratio<1, 1000>
  • std::chrono::microseconds:微秒,Period为std::ratio<1, 1000000>
  • std::chrono::nanoseconds:纳秒,Period为std::ratio<1, 1000000000>

计算两个时间点的时差

要计算时差,首先需要获取两个时间点,然后通过时间点相减得到duration对象。时间点的获取通常使用std::chrono::steady_clock或者std::chrono::system_clock的now()方法,其中steady_clock是单调时钟,更适合计算时间间隔,不会受到系统时间调整的影响。

下面是计算时差的基础示例:

#include <iostream>
#include <chrono>
#include <thread>

int main() {
    // 获取开始时间点
    auto start = std::chrono::steady_clock::now();
    
    // 模拟一段耗时操作,休眠1.5秒
    std::this_thread::sleep_for(std::chrono::milliseconds(1500));
    
    // 获取结束时间点
    auto end = std::chrono::steady_clock::now();
    
    // 两个时间点相减得到duration对象,默认单位是steady_clock的时钟周期
    std::chrono::duration<double> elapsed = end - start;
    
    // 输出默认的秒数结果
    std::cout << "耗时(秒): " << elapsed.count() << std::endl;
    
    return 0;
}

上述代码中,end - start的操作会返回一个std::chrono::steady_clock::duration类型的对象,该对象的count()方法可以返回对应的计数值,不过直接输出的数值单位是时钟的周期,通常没有实际意义,需要转换为常用的时间单位。

时间间隔的单位转换

duration之间可以通过std::chrono::duration_cast模板进行显式转换,将获取到的时间间隔转换为我们需要的时间单位。比如将纳秒级的duration转换为毫秒、秒等单位。

单位转换的示例代码如下:

#include <iostream>
#include <chrono>
#include <thread>

int main() {
    auto start = std::chrono::steady_clock::now();
    
    // 模拟耗时操作
    std::this_thread::sleep_for(std::chrono::milliseconds(1234));
    
    auto end = std::chrono::steady_clock::now();
    
    // 获取原始的duration对象
    auto elapsed_raw = end - start;
    
    // 转换为不同的时间单位
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed_raw);
    auto elapsed_s = std::chrono::duration_cast<std::chrono::seconds>(elapsed_raw);
    auto elapsed_us = std::chrono::duration_cast<std::chrono::microseconds>(elapsed_raw);
    
    std::cout << "耗时(毫秒): " << elapsed_ms.count() << std::endl;
    std::cout << "耗时(秒): " << elapsed_s.count() << std::endl;
    std::cout << "耗时(微秒): " << elapsed_us.count() << std::endl;
    
    return 0;
}

需要注意的是,当从高精度单位转换为低精度单位时,会发生截断,比如上述例子中1234毫秒转换为秒会得到1秒,丢失了234毫秒的部分。如果需要保留小数部分,可以使用浮点数类型的duration作为转换目标:

#include <iostream>
#include <chrono>
#include <thread>

int main() {
    auto start = std::chrono::steady_clock::now();
    std::this_thread::sleep_for(std::chrono::milliseconds(1234));
    auto end = std::chrono::steady_clock::now();
    
    auto elapsed_raw = end - start;
    // 转换为浮点秒数,保留小数部分
    auto elapsed_s_float = std::chrono::duration_cast<std::chrono::duration<double>>(elapsed_raw);
    
    std::cout << "耗时(浮点秒): " << elapsed_s_float.count() << std::endl;
    
    return 0;
}

自定义duration类型

除了使用标准库预定义的duration类型,我们还可以根据自己的需求自定义duration,比如定义一个表示1/30秒的类型,适用于帧率统计场景:

#include <iostream>
#include <chrono>

// 自定义duration,30分之一秒为单位
using frame_duration = std::chrono::duration<int, std::ratio<1, 30>>;

int main() {
    // 假设统计60帧的耗时
    frame_duration frames(60);
    // 转换为毫秒
    auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(frames);
    std::cout << "60帧对应的毫秒数: " << ms.count() << std::endl;
    
    return 0;
}

注意事项

  • 计算时间间隔优先使用std::chrono::steady_clock,避免使用system_clock,因为system_clock的时间可能会被用户或系统调整,导致时差计算不准确。
  • 不同duration类型之间的转换必须使用std::chrono::duration_cast,不能直接赋值,否则会出现编译错误。
  • duration的count()方法返回的是存储的计数值,不是实际的时间长度,实际时间长度需要结合Period来计算,比如milliseconds的count()返回的是毫秒数,而seconds的count()返回的是秒数。
  • 如果需要在不同函数之间传递时间间隔,建议传递原始的duration对象,而不是转换后的数值,这样可以保留时间精度,在需要使用的时候再转换为对应的单位。

std::chrono::duration时差计算时间间隔转换C++修改时间:2026-07-05 14:21:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。