• 一个简单的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

  • 相关阅读:
    CodeForces 510C Fox And Names (拓扑排序)
    Codeforces 1153D Serval and Rooted Tree (简单树形DP)
    HDU 6437 Problem L.Videos (最大费用)【费用流】
    Luogu P3381 (模板题) 最小费用最大流
    Codeforces 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses (并查集+分组背包)
    Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)
    HDU 2204 Eddy's 爱好 (容斥原理)
    Codeforces 939E Maximize! (三分 || 尺取)
    Codeforces 938D. Buy a Ticket (最短路+建图)
    CodeForces 959E Mahmoud and Ehab and the xor-MST (MST+找规律)
  • 原文地址:https://www.cnblogs.com/findumars/p/7635978.html
Copyright © 2020-2023  润新知