The open source OpenXR runtime
1// Copyright 2024, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Live stats tracking and printing.
6 * @author Jakob Bornecrantz <jakob@collabora.com>
7 * @ingroup aux_util
8 */
9
10#include "u_live_stats.h"
11
12#include <algorithm>
13
14
15/*
16 *
17 * 'Exported' functions.
18 *
19 */
20
21extern "C" void
22u_ls_ns_get_and_reset(struct u_live_stats_ns *uls, uint64_t *out_median, uint64_t *out_mean, uint64_t *out_worst)
23{
24 uint32_t count = uls->value_count;
25
26 if (count == 0) {
27 *out_median = 0;
28 *out_mean = 0;
29 *out_worst = 0;
30 return;
31 }
32
33 std::sort(&uls->values[0], &uls->values[count]);
34
35 uint64_t worst = uls->values[count - 1]; // Always greater then 0.
36 uint64_t median = uls->values[count / 2];
37
38 uint64_t mean = 0;
39 for (uint32_t i = 0; i < count; ++i) {
40 mean += uls->values[i] / count;
41 }
42
43 uls->value_count = 0;
44 *out_median = median;
45 *out_mean = mean;
46 *out_worst = worst;
47}
48
49extern "C" void
50u_ls_ns_print_header(u_pp_delegate_t dg)
51{
52 // "xxxxYYYYzzzzWWWW M'TTT'###.FFFms M'TTT'###.FFFms M'TTT'###.FFFms"
53 u_pp(dg, " name median mean worst");
54}
55
56extern "C" void
57u_ls_ns_print_and_reset(struct u_live_stats_ns *uls, u_pp_delegate_t dg)
58{
59 uint64_t median, mean, worst;
60 u_ls_ns_get_and_reset(uls, &median, &mean, &worst);
61
62 u_pp(dg, "%16s", uls->name);
63 u_pp_padded_pretty_ms(dg, median);
64 u_pp_padded_pretty_ms(dg, mean);
65 u_pp_padded_pretty_ms(dg, worst);
66}