一个高效的C++性能计数器模板

类别:编程语言 点击:0 评论:0 推荐:

一个高效的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)
}

本文地址:http://com.8s8s.com/it/it27086.htm