diff options
| author | Stefan Boberg <[email protected]> | 2021-05-11 13:05:39 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-05-11 13:05:39 +0200 |
| commit | f8d9ac5d13dd37b8b57af0478e77ba1e75c813aa (patch) | |
| tree | 1daf7621e110d48acd5e12e3073ce48ef0dd11b2 /zencore/stats.cpp | |
| download | zen-f8d9ac5d13dd37b8b57af0478e77ba1e75c813aa.tar.xz zen-f8d9ac5d13dd37b8b57af0478e77ba1e75c813aa.zip | |
Adding zenservice code
Diffstat (limited to 'zencore/stats.cpp')
| -rw-r--r-- | zencore/stats.cpp | 73 |
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 |