aboutsummaryrefslogtreecommitdiff
path: root/zencore/stats.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-05-11 13:05:39 +0200
committerStefan Boberg <[email protected]>2021-05-11 13:05:39 +0200
commitf8d9ac5d13dd37b8b57af0478e77ba1e75c813aa (patch)
tree1daf7621e110d48acd5e12e3073ce48ef0dd11b2 /zencore/stats.cpp
downloadzen-f8d9ac5d13dd37b8b57af0478e77ba1e75c813aa.tar.xz
zen-f8d9ac5d13dd37b8b57af0478e77ba1e75c813aa.zip
Adding zenservice code
Diffstat (limited to 'zencore/stats.cpp')
-rw-r--r--zencore/stats.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/zencore/stats.cpp b/zencore/stats.cpp
new file mode 100644
index 000000000..f8cdc8fbb
--- /dev/null
+++ b/zencore/stats.cpp
@@ -0,0 +1,73 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include "zencore/stats.h"
+#include <doctest/doctest.h>
+#include <cmath>
+#include "zencore/timer.h"
+
+//
+// Derived from https://github.com/dln/medida/blob/master/src/medida/stats/ewma.cc
+//
+
+namespace zen {
+
+static constexpr int kTickInterval = 5; // In seconds
+static constexpr double kSecondsPerMinute = 60.0;
+static constexpr int kOneMinute = 1;
+static constexpr int kFiveMinutes = 5;
+static constexpr int kFifteenMinutes = 15;
+
+static double kM1_ALPHA = 1.0 - std::exp(-kTickInterval / kSecondsPerMinute / kOneMinute);
+static double kM5_ALPHA = 1.0 - std::exp(-kTickInterval / kSecondsPerMinute / kFiveMinutes);
+static double kM15_ALPHA = 1.0 - std::exp(-kTickInterval / kSecondsPerMinute / kFifteenMinutes);
+
+static uint64_t CountPerTick = GetHifreqTimerFrequencySafe() * kTickInterval;
+static uint64_t CountPerSecond = GetHifreqTimerFrequencySafe();
+
+void
+EWMA::Tick(double Alpha, uint64_t Interval, uint64_t Count, bool IsInitialUpdate)
+{
+ double InstantRate = double(Count) / Interval;
+
+ if (IsInitialUpdate)
+ {
+ m_rate = InstantRate;
+ }
+ else
+ {
+ m_rate += Alpha * (InstantRate - m_rate);
+ }
+}
+
+double
+EWMA::Rate() const
+{
+ return m_rate * CountPerSecond;
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+TEST_CASE("Stats")
+{
+ SUBCASE("Simple")
+ {
+ EWMA ewma1;
+ ewma1.Tick(kM1_ALPHA, CountPerSecond, 5, true);
+
+ CHECK(ewma1.Rate() - 5 < 0.001);
+
+ for (int i = 0; i < 60; ++i)
+ ewma1.Tick(kM1_ALPHA, CountPerSecond, 10, false);
+
+ CHECK(ewma1.Rate() - 10 < 0.001);
+
+ ewma1.Tick(kM1_ALPHA, CountPerSecond, 10, false);
+ }
+}
+
+void
+stats_forcelink()
+{
+}
+
+} // namespace zen