码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-10-07 22:51:14      阅读:335      评论:0      收藏:0      [点我收藏+]

标签:boost   多线程   locale   bar   vs2013   get   inf   log   lap   

如何使用

[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

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

标签:boost   多线程   locale   bar   vs2013   get   inf   log   lap   

原文地址:http://www.cnblogs.com/findumars/p/7635978.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!