一个高效的C++性能计数器模板
来源:互联网 发布:ipad怎样下载软件 编辑:程序博客网 时间:2024/06/01 07:19
一个高效的C++性能计数器模板
email: larrin2002@msn.com
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)
}
- 一个高效的C++性能计数器模板
- 一个简单的性能计数器
- 一个简单的性能计数器
- 一个简单的性能计数器:CodeTimer
- 一个简单的性能计数器:CodeTimer
- 一个简单的性能计数器:CodeTimer
- 一个易用,高效,精确的纳秒级C#时间计数器
- 关于如何用java实现一个高效的计数器
- HashMap计数器的高效实现
- Java实现的高效计数器
- 一个不错的计数器
- 一个简单的计数器
- 在java中高效的计数器
- 简单安全高效的Java计数器
- 一些性能计数器的说明
- LoadRunner监视的性能计数器
- ASP.NET 的性能计数器
- asp.net 的性能计数器
- 2. 四. 别名 (shell命令)
- 我给谭强的信,关于Visual Studio .NET 2005
- 利用线程库提高程序性能
- 100分的情书
- ASP.NET组件编程step by step(转)
- 一个高效的C++性能计数器模板
- M55升级手记
- javascript中String 对象属性和方法
- Red Hat Linux 253 实验翻译(KevinZ)
- 安装Windows后如何重新加载GRUB(How to reload missing GRUB after installing windows OS)
- Defensive Programming
- 高兴ing
- Windows XP下自定义文件夹
- eboot的编译方法