54 auto children = children_durations();
55 auto by_name = absl::flat_hash_map<std::string_view, Agg>();
56 auto total = Duration::zero();
58 for (
size_t i = 0, e = spans_.size(); i != e; ++i) {
59 auto self = spans_[i].elapsed() - children[i];
60 auto& agg = by_name[spans_[i].name];
61 agg.total += spans_[i].elapsed();
68 std::ranges::sort(ordered, [](
const auto& a,
const auto& b) {
return a.second.total > b.second.total; });
70 std::println(os,
"Phase profile (flat):");
71 std::println(os,
"{:>12} {:>12} {:>7} {:>6} {}",
"total[ms]",
"self[ms]",
"self[%]",
"#runs",
"phase");
72 for (
const auto& [name, agg] : ordered) {
73 auto percent = total > Duration::zero() ? 100.0 * ms(agg.self) / ms(total) : 0.0;
74 std::println(os,
"{:>12.3f} {:>12.3f} {:>6.1f}% {:>6} {}", ms(agg.total), ms(agg.self), percent, agg.count,
77 std::println(os,
"{:>12.3f} {:>12.3f} {:>6.1f}% {:>6} {}", ms(total), ms(total), 100.0, spans_.size(),
"TOTAL");
80 auto counters = absl::btree_map<std::pair<std::string_view, std::string_view>, uint64_t>();
81 for (
const auto& span : spans_)
82 for (
const auto& [key, val] : span.counters)
83 counters[{span.name, key}] += val;
85 if (!counters.empty()) {
87 std::println(os,
"Phase counters:");
88 std::println(os,
"{:>12} {}",
"value",
"phase: counter");
89 for (
const auto& [name_key, val] : counters)
90 std::println(os,
"{:>12} {}: {}", val, name_key.first, name_key.second);
95 auto children = children_durations();
96 auto total = Duration::zero();
97 for (
const auto& span : spans_)
98 if (span.parent ==
No_Parent) total += span.elapsed();
100 std::println(os,
"Phase profile (tree):");
101 std::println(os,
"{:>12} {:>12} {:>7} {}",
"total[ms]",
"self[ms]",
"tot[%]",
"phase");
102 for (
size_t i = 0, e = spans_.size(); i != e; ++i) {
103 const auto& span = spans_[i];
104 auto self = span.elapsed() - children[i];
105 auto percent = total > Duration::zero() ? 100.0 * ms(span.elapsed()) / ms(total) : 0.0;
106 auto counters = std::string();
107 for (
const auto& [key, val] : span.counters)
108 counters += std::format(
"{}{}={}", counters.empty() ?
" [" :
" ", key, val);
109 if (!counters.empty()) counters +=
"]";
110 std::println(os,
"{:>12.3f} {:>12.3f} {:>6.1f}% {:>{}}{}{}", ms(span.elapsed()), ms(self), percent,
"",
111 span.depth * 2, span.name, counters);
113 std::println(os,
"{:>12.3f} {:>12} {:>6.1f}% {}", ms(total),
"", 100.0,
"TOTAL");
117 auto origin = spans_.empty() ? Clock::time_point{} : spans_.front().start;
119 std::println(os,
"{{\"displayTimeUnit\":\"ms\",\"traceEvents\":[");
120 for (
size_t i = 0, e = spans_.size(); i != e; ++i) {
121 const auto& span = spans_[i];
122 auto args = std::string();
123 for (
const auto& [key, val] : span.counters)
124 args += std::format(
"{}\"{}\":{}", args.empty() ?
",\"args\":{"sv :
","sv, json_escape(key), val);
125 if (!args.empty()) args +=
"}";
128 "{{\"name\":\"{}\",\"cat\":\"phase\",\"ph\":\"X\",\"pid\":1,\"tid\":1,\"ts\":{:.3f},\"dur\":{:.3f}{}}}{}",
129 json_escape(span.name), us(span.start - origin), us(span.elapsed()), args, i + 1 == e ?
"" :
",");
131 std::println(os,
"]}}");
Vector(I, I, A=A()) -> Vector< typename std::iterator_traits< I >::value_type, Default_Inlined_Size< typename std::iterator_traits< I >::value_type >, A >