gwnavruntime/base/timeprofiler.h Source File

timeprofiler.h
Go to the documentation of this file.
1 /*
2 * Copyright 2015 Autodesk, Inc. All rights reserved.
3 * Use of this software is subject to the terms of the Autodesk license agreement and any attachments or Appendices thereto provided at the time of installation or download,
4 * or which otherwise accompanies this software in either electronic or hard copy form, or which is signed by you and accepted by Autodesk.
5 */
6 
7 
8 // primary contact: GUAL - secondary contact: JUBA
9 #ifndef Navigation_TimeProfiler_H
10 #define Navigation_TimeProfiler_H
11 
12 
16 
17 
18 namespace Kaim
19 {
20 
23 class Profiler
24 {
25  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
26 
27 public:
28  Profiler();
29 
30  // ------------------- Get time since start and reset start -------------------
31  KyFloat64 GetSecondsAndRestart();
32  KyFloat64 GetMillisecondsAndRestart();
33  KyFloat64 GetMicrosecondsAndRestart();
34 
35  KyFloat32 GetSecondsAndRestartF();
36  KyFloat32 GetMillisecondsAndRestartF();
37  KyFloat32 GetMicrosecondsAndRestartF();
38 
39  void GetSecondsAndRestart(KyFloat64* s);
40  void GetMillisecondsAndRestart(KyFloat64* ms);
41  void GetMicrosecondsAndRestart(KyFloat64* mks);
42 
43  void GetSecondsAndRestartF(KyFloat32* s);
44  void GetMillisecondsAndRestartF(KyFloat32* ms);
45  void GetMicrosecondsAndRestartF(KyFloat32* mks);
46 
47  // ------------------- Get time since start, does not change start -------------------
48 
49  KyFloat64 GetSeconds() const;
50  KyFloat64 GetMilliseconds() const;
51  KyFloat64 GetMicroseconds() const;
52 
53  KyFloat32 GetSecondsF() const;
54  KyFloat32 GetMillisecondsF() const;
55  KyFloat32 GetMicrosecondsF() const;
56 
57  void GetSeconds(KyFloat64* s) const;
58  void GetMilliseconds(KyFloat64* ms) const;
59  void GetMicroseconds(KyFloat64* mks) const;
60 
61  void GetSecondsF(KyFloat32* s) const;
62  void GetMillisecondsF(KyFloat32* ms) const;
63  void GetMicrosecondsF(KyFloat32* mks) const;
64 
65 private:
66  KyFloat64 ComputeMicroseconds(UInt64 end) const;
67 private:
68  UInt64 m_start; // raw ticks
69 };
70 
71 
72 KY_INLINE Profiler::Profiler() { m_start = Timer::GetRawTicks(); }
73 
74 KY_INLINE void Profiler::GetSecondsAndRestart(KyFloat64* s) { if (s) { *s = GetSecondsAndRestart(); } }
75 KY_INLINE void Profiler::GetMillisecondsAndRestart(KyFloat64* ms) { if (ms) { *ms = GetMillisecondsAndRestart(); } }
76 KY_INLINE void Profiler::GetMicrosecondsAndRestart(KyFloat64* mks) { if (mks) { *mks = GetMicrosecondsAndRestart(); } }
77 KY_INLINE void Profiler::GetSecondsAndRestartF(KyFloat32* s) { if (s) { *s = GetSecondsAndRestartF(); } }
78 KY_INLINE void Profiler::GetMillisecondsAndRestartF(KyFloat32* ms) { if (ms) { *ms = GetMillisecondsAndRestartF(); } }
79 KY_INLINE void Profiler::GetMicrosecondsAndRestartF(KyFloat32* mks) { if (mks) { *mks = GetMicrosecondsAndRestartF(); } }
80 
81 KY_INLINE void Profiler::GetSeconds(KyFloat64* s) const { if (s) { *s = GetSeconds(); } }
82 KY_INLINE void Profiler::GetMilliseconds(KyFloat64* ms) const { if (ms) { *ms = GetMilliseconds(); } }
83 KY_INLINE void Profiler::GetMicroseconds(KyFloat64* mks) const { if (mks) { *mks = GetMicroseconds(); } }
84 KY_INLINE void Profiler::GetSecondsF(KyFloat32* s) const { if (s) { *s = GetSecondsF(); } }
85 KY_INLINE void Profiler::GetMillisecondsF(KyFloat32* ms) const { if (ms) { *ms = GetMillisecondsF(); } }
86 KY_INLINE void Profiler::GetMicrosecondsF(KyFloat32* mks) const { if (mks) { *mks = GetMicrosecondsF(); } }
87 
88 KY_INLINE KyFloat64 Profiler::GetSecondsAndRestart() { return GetMillisecondsAndRestart() * 0.001; }
89 KY_INLINE KyFloat64 Profiler::GetMillisecondsAndRestart() { return GetMicrosecondsAndRestart() * 0.001; }
90 KY_INLINE KyFloat32 Profiler::GetSecondsAndRestartF() { return (KyFloat32)GetSecondsAndRestart(); }
91 KY_INLINE KyFloat32 Profiler::GetMillisecondsAndRestartF() { return (KyFloat32)GetMillisecondsAndRestart(); }
92 KY_INLINE KyFloat32 Profiler::GetMicrosecondsAndRestartF() { return (KyFloat32)GetMicrosecondsAndRestart(); }
93 
94 KY_INLINE KyFloat64 Profiler::GetSeconds() const { return GetMilliseconds() * 0.001; }
95 KY_INLINE KyFloat64 Profiler::GetMilliseconds() const { return GetMicroseconds() * 0.001; }
96 KY_INLINE KyFloat32 Profiler::GetSecondsF() const { return (KyFloat32)GetSeconds(); }
97 KY_INLINE KyFloat32 Profiler::GetMillisecondsF() const { return (KyFloat32)GetMilliseconds(); }
98 KY_INLINE KyFloat32 Profiler::GetMicrosecondsF() const { return (KyFloat32)GetMicroseconds(); }
99 
100 inline KyFloat64 Profiler::GetMicrosecondsAndRestart()
101 {
102  UInt64 now = Timer::GetRawTicks();
103  KyFloat64 microseconds = ComputeMicroseconds(now);
104  m_start = now;
105  return microseconds;
106 }
107 
108 inline KyFloat64 Profiler::GetMicroseconds() const
109 {
110  return ComputeMicroseconds(Timer::GetRawTicks());
111 }
112 
113 KY_INLINE KyFloat64 Profiler::ComputeMicroseconds(UInt64 end) const
114 {
115  const UInt64 ticksDiff = end - m_start;
116  const UInt64 elapsedTimeMicroseconds = (ticksDiff * Timer::MksPerSecond) / Timer::GetRawFrequency();
117  return (KyFloat64)elapsedTimeMicroseconds;
118 }
119 
120 
121 
122 
123 
124 //-----------------------------------------------------------------
125 // macro used to internally to implement ScopedProfilerXXX classes
126 #define KY_IMPLEMENT_SCOPED_PROFILER(class_name, time_unit, init_zero) \
127 KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem) \
128 public: \
129  class_name(KyFloat32* time) : m_time(time) { if (m_time) init_zero(); } \
130  ~class_name() { if (m_time) { *m_time += (KyFloat32)(m_profiler.GetMicroseconds() * time_unit); } } \
131  void DoInitZero() { *m_time = 0.0f; } \
132  void DoNotInitZero() {} \
133 private: \
134  KyFloat32* m_time; \
135  Profiler m_profiler;
136 
137 //-----------------------------------------------------------------
138 // ScopedProfilerXXX classes
139 // Usage:
140 // MyFunc() {
141 // ScopedProfilerXXX ScopedProfilerXXX(&someKyFloat32);
142 // ...
143 // }
144 // The difference between ScopedProfilerXXX and ScopedProfilerSumXXX is that
145 // ScopedProfilerXXX does someKyFloat32 = timeSpent
146 // ScopedProfilerSumXXX does someKyFloat32 += timeSpent
147 class ScopedProfilerSeconds { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerSeconds , 0.000001, DoInitZero ) };
148 class ScopedProfilerMs { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerMs , 0.001 , DoInitZero ) };
149 class ScopedProfilerMks { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerMks , 1.0 , DoInitZero ) };
150 class ScopedProfilerSumSeconds { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerSumSeconds, 0.000001, DoNotInitZero) };
151 class ScopedProfilerSumMs { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerSumMs , 0.001 , DoNotInitZero) };
152 class ScopedProfilerSumMks { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerSumMks , 1.0 , DoNotInitZero) };
153 
154 //-----------------------------------------------------------------
155 // Small macros atop ScopedProfilerXXX.
156 // Not very interesting, allows to avoid the use of brackets {} to limit the lifetime of ScopedProfilerXXX
157 #define KY_BEGIN_PROFILE_SECONDS(s) { Kaim::ScopedProfilerSeconds scopedProfiler(s);
158 #define KY_BEGIN_PROFILE_MS(ms) { Kaim::ScopedProfilerMs scopedProfiler(ms);
159 #define KY_BEGIN_PROFILE_MKS(mks) { Kaim::ScopedProfilerMks scopedProfiler(mks);
160 
161 #define KY_BEGIN_PROFILE_SECONDS_CUMULATE(s) { Kaim::ScopedProfilerSumSeconds scopedProfiler(s);
162 #define KY_BEGIN_PROFILE_MS_CUMULATE(ms) { Kaim::ScopedProfilerSumMs scopedProfiler(ms);
163 #define KY_BEGIN_PROFILE_MKS_CUMULATE(mks) { Kaim::ScopedProfilerSumMks scopedProfiler(mks);
164 
165 #define KY_END_PROFILE }
166 
167 
168 
169 
170 
171 
172 } // namespace Kaim
173 
174 
175 #endif
Small utility class atop Kaim::Timer to profile easily.
Definition: timeprofiler.h:24
Definition: gamekitcrowddispersion.h:20
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:137
double KyFloat64
Type used internally to represent a 64-bit floating-point number.
Definition: types.h:44
float KyFloat32
Type used internally to represent a 32-bit floating-point number.
Definition: types.h:43