-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCProcessorTimer.h
More file actions
142 lines (115 loc) · 3.39 KB
/
CProcessorTimer.h
File metadata and controls
142 lines (115 loc) · 3.39 KB
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
140
141
142
/*************************************************************************************
cpl - cross-platform library - v. 0.1.0.
Copyright (C) 2016 Janus Lynggaard Thorborg (www.jthorborg.com)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
See \licenses\ for additional details on licenses associated with this program.
**************************************************************************************
file:CProcessorTimer.h
Class that measures time spend between events in clocks and walltime.
*************************************************************************************/
#ifndef CPL_CPROCESSORTIMER_H
#define CPL_CPROCESSORTIMER_H
#include "MacroConstants.h"
#include "Misc.h"
#include "Mathext.h"
#include <cstdint>
#include <cstdlib>
#ifdef CPL_MAC
#define _CPL_USE_HCLOCK
#else
#include "system/SysStats.h"
#endif
namespace cpl
{
/// <summary>
/// A class that measures current core-clocks over time.
/// Notice it may not be precise, if your thread is scheduled on another
/// core.
/// Useful when you want to measure real-time loop cpu usuage.
/// </summary>
class CProcessorTimer
{
public:
#ifdef _CPL_USE_HCLOCK
typedef decltype(cpl::Misc::TimeCounter()) cclock_t;
#else
typedef decltype(cpl::Misc::ClockCounter()) cclock_t;
#endif
CProcessorTimer()
: deltaT(), startT()
{
}
/// <summary>
/// Starts a new timing period. Calls reset() implicitly
/// </summary>
void start() noexcept
{
reset();
startT = getClocks();
}
/// <summary>
/// Ignores any time passed by until resume() is called.
/// </summary>
void pause() noexcept
{
deltaT = getClocks();
}
/// <summary>
/// Resumes time measurement. See pause().
/// </summary>
void resume() noexcept
{
startT += getClocks() - deltaT;
}
/// <summary>
/// Returns the number of clocks passed by since start() (excluding whatever happened between any pause/resumes)
/// </summary>
cclock_t getTime() const noexcept
{
return getClocks() - startT;
}
/// <summary>
/// Resets any clocks. Use start().
/// </summary>
void reset()
{
startT = 0; deltaT = 0;
}
double coreUsage() const noexcept
{
return clocksToCoreUsage(getTime());
}
/// <summary>
/// Returns a fraction, that represents how much of the core's capability was used
/// (ie. clocks_used / core_clocks_per_sec)
/// </summary>
static double clocksToCoreUsage(cclock_t clocks)
{
#ifdef _CPL_USE_HCLOCK
return cpl::Misc::TimeToSeconds(clocks);
#else
return (0.001 * clocks) / (cpl::system::CProcessor::getMHz() * 1000);
#endif
}
private:
static cclock_t getClocks()
{
#ifdef _CPL_USE_HCLOCK
return cpl::Misc::TimeCounter();
#else
return cpl::Misc::ClockCounter();
#endif
}
cclock_t deltaT, startT;
};
}; // cpl
#endif