97 lines
2.7 KiB
C++
97 lines
2.7 KiB
C++
|
|
#pragma once
|
|||
|
|
#include "StdAfx.h"
|
|||
|
|
#include "TimeSpan.h"
|
|||
|
|
using namespace wylib;
|
|||
|
|
using namespace wylib::stream;
|
|||
|
|
CTimeStatisticMgr * CTimeSpan::g_mgr = NULL;
|
|||
|
|
void CTimeStatisticMgr::AddStatictic(unsigned int nKey,int nLine,LPCTSTR name, TICKCOUNT tick,TICKCOUNT nCurrentTick)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
CTimerElement * pElement = NULL;
|
|||
|
|
//查找的依据是函数名字的hash和行号一样,这样基本能保证100%唯一性了
|
|||
|
|
for(INT_PTR i=0; i < m_elements.count(); i++)
|
|||
|
|
{
|
|||
|
|
if(m_elements[i].hKey ==nKey && nLine == m_elements[i].nLine ) //找到了
|
|||
|
|
{
|
|||
|
|
pElement = &m_elements[i];
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//如果是新加的元素的就初始化这些数据
|
|||
|
|
if(pElement ==NULL)
|
|||
|
|
{
|
|||
|
|
CTimerElement element;
|
|||
|
|
//element.funcName = name;
|
|||
|
|
size_t nLen = __min(_tcslen(name), 32);
|
|||
|
|
memcpy(element.funcName, name, nLen * sizeof(TCHAR));
|
|||
|
|
element.funcName[nLen] = 0;
|
|||
|
|
element.hKey= nKey;
|
|||
|
|
element.nLine= nLine;
|
|||
|
|
element.nMaxTick=tick;
|
|||
|
|
element.nLastTick = tick;
|
|||
|
|
element.nLocalMaxTick =tick;
|
|||
|
|
element.nTotalTick = tick;
|
|||
|
|
element.nTimes = 1;
|
|||
|
|
element.nLocalMinTick =tick;
|
|||
|
|
m_elements.add(element);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
pElement->nTotalTick += tick; //总时间++
|
|||
|
|
if(tick > pElement->nMaxTick ) // 最大时间
|
|||
|
|
{
|
|||
|
|
pElement->nMaxTick = tick;
|
|||
|
|
}
|
|||
|
|
if(tick > pElement->nLocalMaxTick)
|
|||
|
|
{
|
|||
|
|
pElement->nLocalMaxTick = tick;
|
|||
|
|
}
|
|||
|
|
if (tick && tick < pElement->nLocalMinTick )
|
|||
|
|
{
|
|||
|
|
pElement->nLocalMinTick = tick;
|
|||
|
|
}
|
|||
|
|
pElement->nLastTick = tick;
|
|||
|
|
pElement->nTimes ++;
|
|||
|
|
//每个局部的统计周期为1分钟
|
|||
|
|
if(nCurrentTick - pElement->nPeriodStartTick > 60000 ) //60分钟为一个统计周期
|
|||
|
|
{
|
|||
|
|
pElement->nPeriodStartTick =nCurrentTick;
|
|||
|
|
pElement->nLocalMinTick =tick;
|
|||
|
|
pElement->nLocalMaxTick =tick;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CTimeStatisticMgr::LogTimeFile()
|
|||
|
|
{
|
|||
|
|
SYSTEMTIME Systime;
|
|||
|
|
GetLocalTime( &Systime );
|
|||
|
|
char sFileName[16];
|
|||
|
|
|
|||
|
|
strcpy(sFileName, _T("perfermance.txt") );
|
|||
|
|
char buff[512];
|
|||
|
|
|
|||
|
|
CFileStream stm(sFileName, CFileStream::faWrite | CFileStream::faCreate,CFileStream::AlwaysCreate );
|
|||
|
|
//sprintf( buff,"total max times lMin lMax last func");
|
|||
|
|
sprintf(buff, "%-13s%-13s%-13s%-13s%-13s%-13s%-20s\r\n","total", "max", "times", "lMin", "lMax", "last", "func");
|
|||
|
|
OutputMsg(rmTip,buff );
|
|||
|
|
stm.write(buff,strlen(buff));
|
|||
|
|
for(INT_PTR i=0; i< m_elements.count(); i++)
|
|||
|
|
{
|
|||
|
|
if(m_elements[i].nTimes <=0 )
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
sprintf( buff,"%-13lld%-13lld%-13lld%-13lld%-13lld%-13lld%-20s",
|
|||
|
|
(Uint64)m_elements[i].nTotalTick,(Uint64)m_elements[i].nMaxTick,
|
|||
|
|
(Uint64)m_elements[i].nTimes, (Uint64)m_elements[i].nLocalMinTick,
|
|||
|
|
(Uint64)m_elements[i].nLocalMaxTick,(Uint64)m_elements[i].nLastTick,
|
|||
|
|
m_elements[i].funcName);
|
|||
|
|
OutputMsg(rmTip,buff );
|
|||
|
|
stm.write(buff,strlen(buff));
|
|||
|
|
stm.write(" \r\n",4);
|
|||
|
|
}
|
|||
|
|
//OutputMsg(rmTip, _T(" log performance log %s"),sFileName );
|
|||
|
|
return true;
|
|||
|
|
}
|