📄 warfunctionprofiler.h
字号:
/** */#ifndef WAR_FUNCTION_PROFILER_H#define WAR_FUNCTION_PROFILER_H/* SYSTEM INCLUDES */#if defined(HAVE_SYS_TIME_H) && !defined(WAR_SYS_TIME_H_INCLUDED)# define WAR_SYS_TIME_H_INCLUDED# include <sys/time.h>#endif/* PROJECT INCLUDES */#ifndef WAR_TYPES_H# include "WarTypes.h"#endif#ifndef WAR_AUTO_LOCK_H# include "WarAutoLock.h"#endif/* LOCAL INCLUDES *//* FORWARD REFERENCES */#ifdef __cplusplusextern "C" {#endif/****************** BEGIN OLD STYLE C spesific ********/#define WAR_PROFILE_FUNC(id) \ WarCodeTimer my_func_timer(id)/****************** END OLD STYLE C spesific **********/#ifdef __cplusplus }#endif/****************** BEGIN C++ spesific ****************/#ifdef __cplusplusenum WarProfilerItemE{ WAR_FP_DATA_PUMP, WAR_FP_DATA_PUMP_FREAD_ASYNCH, WAR_FP_DATA_PUMP_FREAD_SYNCH, WAR_FP_DATA_PUMP_FREAD_CHKEOF, WAR_FP_DATA_PUMP_SCK_OUT, WAR_FP_DATA_PUMP_RECEIVING, WAR_FP_WarSvrProtocolFtpDataConn_ProcessPendingBuffers, WAR_FP_WarTransferSocket_OnTransferDone, WAR_FP_WarTransferSocket_OnAccept, WAR_FP_WarTransferSocket_OnConnect, WAR_FP_WarTransferSocket_OnFileIo, WAR_FP_WarTransferSocket_OnFileIo_SendWithCallback, WAR_FP_WarTransferSocket_OnFileIo_ERROR, WAR_FP_WarTransferSocket_OnFileIo_QUEUE, WAR_FP_WarTransferSocket_OnFileIo_RECV, WAR_FP_WarTransferSocket_OnReceived, WAR_FP_WarTransferSocket_OnSent, WAR_FP_WarFileDriverFileWin32_ReadWithCallback, WAR_FP_WarFileDriverFileWin32_ReadWithCallback_ALLOC, WAR_FP_WarFileDriverFileWin32_ReadWithCallback_PREP, WAR_FP_WarFileDriverFileWin32_ReadWithCallback_READFILE, WAR_FP_WarFileDriverFileWin32_ReadWithCallback_POSTPRC, WAR_FP_WarFileDriverFileWin32_WriteWithCallback, WAR_FP_WarFileDriverFileWin32_AllocResult_NEW, WAR_FP_WarFileDriverFileWin32_AllocResult_ASSIGN, WAR_FP_WarSocketIoWin32Nt_SendWithCallback, WAR_FP_WarSocketIoWin32Nt_SendWithCallback_ALLOC, WAR_FP_WarSocketIoWin32Nt_SendWithCallback_READFILE, WAR_FP_WarSocketIoWin32Nt_SendWithCallback_POSTPRC, WAR_FP_WarSocketIoWin32Nt_RecvWithCallback, WAR_FP_WarSocketIoWin32Nt_AllocResult_NEW, WAR_FP_WarSocketIoWin32Nt_AllocResult_ASSIGN, WAR_FP_WarUserAuthDataWin32Nt_BeginImpersonate, WAR_FP_WarUserAuthDataWin32Nt_EndImpersonate, WAR_FP_WarTransferSocket_OnReceived_SIMPLE, WAR_FP_WarTransferSocket_OnReceived_QUEUE, WAR_FT_INVALID};class WarFunctionProfiler {public: typedef struct profile_data_def { war_int64_t pd_total_time; // Time in milliseconds war_int64_t pd_counter; // Counter } data_t; // LIFECYCLE /** * Default constructor. */ WarFunctionProfiler(); /** * Destructor. */ ~WarFunctionProfiler(); // OPERATORS // OPERATIONS inline void Record(WarProfilerItemE indexId, const war_int64_t& msElapsed) { WarAutoLock my_lock(mLock); data_t *p = &mData[indexId]; p->pd_total_time += msElapsed; p->pd_counter++; } // CALLBACK // ACCESS // INQUIRY std::string Explain() const; protected: friend class WarCodeTimer; static WarFunctionProfiler *mspProfiler;private: data_t mData[WAR_FT_INVALID]; WarCriticalSection mLock; war_int64_t mTimerResolution; // factor of 1 second};class WarCodeTimer{public: inline WarCodeTimer(WarProfilerItemE itemIndex) : mItemIndex(itemIndex) {#ifdef WIN32 if (!QueryPerformanceCounter( (LARGE_INTEGER *)&mStartTime)) { mStartTime.QuadPart = 0; }#else struct timeval tv; if (::gettimeofday(&tv, NULL) == 0) { mStartTime = tv.tv_sec * 1000000; mStartTime += tv.tv_usec; } else mStartTime = 0;#endif } inline ~WarCodeTimer() { if (WarFunctionProfiler::mspProfiler) {#ifdef WIN32 LARGE_INTEGER elapsed = {0,0}; QueryPerformanceCounter(&elapsed); elapsed.QuadPart -= mStartTime.QuadPart; WarFunctionProfiler::mspProfiler->Record( mItemIndex, elapsed.QuadPart);#else war_int64_t elapsed = 0; struct timeval tv; if (::gettimeofday(&tv, NULL) == 0) { elapsed = tv.tv_sec * 1000000; elapsed += tv.tv_usec; elapsed -= mStartTime; WarFunctionProfiler::mspProfiler->Record( mItemIndex, elapsed); }#endif } }private:#ifdef WIN32 LARGE_INTEGER mStartTime;#else war_int64_t mStartTime;#endif WarProfilerItemE mItemIndex;};#endif /* __cplusplus *//****************** END C++ spesific ******************/#endif /* WAR_FUNCTION_PROFILER_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -