15 #include <sys/kdebug_signpost.h>
16 #include <os/signpost.h>
19#include "../../tracktion_core/utilities/tracktion_CPU.h"
21namespace tracktion {
inline namespace graph
33 : index (signpostIndex)
37 #pragma clang diagnostic push
38 #pragma clang diagnostic ignored "-Wdeprecated"
39 kdebug_signpost_start (index, 0, 0, 0, 0);
40 #pragma clang diagnostic pop
48 #pragma clang diagnostic push
49 #pragma clang diagnostic ignored "-Wdeprecated"
50 kdebug_signpost_end (index, 0, 0, 0, 0);
51 #pragma clang diagnostic pop
66 NamedSignpost (
const char* nameToUse)
70 if (__builtin_available (macOS 10.14, *))
71 os_signpost_interval_begin (getLog(),
id,
"",
"%s", name);
78 if (__builtin_available (macOS 10.14, *))
79 os_signpost_interval_end (getLog(),
id,
"",
"%s", name);
84 [[ maybe_unused ]]
const char* name;
86 const os_signpost_id_t
id { generateID() };
88 static os_log_t getLog()
92 if (__builtin_available (macOS 10.14, *))
94 log = os_log_create (
"", OS_LOG_CATEGORY_POINTS_OF_INTEREST);
99 static os_signpost_id_t generateID()
101 if (__builtin_available (macOS 10.14, *))
102 return os_signpost_id_generate (getLog());
141 int runsPerPrintout = 100,
142 bool printOnDestruction =
true);
151 void start()
noexcept;
170 void clear()
noexcept;
171 double getVarianceSeconds()
const;
172 double getVarianceCycles()
const;
175 void addResult (
double secondsElapsed,
uint64_t cyclesElapsed)
noexcept;
177 double meanSeconds = 0.0;
178 double m2Seconds = 0.0;
179 double maximumSeconds = 0.0;
180 double minimumSeconds = 0.0;
181 double totalSeconds = 0.0;
183 double meanCycles = 0.0;
184 double m2Cycles = 0.0;
206 bool printOnDestruction;
223 : performanceMeasurement (pm)
225 performanceMeasurement.
start();
233 performanceMeasurement.
stop();
252 : name (
std::move (name_)), runsPerPrint (runsPerPrintout), printOnDestruction (shouldPrintOnDestruction)
258 if (printOnDestruction && stats.numRuns > 0)
262inline void PerformanceMeasurement::Statistics::clear() noexcept
264 meanSeconds = m2Seconds = maximumSeconds = minimumSeconds = totalSeconds = 0;
265 meanCycles = m2Cycles = 0.0;
266 maximumCycles = minimumCycles = totalCycles = 0;
270inline void PerformanceMeasurement::Statistics::addResult (
double secondsElapsed, uint64_t cyclesElapsed)
noexcept
274 maximumSeconds = secondsElapsed;
275 minimumSeconds = secondsElapsed;
277 maximumCycles = cyclesElapsed;
278 minimumCycles = cyclesElapsed;
282 maximumSeconds =
std::max (maximumSeconds, secondsElapsed);
283 minimumSeconds =
std::min (minimumSeconds, secondsElapsed);
285 maximumCycles =
std::max (maximumCycles, cyclesElapsed);
286 minimumCycles =
std::min (minimumCycles, cyclesElapsed);
290 totalSeconds += secondsElapsed;
291 totalCycles += cyclesElapsed;
295 const double delta = secondsElapsed - meanSeconds;
296 meanSeconds += delta / (
double) numRuns;
297 const double delta2 = secondsElapsed - meanSeconds;
298 m2Seconds += delta * delta2;
303 const auto delta = cyclesElapsed - meanCycles;
304 meanCycles += delta / (
double) numRuns;
305 const double delta2 = cyclesElapsed - meanCycles;
306 m2Cycles += delta * delta2;
310inline double PerformanceMeasurement::Statistics::getVarianceSeconds()
const
312 return numRuns > 0 ? (m2Seconds / (
double) numRuns) : 0.0;
315inline double PerformanceMeasurement::Statistics::getVarianceCycles()
const
317 return numRuns > 0 ? (m2Cycles / (
double) numRuns) : 0.0;
322 auto timeToString = [] (
double secs)
324 return std::to_string ((int64_t) (secs * (secs < 0.01 ? 1000000.0 : 1000.0) + 0.5))
325 + (secs < 0.01 ?
" us" :
" ms");
329 +
"\t Seconds: Mean = " + timeToString (meanSeconds)
330 +
", min = " + timeToString (minimumSeconds)
331 +
", max = " + timeToString (maximumSeconds)
332 +
", SD = " + timeToString (
std::sqrt (getVarianceSeconds()))
333 +
", total = " + timeToString (totalSeconds) +
"\n"
346 startCycles = rdtsc();
352 const auto elapsedCycles = rdtsc() - startCycles;
356 if (runsPerPrint < 0)
359 if (stats.numRuns < runsPerPrint)
A macOS specific class to start/stop a signpost for use in Instruments.
ScopedSignpost(uint32_t signpostIndex)
Starts a signpost with a given index.
~ScopedSignpost()
Stops the signpost previously started.