• 一个简单的C++性能测试工具(ms级别)


    如何使用

    [cpp] view plain copy
     
    1. #include "sperformance.h"  
    2.   
    3. #include <iostream>  
    4. #include <boost/thread.hpp>  
    5.   
    6. int main(int argc, char** argv)  
    7. {  
    8.     kagula::PerformanceTest pt;  
    9.       
    10.     {  
    11.         pt.start();  
    12.         boost::this_thread::sleep(boost::posix_time::milliseconds(0));  
    13.         pt.stop();  
    14.   
    15.         std::cout << "First time:" << pt.toString() << std::endl << std::endl;  
    16.     }  
    17.   
    18.   
    19.     {  
    20.         pt.start();  
    21.         boost::this_thread::sleep(boost::posix_time::milliseconds(100));  
    22.         pt.stop();  
    23.   
    24.         std::cout << "Second time:" << pt.toString() << std::endl << std::endl;  
    25.     }  
    26.   
    27.   
    28.     {  
    29.         pt.start();  
    30.         boost::this_thread::sleep(boost::posix_time::milliseconds(1000));  
    31.         pt.stop();  
    32.   
    33.         std::cout << "Third time:" << pt.toString() << std::endl << std::endl;  
    34.     }  
    35.   
    36.     std::cin.get();  
    37.   
    38.     return 0;  
    39. }  


     

    依赖的头文件

    [cpp] view plain copy
     
    1. #ifndef _SPERFORMANCE_H_  
    2. #define _SPERFORMANCE_H_  
    3.   
    4. #include <string>  
    5. #include <list>  
    6.   
    7. #include <boost/thread/mutex.hpp>  
    8. #include <boost/date_time/posix_time/posix_time.hpp>     
    9.   
    10. namespace kagula  
    11. {  
    12.     /* 
    13.     * Title: 
    14.     * Description: 
    15.     * 以毫秒(Millisecond)为单位测试程序代码段的运行时间。 
    16.     * Dependencies: boost 1.61 
    17.     * Test Environment: VS2013 Update5 
    18.     * Remark:  
    19.     * [1]计量单位ms 
    20.     * [2]优点:[a]使用简单[2]只依赖boost,可以跨平台. 
    21.     * */  
    22.     struct PerformanceTest  
    23.     {  
    24.         PerformanceTest() :m_lastFPS(.0f),  
    25.             m_minElapsedTime(1000.0f), m_maxElapsedTime(.0f), m_lastElapsedTime(.0f){}  
    26.         std::string toString();  
    27.   
    28.         void start();  
    29.         void stop();  
    30.   
    31.         float getMinFPS();  
    32.         float getMaxFPS();  
    33.         float getLastFPS();  
    34.         float getAvgFPS();  
    35.   
    36.         float getElapsedTime();  
    37.         float getAvgTime();  
    38.     private:  
    39.         float m_minFPS;  
    40.         float m_maxFPS;  
    41.         float m_lastFPS;  
    42.         float m_avgFPS;  
    43.   
    44.   
    45.         float m_minElapsedTime;////milli second unit  
    46.         float m_maxElapsedTime;  
    47.         float m_avgElapsedTime;  
    48.         float m_lastElapsedTime;  
    49.   
    50.         std::list<float> m_listHistoryElapsedTime;  
    51.   
    52.         void setInMilliSecond(unsigned long long milliSecond);  
    53.   
    54.         boost::mutex m_mutexRW;  
    55.         boost::posix_time::ptime m_timeStart;  
    56.     };  
    57.   
    58.     //std::string GetCurrentTime();  
    59. }  
    60. #endif  


     

    依赖的实现文件

    [cpp] view plain copy
     
    1. #include "sperformance.h"  
    2.   
    3. #include <boost/thread/locks.hpp>  
    4. #include <iomanip>  
    5.   
    6. namespace kagula  
    7. {  
    8.     void PerformanceTest::start()  
    9.     {  
    10.         m_timeStart = boost::posix_time::microsec_clock::universal_time();  
    11.     }  
    12.   
    13.     void PerformanceTest::stop()  
    14.     {  
    15.         boost::posix_time::ptime timeStop = boost::posix_time::microsec_clock::universal_time();  
    16.   
    17.         boost::posix_time::millisec_posix_time_system_config::time_duration_type timeElapsed;  
    18.         timeElapsed = timeStop - m_timeStart;  
    19.   
    20.         unsigned long long llElapsedTime = timeElapsed.total_milliseconds();  
    21.   
    22.         setInMilliSecond(llElapsedTime);  
    23.     }  
    24.   
    25.     void PerformanceTest::setInMilliSecond(unsigned long long milliSecond)  
    26.     {  
    27.         boost::lock_guard<boost::mutex> lock(m_mutexRW);  
    28.   
    29.         //Prevent division zero error.  
    30.         if (milliSecond <= 0)  
    31.             milliSecond = 1;  
    32.   
    33.         m_lastElapsedTime = milliSecond;  
    34.   
    35.         //  
    36.         if (m_minElapsedTime > milliSecond)  
    37.             m_minElapsedTime = milliSecond;  
    38.   
    39.         m_maxFPS = 1000 / m_minElapsedTime;  
    40.   
    41.         //  
    42.         if (m_maxElapsedTime < milliSecond)  
    43.             m_maxElapsedTime = milliSecond;  
    44.   
    45.         m_minFPS = 1000 / m_maxElapsedTime;  
    46.   
    47.         //  
    48.         m_lastFPS = 1000 / (float)milliSecond;  
    49.   
    50.         //  
    51.         m_listHistoryElapsedTime.push_back(m_lastElapsedTime);  
    52.   
    53.         std::list<float>::iterator iter = m_listHistoryElapsedTime.begin();  
    54.         float fTemp = .0f;  
    55.         while (iter != m_listHistoryElapsedTime.end())  
    56.         {  
    57.             fTemp += *iter;  
    58.   
    59.             iter++;  
    60.         }  
    61.   
    62.         m_avgElapsedTime = fTemp / m_listHistoryElapsedTime.size();  
    63.         m_avgFPS = 1000 / m_avgElapsedTime;  
    64.   
    65.         if (m_listHistoryElapsedTime.size() > 1024)  
    66.         {  
    67.             m_listHistoryElapsedTime.pop_front();  
    68.             //http://www.cplusplus.com/reference/list/list/pop_front/  
    69.         }  
    70.     }//end function  
    71.   
    72.     std::string PerformanceTest::toString()  
    73.     {  
    74.         boost::lock_guard<boost::mutex> lock(m_mutexRW);  
    75.   
    76.         std::stringstream ss;  
    77.   
    78.         ss << "Last elapsed time is " << std::setw(5) << std::setprecision(2) << std::fixed  
    79.             << m_lastElapsedTime   
    80.             << "ms, last fps is " << m_lastFPS  
    81.             << " ,minimum elapsed time is " << m_minElapsedTime   
    82.             << "ms, maximum elapsed time is " << m_maxElapsedTime  
    83.             << "ms, avelage elapsed time is " << m_avgElapsedTime  
    84.             << "ms, average fps is " << m_avgFPS;  
    85.   
    86.         return ss.str();  
    87.     }  
    88.   
    89.   
    90.     float PerformanceTest::getElapsedTime()  
    91.     {  
    92.         boost::lock_guard<boost::mutex> lock(m_mutexRW);  
    93.         return m_lastElapsedTime;  
    94.     }  
    95.   
    96.     float PerformanceTest::getAvgTime()  
    97.     {  
    98.         boost::lock_guard<boost::mutex> lock(m_mutexRW);  
    99.         return m_avgElapsedTime;  
    100.     }  
    101.   
    102.     float PerformanceTest::getAvgFPS()  
    103.     {  
    104.         boost::lock_guard<boost::mutex> lock(m_mutexRW);  
    105.         return m_avgFPS;  
    106.     }  
    107.   
    108.     float PerformanceTest::getMinFPS()  
    109.     {  
    110.         boost::lock_guard<boost::mutex> lock(m_mutexRW);  
    111.         return m_minFPS;  
    112.     }  
    113.   
    114.     float PerformanceTest::getMaxFPS()  
    115.     {  
    116.         boost::lock_guard<boost::mutex> lock(m_mutexRW);  
    117.         return m_maxFPS;  
    118.     }  
    119.   
    120.     float PerformanceTest::getLastFPS()  
    121.     {  
    122.         boost::lock_guard<boost::mutex> lock(m_mutexRW);  
    123.         return m_lastFPS;  
    124.     }  
    125.   
    126.     boost::mutex g_mutexGetCurrentTime;  
    127.     std::string GetCurrentTime()  
    128.     {  
    129.         boost::lock_guard<boost::mutex> lock(g_mutexGetCurrentTime);  
    130.         //下面这段代码可能会导致boost::log多线程冲突问题  
    131.         boost::posix_time::time_facet* p_tfacet = new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S%F");  
    132.         std::stringstream ss;  
    133.         ss.imbue(std::locale(ss.getloc(), p_tfacet));  
    134.         ss << "[" << boost::posix_time::microsec_clock::local_time() << "]: ";  
    135.   
    136.         return ss.str();  
    137.     }  
    138. }  

    http://blog.csdn.net/lee353086/article/details/53741514

  • 相关阅读:
    图解一道腾讯笔试算法题:「最长上升子序列」
    【时空】冰与火之歌一文弄懂时间复杂度与空间复杂度
    程序员必须掌握哪些算法?
    重学算法:Hash 算法原理及应用漫谈
    LeetCode 第 66 号问题:加一
    Java 面试 80% 的人都会踩这些坑,你知道几种?
    告别递归,从零开始一文学会递归解题
    动画: 快速排序 | 如何求第 K 大元素?
    【图解】记一次手撕算法面试:字节跳动的面试官把我四连击了
    万字长文!动态规划的终极难题:字符匹配类
  • 原文地址:https://www.cnblogs.com/findumars/p/7635978.html
Copyright © 2020-2023  润新知