Skip to main content

Draton GC Benchmarks - 2026-03-18

This report publishes the next public GC benchmark snapshot for commit e8f4d9e.

The purpose is still transparency:

  • publish the new GitHub Actions scorecard for the current head
  • publish the new GitHub Actions OCaml comparison for the current head
  • show the delta against the last published run instead of only showing the current numbers
  • keep the unfavorable result visible: Draton still loses all three OCaml microbench scenarios in this run

Published artifacts

What changed in this pass

This benchmark snapshot includes one more runtime optimization pass on top of the earlier March 17 baseline:

  • internal GC maps for roots, forwarding entries, large objects, and type descriptors now use a dedicated fast hasher instead of the default HashMap hasher
  • hot collector paths no longer clone TypeDescriptor values just to walk pointer offsets

That change targets exactly the remaining hot paths that still looked expensive:

  • root/protect lookup overhead
  • forwarding lookup overhead during promotion
  • descriptor lookup overhead during tracing and fixup

GitHub Actions run

  • workflow: gc-perf
  • run id: 23228923625
  • repository commit: e8f4d9e
  • result: success

GitHub Actions scorecard summary

Current run:

Scenarioelapsed_ns
young-burst3347438
promotion-chain18399359
barrier-churn7276970
old-reuse-churn31130749
large-object-burst4062662

Delta against the previous public run 23203853670:

ScenarioPrevious elapsed_nsCurrent elapsed_nsImprovement
young-burst338723233474381.17% faster
promotion-chain286682181839935935.82% faster
barrier-churn9783746727697025.62% faster
old-reuse-churn477908433113074934.86% faster
large-object-burst440233840626627.71% faster

Toolchain-facing workloads in the same run:

WorkloadStatusbuild_elapsed_nsrun_elapsed_nsExtra
gc_stress_linked_listok173002645521718897exit code 50
selfhost_bootstrapblocked78657157430-LLVM ERROR: unknown special variable

GitHub Actions OCaml comparison

Current run summary:

  • status: ok
  • scorecard_result: mixed
  • draton_wins: 0
  • scenario_count: 3
  • geometric_mean_ocaml_over_draton_median_speed_ratio: 0.2790250801150224

Per-scenario medians:

ScenarioDraton median nsOCaml median nsocaml_over_draton_median_speed_ratioResult
young-burst6830153688330.5400071740737759Draton slower
promotion-chain18987331618860.08526001286120798Draton much slower
barrier-churn8605364060260.47182918553087844Draton slower

Delta against the previous public run 23203853670:

MetricPreviousCurrentChange
young-burst ratio0.51878534355875750.54000717407377594.09% better
promotion-chain ratio0.048012321234682510.0852600128612079877.58% better
barrier-churn ratio0.37199739358226130.4718291855308784426.84% better
geometric mean ratio0.210035851973816440.279025080115022432.85% better

Interpretation:

  • the new pass clearly improved Draton on all three shared OCaml scenarios
  • the biggest gain is still on promotion-chain
  • this is real progress, not a benchmark harness change
  • Draton is still slower than OCaml on all three scenarios in this run

Local spot checks

The full local scorecard still takes longer because the script also walks the blocked self-host bootstrap path. For quick validation on the same commit, the direct scenario spot checks on the local machine were:

ScenarioDirect run elapsed_ns
young-burst5778731
promotion-chain31835046
barrier-churn15307658

These local numbers are useful for sanity-checking the direction of change, but the GitHub Actions OCaml compare above remains the authoritative same-machine comparison.

Current honest status

  • Draton is faster than before on the published scorecard.
  • Draton still does not beat OCaml on the shared microbench suite.
  • selfhost_bootstrap is still blocked in the scorecard for the same LLVM reason as before.