126 lines
3.4 KiB
C
126 lines
3.4 KiB
C
|
|
#pragma once
|
|||
|
|
|
|||
|
|
|
|||
|
|
//这个是一个管理器的模块
|
|||
|
|
struct CTimerElement
|
|||
|
|
{
|
|||
|
|
unsigned int hKey; //名字的hash值
|
|||
|
|
int nLine; //行号
|
|||
|
|
//LPCTSTR funcName; //函数的名字
|
|||
|
|
TCHAR funcName[33]; // 函数名称
|
|||
|
|
TICKCOUNT nTimes; //执行的总次数
|
|||
|
|
TICKCOUNT nTotalTick; //执行的总时间
|
|||
|
|
TICKCOUNT nMaxTick; //最大的执行时间
|
|||
|
|
TICKCOUNT nLastTick; //上一次的时间
|
|||
|
|
TICKCOUNT nLocalMaxTick; //本次统计周期的时间
|
|||
|
|
TICKCOUNT nLocalMinTick; //被周期执行的最小的时
|
|||
|
|
TICKCOUNT nPeriodStartTick; //本周期开始的时间
|
|||
|
|
|
|||
|
|
CTimerElement()
|
|||
|
|
{
|
|||
|
|
funcName[0] = 0;
|
|||
|
|
nPeriodStartTick =0;
|
|||
|
|
}
|
|||
|
|
CTimerElement(const CTimerElement &rhs)
|
|||
|
|
{
|
|||
|
|
hKey = rhs.hKey;
|
|||
|
|
nLine = rhs.nLine;
|
|||
|
|
nTimes = rhs.nTimes;
|
|||
|
|
nTotalTick = rhs.nTotalTick;
|
|||
|
|
nMaxTick = rhs.nMaxTick;
|
|||
|
|
nLastTick = rhs.nLastTick;
|
|||
|
|
nLocalMaxTick = rhs.nLocalMaxTick;
|
|||
|
|
nLocalMinTick = rhs.nLocalMinTick;
|
|||
|
|
|
|||
|
|
//nPeriodTimes = rhs.nPeriodTimes;
|
|||
|
|
memcpy(funcName, rhs.funcName, sizeof(funcName));
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//时间的管理器,用于管理各函数使用的时间的情况
|
|||
|
|
class CTimeStatisticMgr
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
CTimeStatisticMgr(){}
|
|||
|
|
~CTimeStatisticMgr()
|
|||
|
|
{
|
|||
|
|
m_elements.empty();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* Comments: 添加时间的统计器
|
|||
|
|
* Param unsigned int nKey: hash值
|
|||
|
|
* Param int nLine: 行号
|
|||
|
|
* Param LPCTSTR name: 函数的名字
|
|||
|
|
* Param TICKCOUNT tick: 消耗的时间
|
|||
|
|
* Param TICKCOUNT nCurrentTick: 当前的时间
|
|||
|
|
* @Return void:
|
|||
|
|
*/
|
|||
|
|
void AddStatictic(unsigned int nKey, int nLine, LPCTSTR name, TICKCOUNT tick,TICKCOUNT nCurrentTick);
|
|||
|
|
|
|||
|
|
//获取时间数据
|
|||
|
|
CVector<CTimerElement> & GetTimeStaticData()
|
|||
|
|
{
|
|||
|
|
return m_elements;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//将消耗的时间记录在日志里,便于分析
|
|||
|
|
bool LogTimeFile();
|
|||
|
|
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
CVector<CTimerElement> m_elements;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//时间统计的类,
|
|||
|
|
|
|||
|
|
class CTimeSpan
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
CTimeSpan( LPCTSTR name,int nLine,unsigned int key, unsigned int nMinStatTime = 0, bool bInnerHash = false)
|
|||
|
|
{
|
|||
|
|
//m_func = name;
|
|||
|
|
size_t nLen = __min(_tcslen(name), 32);
|
|||
|
|
memcpy(m_funName, name, nLen * sizeof(TCHAR));
|
|||
|
|
m_funName[nLen] = 0;
|
|||
|
|
m_line = nLine;
|
|||
|
|
m_tick = _getTickCount();
|
|||
|
|
m_key = key;
|
|||
|
|
m_nMinStatTime = nMinStatTime;
|
|||
|
|
m_bInnerHash = bInnerHash;
|
|||
|
|
}
|
|||
|
|
~CTimeSpan()
|
|||
|
|
{
|
|||
|
|
if(g_mgr)
|
|||
|
|
{
|
|||
|
|
TICKCOUNT nCurrentTick = _getTickCount() ;
|
|||
|
|
TICKCOUNT ellapse = nCurrentTick- m_tick;
|
|||
|
|
if ( ellapse >= m_nMinStatTime)
|
|||
|
|
{
|
|||
|
|
if ( m_bInnerHash )
|
|||
|
|
m_key = CCLVariant::hashstr(m_funName);
|
|||
|
|
g_mgr->AddStatictic(m_key,m_line,m_funName,ellapse,nCurrentTick);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public:
|
|||
|
|
static CTimeStatisticMgr* g_mgr; //管理器
|
|||
|
|
private:
|
|||
|
|
TICKCOUNT m_tick; //花费的时间
|
|||
|
|
|
|||
|
|
TCHAR m_funName[33]; // 函数名称
|
|||
|
|
int m_line; //行数
|
|||
|
|
unsigned int m_key; //只算一次
|
|||
|
|
unsigned int m_nMinStatTime; // 最小统计记录时间
|
|||
|
|
bool m_bInnerHash; // 是否内部计算hash值
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//这里定义一个静态变量,只计算一次,为了避免hash值每次都去计算
|
|||
|
|
//#define SF_TIME_CHECK() static unsigned int _STATIC_FUNCTION_HASH_VALUE_= CCLVariant::hashstr(__FUNCTION__); \
|
|||
|
|
// CTimeSpan CTimeSpanLoalInst##__FUNCTION__##__LINE__(__FUNCTION__, __LINE__,_STATIC_FUNCTION_HASH_VALUE_ )
|
|||
|
|
//
|
|||
|
|
//#define SF_TIME_CHECK_NAME(fn, minStatTime) static unsigned int _STATIC_FUNCTION_HASH_VALUE_= CCLVariant::hashstr(__FUNCTION__"_"#fn); \
|
|||
|
|
// CTimeSpan CTimeSpanLoalInst##__FUNCTION__##__LINE__(fn, __LINE__,_STATIC_FUNCTION_HASH_VALUE_, minStatTime, true);
|
|||
|
|
#define SF_TIME_CHECK()
|
|||
|
|
#define SF_TIME_CHECK_NAME(fn, minStatTime)
|