载入中...
搜索中...
未找到
ClimbingTelemetry.cpp
浏览该文件的文档.
2
3#include <algorithm>
4
5namespace eve::climbing {
6namespace {
7
8template <class T>
9T nearestRank(const std::array<T, ClimbingTelemetryBuffer::Capacity>& values, std::size_t count,
10 std::size_t percentile) noexcept {
11 if (count == 0) return {};
12 const std::size_t rank = std::min(count - 1, (count * percentile + 99) / 100 - 1);
13 return values[rank];
14}
15
16} // namespace
17
19 samples_[next_] = sample;
20 next_ = (next_ + 1) % Capacity;
21 size_ = std::min(size_ + 1, Capacity);
22}
23
25 if (size_ == 0) return;
26 const std::size_t latest = next_ == 0 ? Capacity - 1 : next_ - 1;
27 samples_[latest].counters = counters;
28}
29
31 std::array<std::uint64_t, Capacity> durations{};
32 std::array<std::uint32_t, Capacity> queries{};
33 std::size_t count = 0;
34 std::uint32_t exceeded = 0;
35 std::uint32_t maximum = 0;
36 for (std::size_t index = 0; index < size_; ++index) {
37 const ClimbingTelemetrySample& sample = samples_[index];
38 if (sample.counters.workload != workload) continue;
39 durations[count] = sample.elapsedNanoseconds;
40 queries[count] = sample.counters.queryCount;
41 maximum = std::max(maximum, sample.counters.queryCount);
42 if (sample.counters.budgetState == ClimbingQueryBudgetState::Exceeded) ++exceeded;
43 ++count;
44 }
45 std::sort(durations.begin(), durations.begin() + static_cast<std::ptrdiff_t>(count));
46 std::sort(queries.begin(), queries.begin() + static_cast<std::ptrdiff_t>(count));
47
49 summary.workload = workload;
50 summary.sampleCount = static_cast<std::uint32_t>(count);
51 summary.p50Nanoseconds = nearestRank(durations, count, 50);
52 summary.p95Nanoseconds = nearestRank(durations, count, 95);
53 summary.p50QueryCount = nearestRank(queries, count, 50);
54 summary.p95QueryCount = nearestRank(queries, count, 95);
55 summary.maxQueryCount = maximum;
56 summary.budgetExceededCount = exceeded;
57 return summary;
58}
59
60} // namespace eve::climbing
Fixed-capacity, allocation-free performance telemetry for climbing workloads.
std::map< std::string, Var > values
float maximum[3]
std::uint32_t count
uint32_t index
void updateLatestCounters(ClimbingRuntimeCounters counters) noexcept
Replace counters on the most recent sample after a caller completes deferred hard validation.
void record(ClimbingTelemetrySample sample) noexcept
Append one sample, overwriting the oldest sample when full.
ClimbingTelemetrySummary summarize(ClimbingWorkload workload) const noexcept
Compute exact nearest-rank p50/p95 values for one workload.
ClimbingWorkload
Stable workload classes used by the climbing performance budgets.
Allocation-free counters produced by the latest runtime workload.
One profiler sample; elapsed time is observational and never feeds simulation state.
Fixed percentile summary for one workload without retaining dynamic storage.