基于C++实现高精度计时器

 更新时间:2024年02月04日 11:06:12   作者:草上爬  
chrono是C++ 11中的时间库,它提供了跨平台的高精度时钟解决方案,精确到纳秒级,本文主要为大家详细介绍了如何使用chrono实现高精度计时器,感兴趣的可以了解下

在调试程序的时候,有时需要知道程序语句执行的耗时。特别是比较算法性能的时候,对耗时的精度要求较高。chrono是C++ 11中的时间库,它提供了跨平台的高精度时钟解决方案,精确到纳秒级。

一.时间点和时钟

chrono库头文件中所有函数与类模板均定义在std::chrono命名空间中;

这里主要介绍时间点和时钟两个概念:

一般计时器就是从某个时间点开始,然后到某个时间点之间的计数,就是我们一般称之为耗时。

1.时间点

template <class Clock, class Duration = typename Clock::duration> class time_point;

std::chrono::time_point 表示一个具体时间。

第一个模板参数Clock用来指定所要使用的时钟,在标准库中有三种时钟,分别为:

● system_clock:当前系统范围(即对各进程都一致)的一个实时的日历时钟(wallclock)

● steady_clock:当前系统实现的一个稳定时钟,该时钟的每个时间嘀嗒单位是均匀的(即长度相等)

● high_resolution_clock:当前系统实现的一个高分辨率时钟。

第二个模板函数参数用来表示时间的计量单位(特化的std::chrono::duration<> )

时间点都有一个时间戳,即时间原点。chrono库中采用的是Unix的时间戳1970年1月1日 00:00。所以time_point也就是距离时间戳(epoch)的时间长度(duration)。

2.时钟

下面用demo测试一下上面三种时钟的精度

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main()
{
    cout << "system clock          : ";
    cout << system_clock::period::num << "/" << system_clock::period::den << " s" << endl;
    cout << "steady clock          : ";
    cout << steady_clock::period::num << "/" << steady_clock::period::den << " s" << endl;
    cout << "high resolution clock : ";
    cout << high_resolution_clock::period::num << "/"
         << high_resolution_clock::period::den << " s" << endl;
 
    return 0;
}

可以看到在我的电脑上,这三种时钟的精度是一样的,都是1纳秒。但一般来说system_clock的精度是100纳秒,而high_resolution的精度是1纳秒,对于程序来说,一般微秒级就够了,所以说chrono提供的时钟精度绰绰有余。

二.计时器的实现

#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
class HighResolutionClock
{
public:
    HighResolutionClock()
    {
        update();
    }
 
    ~HighResolutionClock()
    {
 
    }
 
    void update()
    {
        m_start = high_resolution_clock::now();
    }
    // 秒
    double getSecond()
    {
        return getMicroSec() * 0.000001;
    }
    // 毫秒
    double getMilliSec()
    {
        return getMicroSec()*0.001;
    }
    // 微妙
    long long getMicroSec()
    {
        // 如果你愿意,也可以用nanoseconds获取纳秒,其实微秒已经够用了
        return duration_cast<microseconds>(high_resolution_clock::now() - m_start).count();
    }
 
private:
    time_point<high_resolution_clock> m_start;
 
};
 
int main(int argc, char *argv[])
{
    HighResolutionClock hrClock;
    int sum = 0;
    hrClock.update();
 
    for (int i = 0; i < 100000; i++)
    {
        sum++;
    }
 
    cout << "cost time: " << hrClock.getMilliSec() <<" ms"<< endl;
    cout << "cost time: " << hrClock.getMicroSec() <<" us" << endl;
    return 0;
 
}

到此这篇关于基于C++实现高精度计时器的文章就介绍到这了,更多相关C++计时器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈c++ 预处理器

    浅谈c++ 预处理器

    这篇文章主要介绍了c++ 预处理器的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C++回调函数的理解和使用教程

    C++回调函数的理解和使用教程

    这篇文章主要给大家介绍了关于C++回调函数的理解和使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C语言实现BMP图像边缘检测处理

    C语言实现BMP图像边缘检测处理

    这篇文章主要为大家详细介绍了C语言实现BMP图像边缘检测处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C语言单链表实现图书管理系统

    C语言单链表实现图书管理系统

    这篇文章主要为大家详细介绍了C语言单链表实现图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言实现学生成绩管理系统实战教学

    C语言实现学生成绩管理系统实战教学

    在本篇文章里小编给大家分享了关于C语言实现学生成绩管理系统实战教学内容,有兴趣的朋友们可以跟着学习参考下。
    2019-01-01
  • C++ auto类型说明符

    C++ auto类型说明符

    在C++11中引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。当然,auto变量必须有初始值,这样编译器才能推断其类型
    2016-03-03
  • C语言实现简单扫雷游戏

    C语言实现简单扫雷游戏

    这篇文章主要为大家详细介绍了C语言实现简单扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 全面解析设计模式中的建造者模式及相关C++实现

    全面解析设计模式中的建造者模式及相关C++实现

    这篇文章主要介绍了设计模式中的建造者模式及相关C++实现,需要的朋友可以参考下
    2016-03-03
  • C++11中跳转initializer_list实现分析

    C++11中跳转initializer_list实现分析

    这篇文章主要介绍了C++11中跳转initializer_list实现分析,实例分析initializer_list<T>初体验,结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    这篇文章主要介绍了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以参考下
    2017-04-04

最新评论