Published benchmark results for the gcmon GC monitor. This repo hosts the analysis pipeline (extraction, notebook execution, compression) and the historical gallery of runs across CPython versions and benchmark configurations.
gcmon-results/
├── gcmon_results/ # the installable Python package
├── notebooks/ # source notebooks (cyclotron, pyperformance)
└── runs/ # published runs, one folder per (date, dataset)
├── README.md # auto-regenerated gallery
└── YYYY-MM-DD/
└── <dataset>/
├── meta.json
├── <trace>.pftrace.zst
├── <dataset>.ipynb # executed notebook
├── slices.csv.zst
├── workers.csv.zst
├── figs/*.png
├── summary/*.csv
└── README.md
# Install dependencies and the package into a project-local .venv/
poetry install
# Verify the install
poetry run gcmon-results --helpgcmon-results exposes three subcommands.
Extracts GC trace data into --out:
slices.csv.zst— per-event slice table (zstd)workers.csv.zst— per-benchmark workers (zstd)
poetry run gcmon-results prepare cyclotron \
--trace /path/to/cyclotron.pftrace \
--benchmarks /path/to/cyclotron-results.json \
--out runs/2026-07-02/cyclotron
poetry run gcmon-results prepare pyperformance \
--trace /path/to/trace.pftrace \
--benchmarks /path/to/pyperf-results.json \
--out runs/2026-07-02/pyperformance--trace accepts both .pftrace (uncompressed) and .pftrace.zst
(zstd-compressed) files. Compressed input is decompressed to a temp
file in --out and removed when the run completes.
Orchestrates the full publish flow:
preparethe trace (subprocess to the CLI)- Papermill-execute
notebooks/<dataset>.ipynbinto the dataset folder jupyter nbconvert --to markdownthe executed notebook toREADME.md- Always recompress the trace to
<stem>.pftrace.zstat zstd level 19 - Compute SHA-256 of the uncompressed trace bytes
- Write
meta.json(date, dataset, gcmon version, host, sizes, hash, embedded metadata) - Rebuild
runs/README.md git add,git commit,git push(push skipped with--no-push)
poetry run gcmon-results publish cyclotron \
--trace /path/to/cyclotron.pftrace \
--benchmarks /path/to/cyclotron-results.json \
--gcmon-version v0.3.1 \
--no-pushFlags:
--out-date YYYY-MM-DD— publication date (default: today UTC)--gcmon-version VER— version string recorded inmeta.json--results-root DIR— runs directory (default:./runs)--notebooks-root DIR— notebooks directory (default:./notebooks)--no-push— skip thegit pushstep--force— overwriteruns/<date>/<dataset>/if it exists
Prints a table of published runs in the current checkout, one row per
(date, dataset) pair, including gcmon_version, worker count, and
event count.
Traces live wherever the user keeps them on disk. publish takes any
path via --trace. This repo contains no working inputs directory.
Open runs/README.md to see the table of contents. Each date block has
a bullet per dataset linking to the executed notebook.
Zstd-compressed, semicolon-separated CSV. One row per gc.* slice event in the trace.
Columns:
upid(int) — unique process id in the tracepid(int) — OS process id (one worker per pid)name(str) — short name for the worker (cyclotron: e.g. "cs10-eb0-lo100"; pyperformance: e.g. "richards")slice_name(str) — phase name, e.g. "GC Pause"gen(int) — 0/1/2; null for non-gen phasesstart_ts(int) — nanoseconds since trace startend_ts(int) — start_ts + dur, in nanosecondsargs(str) — debug args joined as "k=v, k=v" (may be empty)
Zstd-compressed, semicolon-separated CSV. One row per benchmark worker.
Common columns (both datasets):
upid(int) — unique process id in the tracepid(int) — OS process idcmdline(str) — full command line of the worker processstart_ts(int) — nanoseconds since trace startbenchmark_name(str) — short name for the benchmarkbenchmark_duration(float) — wall-clock duration from results JSON, msperfetto_duration(float) — perfetto-tracked duration, ms
Pyperformance-only columns:
benchmark_description(str) — description of the benchmark variantis_calibration(int) — 1 if calibration run, 0 otherwise
One per dataset, written by publish. Fields:
date_utc(str) — "YYYY-MM-DD"dataset(str) — "cyclotron" or "pyperformance"gcmon_version(str) — user-supplied, e.g. "v0.3.1"host(str) — platform.node()python_version(str) — platform.python_version()trace_sha256(str) — SHA-256 of the uncompressed .pftrace bytestrace_bytes_uncompressed(int)trace_bytes_compressed(int) — size of the published .pftrace.zsttrace_metadata(dict) — always present; may be empty {} until gcmon starts embedding metadata
Written by the notebooks. Files differ by dataset:
Cyclotron:
pause_stats.csv—name,gen,slice_name,count,mean,median,std,min,p50,p95,p99,max,sumslice_share.csv—slice_name,share_pctgen2_tail.csv—name,slice_name,count,mean,p99,maxboxplot_stats.csv—cs,eb,lo,gen,slice_name,count,mean,median,p50,p95,p99,maxper_run_metrics.csv—pid,name,gen,slice_name,count,durg0_worst_run.csv—name,count,dur, ...
Pyperformance:
pause_stats.csv—benchmark_name,gen,slice_name,n_runs,count,mean,median,std,min,p50,p95,p99,max,sumslice_share.csv—slice_name,share_pctgen2_tail.csv—benchmark_name,slice_name,count,mean,p99,maxboxplot_stats.csv—benchmark_name,gen,slice_name,count,mean,median,p50,p95,p99,maxper_run_metrics.csv—upid,pid,name,gen,slice_name,count,durper_benchmark_summary.csv
Auto-regenerated table of contents. Newest date first; one ## <date> heading per published date with a bullet per dataset linking to the executed notebook <date>/<dataset>/gc_pause_analysis.ipynb.
- Python 3.13+
- Poetry 2.x for dependency management
- All runtime dependencies are declared in
pyproject.tomland installed into a project-local.venv/bypoetry install
MIT — see LICENSE.