gwnavruntime/base/timeprofiler.h Source File

timeprofiler.h
Go to the documentation of this file.
1 /*
2 * Copyright 2016 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 #pragma once
8 
11 
12 namespace Kaim
13 {
14 
17 class Profiler
18 {
19  KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem)
20 
21 public:
22  Profiler() { m_start = Timer::GetRawTicks(); }
23 
24  // ------------------- Get time since start and reset start -------------------
25 
26  KyFloat64 GetSecondsAndRestart();
27  KyFloat64 GetMillisecondsAndRestart() { return GetSecondsAndRestart() * 1000.0; }
28  KyFloat64 GetMicrosecondsAndRestart() { return GetSecondsAndRestart() * 1000000.0; }
29 
30  KyFloat32 GetSecondsAndRestartF() { return (KyFloat32)GetSecondsAndRestart(); }
31  KyFloat32 GetMillisecondsAndRestartF() { return (KyFloat32)GetMillisecondsAndRestart(); }
32  KyFloat32 GetMicrosecondsAndRestartF() { return (KyFloat32)GetMicrosecondsAndRestart(); }
33 
34  void GetSecondsAndRestart(KyFloat64* s) { if (s) { *s = GetSecondsAndRestart(); } }
35  void GetMillisecondsAndRestart(KyFloat64* ms) { if (ms) { *ms = GetMillisecondsAndRestart(); } }
36  void GetMicrosecondsAndRestart(KyFloat64* mks) { if (mks) { *mks = GetMicrosecondsAndRestart(); } }
37 
38  void GetSecondsAndRestartF(KyFloat32* s) { if (s) { *s = GetSecondsAndRestartF(); } }
39  void GetMillisecondsAndRestartF(KyFloat32* ms) { if (ms) { *ms = GetMillisecondsAndRestartF(); } }
40  void GetMicrosecondsAndRestartF(KyFloat32* mks) { if (mks) { *mks = GetMicrosecondsAndRestartF(); } }
41 
42  // ------------------- Get time since start, does not change start -------------------
43 
44  KyFloat64 GetSeconds() const { return ComputeSeconds(Timer::GetRawTicks()); }
45  KyFloat64 GetMilliseconds() const { return GetSeconds() * 1000.0; }
46  KyFloat64 GetMicroseconds() const { return GetSeconds() * 1000000.0; }
47 
48  KyFloat32 GetSecondsF() const { return (KyFloat32)GetSeconds(); }
49  KyFloat32 GetMillisecondsF() const { return (KyFloat32)GetMilliseconds(); }
50  KyFloat32 GetMicrosecondsF() const { return (KyFloat32)GetMicroseconds(); }
51 
52  void GetSeconds(KyFloat64* s) const { if (s) { *s = GetSeconds(); } }
53  void GetMilliseconds(KyFloat64* ms) const { if (ms) { *ms = GetMilliseconds(); } }
54  void GetMicroseconds(KyFloat64* mks) const { if (mks) { *mks = GetMicroseconds(); } }
55 
56  void GetSecondsF(KyFloat32* s) const { if (s) { *s = GetSecondsF(); } }
57  void GetMillisecondsF(KyFloat32* ms) const { if (ms) { *ms = GetMillisecondsF(); } }
58  void GetMicrosecondsF(KyFloat32* mks) const { if (mks) { *mks = GetMicrosecondsF(); } }
59 
60 private:
61  KyFloat64 ComputeSeconds(UInt64 end) const;
62 
63 private:
64  UInt64 m_start; // raw ticks
65 };
66 
67 
68 KY_INLINE KyFloat64 Profiler::GetSecondsAndRestart()
69 {
70  UInt64 now = Timer::GetRawTicks();
71  KyFloat64 seconds = ComputeSeconds(now);
72  m_start = now;
73  return seconds;
74 }
75 
76 
77 KY_INLINE KyFloat64 Profiler::ComputeSeconds(UInt64 end) const
78 {
79  const UInt64 ticksDiff = end - m_start;
80  KyFloat64 secondsPerTick = 1.0 / (KyFloat64)Timer::GetRawFrequency(); // we may consider a static here
81  return (KyFloat64)ticksDiff * secondsPerTick;
82 }
83 
84 //-----------------------------------------------------------------
85 // macro used to internally to implement ScopedProfilerXXX classes
86 #define KY_IMPLEMENT_SCOPED_PROFILER(class_name, time_unit, init_zero) \
87 KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem) \
88 public: \
89  class_name(KyFloat32* time) : m_time(time) { if (m_time) init_zero(); } \
90  ~class_name() { if (m_time) { *m_time += (KyFloat32)(m_profiler.GetMicroseconds() * time_unit); } } \
91  void DoInitZero() { *m_time = 0.0f; } \
92  void DoNotInitZero() {} \
93 private: \
94  KyFloat32* m_time; \
95  Profiler m_profiler;
96 
97 //-----------------------------------------------------------------
98 // ScopedProfilerXXX classes
99 // Usage:
100 // MyFunc() {
101 // ScopedProfilerXXX ScopedProfilerXXX(&someKyFloat32);
102 // ...
103 // }
104 // The difference between ScopedProfilerXXX and ScopedProfilerSumXXX is that
105 // ScopedProfilerXXX does someKyFloat32 = timeSpent
106 // ScopedProfilerSumXXX does someKyFloat32 += timeSpent
107 class ScopedProfilerSeconds { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerSeconds , 0.000001, DoInitZero ) };
108 class ScopedProfilerMs { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerMs , 0.001 , DoInitZero ) };
109 class ScopedProfilerMks { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerMks , 1.0 , DoInitZero ) };
110 class ScopedProfilerSumSeconds { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerSumSeconds, 0.000001, DoNotInitZero) };
111 class ScopedProfilerSumMs { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerSumMs , 0.001 , DoNotInitZero) };
112 class ScopedProfilerSumMks { KY_IMPLEMENT_SCOPED_PROFILER(ScopedProfilerSumMks , 1.0 , DoNotInitZero) };
113 
114 //-----------------------------------------------------------------
115 // Small macros atop ScopedProfilerXXX.
116 // Not very interesting, allows to avoid the use of brackets {} to limit the lifetime of ScopedProfilerXXX
117 #define KY_BEGIN_PROFILE_SECONDS(s) { Kaim::ScopedProfilerSeconds scopedProfiler(s);
118 #define KY_BEGIN_PROFILE_MS(ms) { Kaim::ScopedProfilerMs scopedProfiler(ms);
119 #define KY_BEGIN_PROFILE_MKS(mks) { Kaim::ScopedProfilerMks scopedProfiler(mks);
120 
121 #define KY_BEGIN_PROFILE_SECONDS_CUMULATE(s) { Kaim::ScopedProfilerSumSeconds scopedProfiler(s);
122 #define KY_BEGIN_PROFILE_MS_CUMULATE(ms) { Kaim::ScopedProfilerSumMs scopedProfiler(ms);
123 #define KY_BEGIN_PROFILE_MKS_CUMULATE(mks) { Kaim::ScopedProfilerSumMks scopedProfiler(mks);
124 
125 #define KY_END_PROFILE }
126 
127 
128 } // namespace Kaim
129 
130 
Small utility class atop Kaim::Timer to profile easily.
Definition: timeprofiler.h:17
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
double KyFloat64
double
Definition: types.h:33
std::uint64_t UInt64
uint64_t
Definition: SF_Types.h:138
float KyFloat32
float
Definition: types.h:32