aboutsummaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/Util/Util_Stopwatch.h
blob: 912de6c81fa18123b3630e9c577b1e6adf60bcdd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/************************************************************************************

Filename    :   Util_Stopwatch.h
Content     :   Handy classes for making timing measurements
Created     :   June 1, 2014
Authors     :   Neil Konzen

Copyright   :   Copyright 2014 Oculus VR, Inc. All Rights reserved.

Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License");
you may not use the Oculus VR Rift SDK except in compliance with the License,
which is provided at the time of installation or download, or which
otherwise accompanies this software in either electronic or hard copy form.

You may obtain a copy of the License at

http://www.oculusvr.com/licenses/LICENSE-3.2

Unless required by applicable law or agreed to in writing, the Oculus VR SDK
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

*************************************************************************************/

#include "Kernel/OVR_Timer.h"

// NOTE: This file is designed to be included in multiple .cpp files
// with different settings of OVR_DISABLE_STOPWATCH,
// so there is no include guard or #pragma once.

namespace OVR { namespace Util {

// Declare a StopwatchTimer as a static, global, or member variable.
// Then use Stopwatch() to accumulate timings within a scope.
/*

static StopwatchTimer FooTimer("Foo", 37, .003);	// Compute average of 37 timing samples, print timing if average time is greater than .003 seconds
static StopwatchTimer BarTimer("Bar");			// Print time of each measurement

void SomeFunction()
{
	CodeNotToIncludeInTiming();

	{
		Stopwatch sw(FooTimer);	// sw times everything in its scope
		Foo();
	}	// Every 37 times through the loop, if average time of Foo() is > .003 seconds, the average time is printed with LogText()

	{
		Stopwatch sw(BarTimer);
		Bar();
	}	// Elapsed time of Bar() is printed every time

	MoreCodeNotToIncludeInTiming();
}
*/

#ifndef OVR_DISABLE_STOPWATCH

class StopwatchTimer
{
public:
	StopwatchTimer(const char* label, int printCount = 1, double printThreshold = 0.0) :
		StartTime(0),
		ElapsedTime(0),
                Label(label),
		SampleCount(0),
		PrintCount(printCount),
		PrintThreshold(printThreshold)
	{
	}

	inline void Start()
	{
		StartTime = Timer::GetSeconds();
	}

	inline void Stop()
	{
		ElapsedTime += Timer::GetSeconds() - StartTime;
		if (++SampleCount >= PrintCount)
			PrintAndReset();
	}

private:

	void PrintAndReset()
	{
		double dt = ElapsedTime / SampleCount;
        if (dt > PrintThreshold)
			LogText("%s: %.5f msec\n", Label, dt * 1000);

		// reset for next time
		ElapsedTime = 0;
		SampleCount = 0;
	}

	double StartTime;
	double ElapsedTime;
	const char* Label;
	int SampleCount;
	int PrintCount;
	double PrintThreshold;
};


class Stopwatch
{
public:
	inline Stopwatch(StopwatchTimer& timer) : Timer(&timer)	{ Timer->Start(); }
	inline ~Stopwatch()										{ Timer->Stop(); }
private:
	StopwatchTimer* Timer;
};

#else	// !OVR_DISABLE_STOPWATCH

// Non-invasive, zero-code stopwatch implementation

class StopwatchTimer
{
public:
	inline StopwatchTimer(const char* label, int printCount = 1, double printThreshold = 0.0) {}
	inline void Start()	{}
	inline void Stop()		{}
};

class Stopwatch
{
public:
	inline Stopwatch(StopwatchTimer& timer) {}
	inline ~Stopwatch()						{}
};

#endif	// OVR_DISABLE_STOPWATCH

}} // namespace OVR::Util