llfasttimer_class.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file llfasttimer_class.h
  3.  * @brief Declaration of a fast timer.
  4.  *
  5.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2004-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_FASTTIMER_CLASS_H
  33. #define LL_FASTTIMER_CLASS_H
  34. #include "llinstancetracker.h"
  35. #define FAST_TIMER_ON 1
  36. #define TIME_FAST_TIMERS 0
  37. class LLMutex;
  38. #include <queue>
  39. #include "llsd.h"
  40. class LL_COMMON_API LLFastTimer
  41. {
  42. public:
  43. class NamedTimer;
  44. struct LL_COMMON_API FrameState
  45. {
  46. FrameState(NamedTimer* timerp);
  47. U32  mSelfTimeCounter;
  48. U32  mCalls;
  49. FrameState* mParent; // info for caller timer
  50. FrameState* mLastCaller; // used to bootstrap tree construction
  51. NamedTimer* mTimer;
  52. U16 mActiveCount; // number of timers with this ID active on stack
  53. bool mMoveUpTree; // needs to be moved up the tree of timers at the end of frame
  54. };
  55. // stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
  56. class LL_COMMON_API NamedTimer
  57. : public LLInstanceTracker<NamedTimer>
  58. {
  59. friend class DeclareTimer;
  60. public:
  61. ~NamedTimer();
  62. enum { HISTORY_NUM = 60 };
  63. const std::string& getName() const { return mName; }
  64. NamedTimer* getParent() const { return mParent; }
  65. void setParent(NamedTimer* parent);
  66. S32 getDepth();
  67. std::string getToolTip(S32 history_index = -1);
  68. typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
  69. child_const_iter beginChildren();
  70. child_const_iter endChildren();
  71. std::vector<NamedTimer*>& getChildren();
  72. void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
  73. bool getCollapsed() const { return mCollapsed; }
  74. U32 getCountAverage() const { return mCountAverage; }
  75. U32 getCallAverage() const { return mCallAverage; }
  76. U32 getHistoricalCount(S32 history_index = 0) const;
  77. U32 getHistoricalCalls(S32 history_index = 0) const;
  78. static NamedTimer& getRootNamedTimer();
  79. S32 getFrameStateIndex() const { return mFrameStateIndex; }
  80. FrameState& getFrameState() const;
  81. private:
  82. friend class LLFastTimer;
  83. friend class NamedTimerFactory;
  84. //
  85. // methods
  86. //
  87. NamedTimer(const std::string& name);
  88. // recursive call to gather total time from children
  89. static void accumulateTimings();
  90. // updates cumulative times and hierarchy,
  91. // can be called multiple times in a frame, at any point
  92. static void processTimes();
  93. static void buildHierarchy();
  94. static void resetFrame();
  95. static void reset();
  96. //
  97. // members
  98. //
  99. S32 mFrameStateIndex;
  100. std::string mName;
  101. U32  mTotalTimeCounter;
  102. U32  mCountAverage;
  103. U32 mCallAverage;
  104. U32* mCountHistory;
  105. U32* mCallHistory;
  106. // tree structure
  107. NamedTimer* mParent; // NamedTimer of caller(parent)
  108. std::vector<NamedTimer*> mChildren;
  109. bool mCollapsed; // don't show children
  110. bool mNeedsSorting; // sort children whenever child added
  111. };
  112. // used to statically declare a new named timer
  113. class LL_COMMON_API DeclareTimer
  114. : public LLInstanceTracker<DeclareTimer>
  115. {
  116. friend class LLFastTimer;
  117. public:
  118. DeclareTimer(const std::string& name, bool open);
  119. DeclareTimer(const std::string& name);
  120. static void updateCachedPointers();
  121. private:
  122. NamedTimer& mTimer;
  123. FrameState* mFrameState;
  124. };
  125. public:
  126. LLFastTimer(LLFastTimer::FrameState* state);
  127. LL_FORCE_INLINE LLFastTimer(LLFastTimer::DeclareTimer& timer)
  128. : mFrameState(timer.mFrameState)
  129. {
  130. #if TIME_FAST_TIMERS
  131. U64 timer_start = getCPUClockCount64();
  132. #endif
  133. #if FAST_TIMER_ON
  134. LLFastTimer::FrameState* frame_state = mFrameState;
  135. mStartTime = getCPUClockCount32();
  136. frame_state->mActiveCount++;
  137. frame_state->mCalls++;
  138. // keep current parent as long as it is active when we are
  139. frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
  140. LLFastTimer::CurTimerData* cur_timer_data = &LLFastTimer::sCurTimerData;
  141. mLastTimerData = *cur_timer_data;
  142. cur_timer_data->mCurTimer = this;
  143. cur_timer_data->mFrameState = frame_state;
  144. cur_timer_data->mChildTime = 0;
  145. #endif
  146. #if TIME_FAST_TIMERS
  147. U64 timer_end = getCPUClockCount64();
  148. sTimerCycles += timer_end - timer_start;
  149. #endif
  150. }
  151. LL_FORCE_INLINE ~LLFastTimer()
  152. {
  153. #if TIME_FAST_TIMERS
  154. U64 timer_start = getCPUClockCount64();
  155. #endif
  156. #if FAST_TIMER_ON
  157. LLFastTimer::FrameState* frame_state = mFrameState;
  158. U32 total_time = getCPUClockCount32() - mStartTime;
  159. frame_state->mSelfTimeCounter += total_time - LLFastTimer::sCurTimerData.mChildTime;
  160. frame_state->mActiveCount--;
  161. // store last caller to bootstrap tree creation
  162. // do this in the destructor in case of recursion to get topmost caller
  163. frame_state->mLastCaller = mLastTimerData.mFrameState;
  164. // we are only tracking self time, so subtract our total time delta from parents
  165. mLastTimerData.mChildTime += total_time;
  166. LLFastTimer::sCurTimerData = mLastTimerData;
  167. #endif
  168. #if TIME_FAST_TIMERS
  169. U64 timer_end = getCPUClockCount64();
  170. sTimerCycles += timer_end - timer_start;
  171. sTimerCalls++;
  172. #endif
  173. }
  174. public:
  175. static LLMutex* sLogLock;
  176. static std::queue<LLSD> sLogQueue;
  177. static BOOL sLog;
  178. static BOOL sMetricLog;
  179. static bool  sPauseHistory;
  180. static bool  sResetHistory;
  181. static U64 sTimerCycles;
  182. static U32 sTimerCalls;
  183. typedef std::vector<FrameState> info_list_t;
  184. static info_list_t& getFrameStateList();
  185. // call this once a frame to reset timers
  186. static void nextFrame();
  187. // dumps current cumulative frame stats to log
  188. // call nextFrame() to reset timers
  189. static void dumpCurTimes();
  190. // call this to reset timer hierarchy, averages, etc.
  191. static void reset();
  192. static U64 countsPerSecond();
  193. static S32 getLastFrameIndex() { return sLastFrameIndex; }
  194. static S32 getCurFrameIndex() { return sCurFrameIndex; }
  195. static void writeLog(std::ostream& os);
  196. static const NamedTimer* getTimerByName(const std::string& name);
  197. struct CurTimerData
  198. {
  199. LLFastTimer* mCurTimer;
  200. FrameState* mFrameState;
  201. U32 mChildTime;
  202. };
  203. static CurTimerData sCurTimerData;
  204. private:
  205. static U32 getCPUClockCount32();
  206. static U64 getCPUClockCount64();
  207. static U64 sClockResolution;
  208. static S32 sCurFrameIndex;
  209. static S32 sLastFrameIndex;
  210. static U64 sLastFrameTime;
  211. static info_list_t* sTimerInfos;
  212. U32 mStartTime;
  213. LLFastTimer::FrameState* mFrameState;
  214. LLFastTimer::CurTimerData mLastTimerData;
  215. };
  216. typedef class LLFastTimer LLFastTimer;
  217. #endif // LL_LLFASTTIMER_CLASS_H