9 #ifndef Navigation_TimeProfiler_H
10 #define Navigation_TimeProfiler_H
40 void GetMillisecondsAndRestart(
KyFloat64* ms);
41 void GetMicrosecondsAndRestart(
KyFloat64* mks);
44 void GetMillisecondsAndRestartF(
KyFloat32* ms);
45 void GetMicrosecondsAndRestartF(
KyFloat32* mks);
58 void GetMilliseconds(
KyFloat64* ms)
const;
59 void GetMicroseconds(
KyFloat64* mks)
const;
62 void GetMillisecondsF(
KyFloat32* ms)
const;
63 void GetMicrosecondsF(
KyFloat32* mks)
const;
66 KyFloat64 ComputeMicroseconds(UInt64 end)
const;
72 KY_INLINE Profiler::Profiler() { m_start = Timer::GetRawTicks(); }
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(); } }
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(); } }
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(); }
94 KY_INLINE
KyFloat64 Profiler::GetSeconds()
const {
return GetMilliseconds() * 0.001; }
95 KY_INLINE
KyFloat64 Profiler::GetMilliseconds()
const {
return GetMicroseconds() * 0.001; }
97 KY_INLINE
KyFloat32 Profiler::GetMillisecondsF()
const {
return (
KyFloat32)GetMilliseconds(); }
98 KY_INLINE
KyFloat32 Profiler::GetMicrosecondsF()
const {
return (
KyFloat32)GetMicroseconds(); }
100 inline KyFloat64 Profiler::GetMicrosecondsAndRestart()
102 UInt64 now = Timer::GetRawTicks();
103 KyFloat64 microseconds = ComputeMicroseconds(now);
108 inline KyFloat64 Profiler::GetMicroseconds()
const
110 return ComputeMicroseconds(Timer::GetRawTicks());
113 KY_INLINE
KyFloat64 Profiler::ComputeMicroseconds(UInt64 end)
const
115 const UInt64 ticksDiff = end - m_start;
116 const UInt64 elapsedTimeMicroseconds = (ticksDiff * Timer::MksPerSecond) / Timer::GetRawFrequency();
117 return (
KyFloat64)elapsedTimeMicroseconds;
126 #define KY_IMPLEMENT_SCOPED_PROFILER(class_name, time_unit, init_zero) \
127 KY_DEFINE_NEW_DELETE_OPERATORS(Stat_Default_Mem) \
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() {} \
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) };
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);
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);
165 #define KY_END_PROFILE }
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