diff options
| author | Stefan Boberg <[email protected]> | 2021-09-30 14:44:32 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-09-30 14:44:32 +0200 |
| commit | dda5004708497e54bca99d72cf707ba63b6d7fb6 (patch) | |
| tree | 2fd5a08f23b005a7831899ea718cf6d4e95267cd /zencore/stats.cpp | |
| parent | Merge branch 'main' of https://github.com/EpicGames/zen (diff) | |
| download | zen-dda5004708497e54bca99d72cf707ba63b6d7fb6.tar.xz zen-dda5004708497e54bca99d72cf707ba63b6d7fb6.zip | |
metrics: added OperationTiming which is a useful combination of a Meter and a Histogram, intended to track frequency and duration of certain operations
Diffstat (limited to 'zencore/stats.cpp')
| -rw-r--r-- | zencore/stats.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/zencore/stats.cpp b/zencore/stats.cpp index 53086f3ec..34dc2828f 100644 --- a/zencore/stats.cpp +++ b/zencore/stats.cpp @@ -353,6 +353,78 @@ SampleSnapshot::GetValues() const ////////////////////////////////////////////////////////////////////////// +OperationTiming::OperationTiming(int32_t SampleCount) : m_Histogram{SampleCount} +{ +} + +OperationTiming::~OperationTiming() +{ +} + +void +OperationTiming::Update(int64_t Duration) +{ + m_Meter.Mark(1); + m_Histogram.Update(Duration); +} + +int64_t +OperationTiming::Max() const +{ + return m_Histogram.Max(); +} + +int64_t +OperationTiming::Min() const +{ + return m_Histogram.Min(); +} + +double +OperationTiming::Mean() const +{ + return m_Histogram.Mean(); +} + +uint64_t +OperationTiming::Count() const +{ + return m_Meter.Count(); +} + +OperationTiming::Scope::Scope(OperationTiming& Outer) : m_Outer(Outer), m_StartTick(GetHifreqTimerValue()) +{ +} + +OperationTiming::Scope::~Scope() +{ + m_Outer.Update(GetHifreqTimerValue() - m_StartTick); +} + +////////////////////////////////////////////////////////////////////////// + +void +EmitSnapshot(std::string_view Tag, OperationTiming& Stat, CbObjectWriter& Cbo) +{ + Cbo.BeginObject(Tag); + + SampleSnapshot Snap = Stat.Snapshot(); + + Cbo << "count" << Stat.Count(); + + Cbo << "rate_mean" << Stat.MeanRate(); + Cbo << "rate_1" << Stat.Rate1() << "rate_5" << Stat.Rate5() << "rate_15" << Stat.Rate15(); + + const double ToSeconds = GetHifreqTimerToSeconds(); + + Cbo << "t_avg" << Stat.Mean() * ToSeconds; + Cbo << "t_min" << Stat.Min() * ToSeconds << "t_max" << Stat.Max() * ToSeconds; + Cbo << "t_p75" << Snap.Get75Percentile() * ToSeconds << "t_p95" << Snap.Get95Percentile() * ToSeconds << "t_p99" + << Snap.Get99Percentile() * ToSeconds << "t_p999" << Snap.Get999Percentile() * ToSeconds; + + Cbo.EndObject(); +} + void EmitSnapshot(std::string_view Tag, const Histogram& Stat, CbObjectWriter& Cbo) { |