一个高效的C++性能计数器模板
email: [email protected]
homepage: www.larrin.net
摘要:对性能期望较高的系统中,简单高效的性能计数器对发现系统中的性能瓶颈很有价值。本文给出一个使用简单但高效的C++性能计数器模板。本文给出的计数器是Windows版本的,但移植到Linux下非常简单。
计数器代码如下:
//PerformanceCounter.h
#ifndef _LARRINSDK_PERFORMANCE_COUNTER_H_ #define _LARRINSDK_PERFORMANCE_COUNTER_H_
#include "LarrinSdk.h" #include <iostream> #include <windows.h>
using namespace std;
BEGIN_LARRIN_SDK
template<class T> class CPerformanceCounter { const char *m_Name ; unsigned long m_tmpCounter ; unsigned long m_TickCounter;
CPerformanceCounter(const char *name):m_Name(name),m_TickCounter(0) { }
public:
~CPerformanceCounter() { cout << "PerformanceCounter " << m_Name << " : " << m_TickCounter << endl ; }
static CPerformanceCounter & getInstance(const char *name) { static CPerformanceCounter instance(name); return instance ; }
void BeginCounter() { m_tmpCounter = GetTickCount(); }
void EndCounter() { m_TickCounter += (GetTickCount() - m_tmpCounter) ; } };
template <class T> class CPerformanceCounterHelper { const char *m_name ; public: CPerformanceCounterHelper(const char *counter_name):m_name(counter_name) { CPerformanceCounter<T>::getInstance(m_name).BeginCounter(); }
~CPerformanceCounterHelper() { CPerformanceCounter<T>::getInstance(m_name).EndCounter(); } };
#define DEFINE_COUNTER(x) struct x;
#ifdef ENABLE_PERFORMANCE_COUNTER #define BEGIN_COUNTER(counter_name) CPerformanceCounter<counter_name>::getInstance(#counter_name).BeginCounter(); #define END_COUNTER(counter_name) CPerformanceCounter<counter_name>::getInstance(#counter_name).EndCounter(); #define COUNTER_HELPER(counter_name) CPerformanceCounterHelper<counter_name> counter_##counter_name(#counter_name); #else #define BEGIN_COUNTER(counter_name) #define END_COUNTER(counter_name) #endif
END_LARRIN_SDK
#endif //_LARRINSDK_PERFORMANCE_COUNTER_H_
测试程序:
1.main.cpp
#include "PerformanceCounter.h"
extern void test1();
using namespace LarrinSdk;
DEFINE_COUNTER(counter_1)
void main() { { COUNTER_HELPER(counter_1) for(int i = 0 ; i < 300 ; i++) { Sleep(1); } }
test1(); }
//2.test1.cpp
#include "PerformanceCounter.h"
using namespace LarrinSdk;
DEFINE_COUNTER(counter_1)
void test1() { BEGIN_COUNTER(counter_1) for(int i = 0 ; i < 1000 ; i++) { Sleep(1); } END_COUNTER(counter_1) } 
|