#pragma once #include "SqTime.h" /** * Unfinished time class. Meant to be inserted into other code (like VCV Rack). * Averages states over time. * Will printf states every now and then. * Many ways to improve this - printing from a different thread is one. */ class TimeStatsCollector { public: TimeStatsCollector() { } /** * Instrumented code calls this to start a timing sample. */ void start() { startTime = SqTime::seconds(); } /** * Instrumented code calls this to step timing * @param numLoops is the number of "events" since start was called. */ void stop(int numLoops) { const double stop = SqTime::seconds(); const double delta = stop - startTime; numDataPoints += numLoops; totalTimeFrame += delta; if (delta < minTime) { minTime = delta; } else if (delta > maxTime) { maxTime = delta; } if (numDataPoints > 1000) { const double avgTime = totalTimeFrame / numDataPoints; const double srTime = (1.0 / 44100.0); const double ratio = avgTime / srTime; totalTimeGlobal += avgTime; numFramesInTotal++; double runningAvg = totalTimeGlobal / (numFramesInTotal * srTime); printf("\nsrTime=%f avtTime=%f\n", srTime, avgTime); printf("this block: %f%% min=%f max=%f globalmax=%f running avg=%f\n", ratio * 100, minTime, maxTime, globalMax, runningAvg * 100); if (globalMax < maxTime) { globalMax = maxTime; } numDataPoints=0; totalTimeFrame = 0; minTime = 1000000000; maxTime = -100000000000; } } private: int numDataPoints = 0; // number of samples in current frame. double totalTimeFrame = 0; // Time spent in the test code this frame. double startTime; // Start time if current sample double minTime = 1000000000; // shorted time observed in current frame double maxTime = -100000000000;// longest time observed in current frame. double globalMax = -100000000000; double totalTimeGlobal = 0; int numFramesInTotal = 0; };