基于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++实现json形式的Socket传输图片

    C++实现json形式的Socket传输图片

    这篇文章主要为大家详细介绍了C++实现json形式的Socket传输图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 详解OpenMP的线程同步机制

    详解OpenMP的线程同步机制

    在本篇文章当中主要给大家介绍 OpenMP 当中线程的同步和互斥机制,在 OpenMP 当中主要有三种不同的线程之间的互斥方式。下面就来和大家来讨论一下OpenMP当中的互斥操作,需要的可以参考一下
    2023-01-01
  • C++中函数指针详解及代码分享

    C++中函数指针详解及代码分享

    这篇文章主要介绍了C++中函数指针详解及代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • C字符串操作函数的实现详细解析

    C字符串操作函数的实现详细解析

    以下是对C语言中字符串操作函数的实现进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • C语言动态内存管理深入探讨

    C语言动态内存管理深入探讨

    动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存,本文带你深入探究C语言中动态内存的管理
    2022-06-06
  • C++控制台实现密码管理系统

    C++控制台实现密码管理系统

    这篇文章主要为大家详细介绍了C++控制台实现密码管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 详解C语言中的getgrgid()函数和getgrnam()函数

    详解C语言中的getgrgid()函数和getgrnam()函数

    这篇文章主要介绍了详解C语言中的getgrgid()函数和getgrnam()函数,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C++实现图书馆案例

    C++实现图书馆案例

    这篇文章主要为大家详细介绍了C++实现图书馆案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Qt 事件过滤器的具体实现

    Qt 事件过滤器的具体实现

    事件过滤器,见名之意,就是将事件过滤一遍,将不需要的事件都清除掉,剩下需要的事件进行操作。本文详细的介绍了Qt 事件过滤器的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • OpenSSL动态链接库源码安装教程

    OpenSSL动态链接库源码安装教程

    Openssl 是一个开放源代码的SSL协议的产品实现,它采用C语言作为开发语言,具备了跨系统的性能。这篇文章主要介绍了OpenSSL动态链接库源码安装,需要的朋友可以参考下
    2021-11-11

最新评论