xo-alloc: + timing stats + timeseries tooltips

This commit is contained in:
Roland Conybeare 2025-08-22 15:10:56 -04:00
commit 78195b0218
5 changed files with 110 additions and 40 deletions

View file

@ -14,6 +14,7 @@ set(SELF_SRCS
)
xo_add_shared_library4(${SELF_LIB} ${PROJECT_NAME}Targets ${PROJECT_VERSION} 1 ${SELF_SRCS})
xo_dependency(${SELF_LIB} xo_unit)
xo_dependency(${SELF_LIB} reflect)
xo_dependency(${SELF_LIB} callback)

View file

@ -7,6 +7,7 @@
#include "GC.hpp"
#include "Object.hpp"
#include "xo/indentlog/scope.hpp"
#include <chrono>
#include <cassert>
#include <cstddef>
@ -1037,9 +1038,9 @@ namespace xo {
}
void
GC::cleanup_phase(generation upto)
GC::cleanup_phase(generation upto, nanos dt)
{
scope log(XO_DEBUG(config_.debug_flag_));
scope log(XO_DEBUG(config_.stats_flag_));
std::size_t N0_before_gc = nursery_from()->after_checkpoint();
std::size_t N1_before_gc = nursery_from()->before_checkpoint();
@ -1098,6 +1099,7 @@ namespace xo {
this->tenured_to()->checkpoint();
if (log) {
log(xtag("gcseq_before_gc", gc_statistics_.n_gc()));
log(xtag("N0_before_gc", N0_before_gc));
log(xtag("N1_before_gc", N1_before_gc));
log(xtag("N_after_gc", N_after_gc));
@ -1107,18 +1109,6 @@ namespace xo {
log(xtag("T_after_gc", T_after_gc));
}
GcStatisticsHistoryItem item(upto,
new_alloc_z,
survive_z,
promote_z,
persist_z,
effort_z,
garbage0_z,
garbage1_z,
garbageN_z);
this->gc_history_.push_back(item);
this->incr_gc_pending_ = false;
this->gc_statistics_.include_gc(generation::nursery, N0_before_gc, N_before_gc, N_after_gc, promote_z);
@ -1129,6 +1119,23 @@ namespace xo {
// still want to update tenured stats for current alloc size
this->gc_statistics_.update_snapshot(generation::tenured, T_after_gc);
}
GcStatisticsHistoryItem item(gc_statistics_.n_gc(),
upto,
new_alloc_z,
survive_z,
promote_z,
persist_z,
effort_z,
garbage0_z,
garbage1_z,
garbageN_z,
dt);
log && log(xtag("gcseq_after_gc", gc_statistics_.n_gc()),
xtag("item", item));
this->gc_history_.push_back(item);
} /*cleanup_phase*/
void
@ -1136,6 +1143,8 @@ namespace xo {
{
scope log(XO_DEBUG(config_.stats_flag_));
auto t0 = std::chrono::steady_clock::now();
bool full_move = (upto == generation::tenured);
// TODO: RAII version in case of exceptions
@ -1146,9 +1155,7 @@ namespace xo {
/* new allocation since last GC */
std::size_t new_alloc = this->after_checkpoint();
++(gc_statistics_.gen_v_[static_cast<std::size_t>(upto)].n_gc_);
gc_statistics_.total_allocated_ += new_alloc;
gc_statistics_.total_promoted_sab_ = gc_statistics_.total_promoted_;
gc_statistics_.begin_gc(upto, new_alloc);
log && log(xtag("new_alloc", new_alloc));
@ -1176,10 +1183,13 @@ namespace xo {
log && log("step 6 : cleanup");
this->cleanup_phase(upto);
this->capture_object_statistics(upto, capture_phase::sae);
auto t1 = std::chrono::steady_clock::now();
auto dt = std::chrono::duration_cast<std::chrono::nanoseconds>(t1 - t0);
this->cleanup_phase(upto, xo::qty::qty::nanoseconds(dt.count()));
log && log("object statistics [nursery]:");
log && log(refrtag("stats", object_statistics_sab_[gen2int(generation::nursery)]));
log && log("object statistics [tenured]:");
@ -1233,6 +1243,13 @@ namespace xo {
this->request_gc(full_gc_pending_ ? generation::tenured : generation::nursery);
}
}
void
GC::enable_gc_once() {
this->enable_gc();
this->disable_gc();
}
} /*namespace gc*/
} /*namespace xo*/

View file

@ -16,6 +16,7 @@ namespace xo {
{
this->update_snapshot(after_z);
//++n_gc_;
new_alloc_z_ += alloc_z;
scanned_z_ += before_z;
survive_z_ += after_z;
@ -41,6 +42,15 @@ namespace xo {
<< ">";
}
void
GcStatistics::begin_gc(generation upto,
std::size_t new_alloc)
{
++(this->gen_v_[static_cast<std::size_t>(upto)].n_gc_);
this->total_allocated_ += new_alloc;
this->total_promoted_sab_ = total_promoted_;
}
void
GcStatistics::include_gc(generation upto,
std::size_t alloc_z,
@ -105,6 +115,7 @@ namespace xo {
<< xrtag("garbage0_z", garbage0_z_)
<< xrtag("garbage1_z", garbage1_z_)
<< xrtag("garbageN_z", garbageN_z_)
<< xrtag("dt", dt_)
<< ">";
}
@ -177,7 +188,8 @@ namespace xo {
refrtag("effort_z", x.effort_z_),
refrtag("garbage0_z", x.garbage0_z_),
refrtag("garbage1_z", x.garbage1_z_),
refrtag("garbageN_z", x.garbageN_z_));
refrtag("garbageN_z", x.garbageN_z_),
refrtag("dt", x.dt_));
}
} /*namespace print*/
} /*namespace xo*/