Files
mir_server/sdk/srvlib/include/CustomLuaProfiler.h

88 lines
3.0 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/************************************************************************
LUA
lua_hook的方式实现了记录并统计脚本中函数调用时间消耗的功能
HandleDebugHook方法来重新实现对函数调用信息的记录和性能的统
Save方法来重新实现对统计信息保存为文本流的输出格式
************************************************************************/
#include "ObjectCounter.h"
class CCustomLuaProfiler
{
public:
typedef wylib::misc::CRefObject<CCustomLuaPreProcessor::CLineRangeList> CSourceLineList;
public:
CCustomLuaProfiler();
~CCustomLuaProfiler();
/*
* Comments:
* Param lua_State * L:
* Param CSourceLineList * pLRList:
* @Return bool:false
*/
bool SetState(lua_State *L, CSourceLineList *pLRList = NULL);
/*
*
*
*/
size_t Save(wylib::stream::CBaseStream &stm);
/*
* Comments:
* @Return LONGLONG:
*/
LONGLONG GetMaxTotalTime();
protected:
//在lua中存储当前性能统计调试器对象的值名称
static const char szPerStaticDebuggerName[];
//静态hook处理函数
#ifdef WIN32
static void __cdecl StaticCallTimeHook(lua_State *L, lua_Debug *ar);
#else
static void StaticCallTimeHook(lua_State *L, lua_Debug *ar);
#endif
protected:
/** 处理调试HOOK回调 **/
virtual void HandleDebugHook(lua_State *L, lua_Debug *ar);
public:
/** Lua函数调用性能记录 **/
class CLuaCallRcd : public Counter<CLuaCallRcd>
{
public:
char sName[40]; //函数名称
LONG nLineNo; //行号
LONGLONG dwLastTime; //上次调用时间
LONGLONG dwMaxTime; //最大调用时间
LONGLONG dwMinTime; //最小调用时间
LONGLONG dwCallCount; //调用次数
LONGLONG dwTotalTime; //本函数总计调用耗时
LPVOID pSubCallList; //子级调用函数表类型为SubCallTable
public:
~CLuaCallRcd();
};
//子级调用函数表
typedef CCustomHashTable<CLuaCallRcd> CSubCallTable;
//当前调用堆栈表
typedef wylib::container::CBaseList<CLuaCallRcd*> CCallStack;
protected:
lua_State* m_pLua;
CCallStack m_CallStack; //当前调用堆栈
CSubCallTable m_RootCallTable; //根调用记录表
LONGLONG m_dwIgoreRecordTime;//在保存函数调用性能记录时忽略总时间低于此值的记录
CSourceLineList m_LRList;//行范围记录器,用于格式化函数统计时取得代码的文件名和行号
};