zoukankan      html  css  js  c++  java
  • 高精度计时器 -- C++/Windows版

    在VC++程序里面做计时器可以用CTime,但是这个精度不高,尤其是在时间间隔很短的情况下可能根本没法用。

    对于软件测试,可能需要知道精度很高的时间间隔,这个时候最适合用的就是:QueryPerformanceCounter(简称QPC),这是Windows系统提供的API,可信度非常高,QPC可以精确到1微秒(us),所以即使用在很短的时间间隔上也是有价值的。

    下面是用C++封装的一段QPC的代码和一个很小的测试用例,当然不用C++封装直接调用QPC也是可以的。

    接口规约:

      1. 开始(start)

      2. 结束(end)

      3. 记录用时(getElapsedTime)

    所以,封装以后的程序非常简单:开始计时、停止计时、看一下用了多少时间、重新计时,就是这么简单。

    //StopWatch.h
    #include <Windows.h>
    class CStopWatch
    {
    public:
        CStopWatch();
        void start();
        void stop();
        double getElapsedTime(); //in s
    private:
        LARGE_INTEGER m_start;
        LARGE_INTEGER m_stop;
        LARGE_INTEGER m_frequency;
    };
    
    //StopWatch.cpp
    CStopWatch::CStopWatch()
    {
        m_start.QuadPart = 0;
        m_stop.QuadPart = 0;
        QueryPerformanceFrequency(&m_frequency);
    }
    
    void CStopWatch::start()
    {
        QueryPerformanceCounter(&m_start);
    }
    
    void CStopWatch::stop()
    {
        QueryPerformanceCounter(&m_stop);
    }
    
    double CStopWatch::getElapsedTime()
    {
        LARGE_INTEGER time;
        time.QuadPart = m_stop.QuadPart - m_start.QuadPart;
        return (double)time.QuadPart / (double)m_frequency.QuadPart;
    }
    
    //test
    #include <stdio.h>
    void swap(int & a, int & b)
    {
        int t = a;
        a = b;
        b = t;
    }
    //compile : cl StopWatch.cc
    int main()
    {
        CStopWatch timer;
        timer.start();
        //...
        int a=1, b=2;
        for (unsigned int i = 0; i < 100000000; ++i)
        {
            swap(a, b);
            swap(a, b);
        }
        timer.stop();
        double d = timer.getElapsedTime();
        printf("%fs
    ", d);      //1.166879s
    }

    参考资料:

    1. [MSDN] Acquiring high-resolution time stamps

    2. [MSDN] QueryPerformanceCounter function

  • 相关阅读:
    IPv6隧道技术——6to4实验分析
    IPV6地址解析与DAD机制实验分析
    交换机的高级特性
    组播IGMP实验分析
    BGP实验分析(二)
    BGP实验分析(一)
    路由策略实验分析(二)
    路由策略实验分析(一)
    一线互联网拼多多、饿了么、蚂蚁金服、哈啰出行、携程、饿了么、2345、百度等一些Java面试题
    Java中的匿名内部类
  • 原文地址:https://www.cnblogs.com/tszdev/p/6888639.html
Copyright © 2011-2022 走看看