ci: Standardize benchmarks and input constants - #467

Merged
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks
Jul 9, 2026
Merged

ci: Standardize benchmarks and input constants#467
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks

Conversation

@samuelburnham

@samuelburnhamsamuelburnham commented Jul 2, 2026

Copy link
Copy Markdown
Member

CI benchmarking:

  • ix bench Lean CLI for comprehensive local and CI benchmarks of ix compilation and typechecking over multiple backends, against a curated set of constants. Provides comparative runs against local history, or current main (fetches cached bencher.dev results), and formats them in a Markdown table.
  • Updates bench-pr.yml to use this framework and print the Markdown table as a PR comment (see example comments below).
  • Updates bench-main.yml to fully bench all backends and upload them to bencher.dev, except for RISC-V proving for now due to GPU requirements. SP1 is also left as a TODO.
  • Now tracks per-phase span measurements from tracing-texray as first-class benchmark metrics, and uploads them to bencher.dev for regression testing and also direct PR comparison in the comment table with a collapsible drop-down view (not fully tested).
  • Adds a RAM watchdog via systemd-run cgroups to prevent an OOM constant from killing the runner and failing the workflow.
  • Moves the benchmark binaries onto AVX-512-compatible runner after testing that the Warpbuild 32 vCPU runner (AMD EPYC 9R45 in all my tests) has full AVX-512 support. This should provide a one-time speedup that more accurately tracks production performance.

Usage

Local benchmarks:

# Compare local runs
ix bench run --backend aiur --env InitStd --mode execute --consts Nat.add_comm --ixe initstd.ixe
ix bench compare --backend aiur --env InitStd --mode execute --consts Nat.add_comm
# Compare against main
ix bench fetch-main --sha $(git rev-parse origin/main) \
--backend aiur --mode execute --consts Nat.add_comm --out main.json
ix bench compare --backend aiur --env InitStd --mode execute \
--main main.json --pr .lake/benches/aiur-InitStd-execute.json

PR comparative benchmarks against main:

!benchmark [aiur] [zisk] [sp1] [ooc] [compile] | all [execute]
# Optional env vars
BENCH_ENVS=InitStd,Mathlib
BENCH_FULL=1 # the env's full curated set (56 InitStd / 10 Mathlib consts) instead of the default primary subset (17 InitStd / 2 Mathlib)
BENCH_SHARD=1 # restrict to the multi-shard target constants
RUST_LOG=info

Successful runs:

Merge after argumentcomputer/tracing-texray#3

Note

Before merge:

  • Bencher console: rename aiur-typecheck-x64-32x → aiur-check-prove-x64-32x, zisk-check-x64-32x → zisk-check-execute-x64-32x; archive stale shard-cycles:N measures.
  • Delete the old threshold Git tags for aiur as the names have been updated

@samuelburnham
samuelburnhamforce-pushed the sb/ci-benchmarks branch 7 times, most recently from 07264b9 to f1ff88aCompareJuly 3, 2026 20:39
Comment thread.github/workflows/bench-pr.yml Fixed
Comment thread.github/workflows/bench-pr.yml Fixed
@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b56201f

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

No result tables were produced — see the workflow logs.

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 70d60b8

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%file-size (main)file-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.222 sn/an/a24.99Kn/an/a306.41 MiBn/an/a105492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqOOM6.86Kn/aOOM264.7 msn/aOOM1.16 GiBn/a
String.splitOOM6.71Kn/aOOM264.0 msn/aOOM971.84 MiBn/a
InitStdn/a6.08Kn/an/a14.644 sn/an/a1.48 GiBn/a
List.mergeSortOOM5.56Kn/aOOM261.5 msn/aOOM802.59 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendOOM5.09Kn/aOOM529.6 msn/aOOM998.39 MiBn/a
Char.ofOrdinal_le_of_leOOM3.44Kn/aOOM773.9 msn/aOOM980.05 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqOOM2.38Kn/aOOM764.8 msn/aOOM841.74 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqOOM2.37Kn/aOOM764.8 msn/aOOM977.59 MiBn/a
Vector.appendOOM1.96Kn/aOOM254.4 msn/aOOM665.40 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqOOM1.79Kn/aOOM1.015 sn/aOOM853.80 MiBn/a
Nat.gcd_commOOM1.53Kn/aOOM254.2 msn/aOOM640.46 MiBn/a
Array.extract_appendOOM1.52Kn/aOOM1.017 sn/aOOM1.04 GiBn/a
Vector.extract_append._proof_2OOM1.29Kn/aOOM1.012 sn/aOOM916.29 MiBn/a
String.appendOOM1.21Kn/aOOM253.1 msn/aOOM1.01 GiBn/a
Int.gcdOOM823.880n/aOOM252.5 msn/aOOM616.14 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualOOM821.770n/aOOM6.895 sn/aOOM1.73 GiBn/a
Nat.sub_le_of_le_addOOM673.120n/aOOM252.6 msn/aOOM568.05 MiBn/a
Nat.add_commOOM166.670n/aOOM252.0 msn/aOOM457.39 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 431ae38

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a3.955 sn/an/a26.67Kn/an/a306.41 MiBn/an/a105492n/an/a10.67 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.87Kn/an/a264.4 msn/an/a1.19 GiBn/a
String.splitn/a6.72Kn/an/a263.8 msn/an/a1.07 GiBn/a
InitStdn/a6.41Kn/an/a13.881 sn/an/a1.47 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.7 msn/an/a858.98 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.10Kn/an/a528.9 msn/an/a1.01 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a774.0 msn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.5 msn/an/a880.31 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.6 msn/an/a815.45 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.6 msn/an/a979.52 MiBn/a
Vector.appendn/a1.95Kn/an/a254.8 msn/an/a667.94 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a254.9 msn/an/a681.33 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.01 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.07 GiBn/a
String.appendn/a1.21Kn/an/a252.8 msn/an/a965.88 MiBn/a
Int.gcdn/a824.190n/an/a252.4 msn/an/a619.82 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a822.230n/an/a6.891 sn/an/a1.72 GiBn/a
Nat.sub_le_of_le_addn/a673.260n/an/a252.5 msn/an/a564.67 MiBn/a
Nat.add_commn/a166.640n/an/a252.0 msn/an/a451.35 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 7d3388b

backends: ooc=execute compile=execute · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a4.352 sn/an/a24.24Kn/an/a306.41 MiBn/an/a105,492n/an/a10.59 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.15 GiBn/a
String.splitn/a6.71Kn/an/a263.9 msn/an/a1.05 GiBn/a
InitStdn/a6.41Kn/an/a13.882 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a838.87 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.5 msn/an/a982.43 MiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.9 msn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.7 msn/an/a917.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.8 msn/an/a812.00 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.01 GiBn/a
Vector.appendn/a1.96Kn/an/a254.3 msn/an/a659.75 MiBn/a
Nat.gcd_commn/a1.54Kn/an/a253.9 msn/an/a643.67 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a920.13 MiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a978.00 MiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.02 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a853.640n/an/a6.637 sn/an/a1.80 GiBn/a
Int.gcdn/a824.010n/an/a252.4 msn/an/a612.75 MiBn/a
Nat.sub_le_of_le_addn/a673.230n/an/a252.5 msn/an/a568.57 MiBn/a
Nat.add_commn/a166.670n/an/a252.0 msn/an/a467.85 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 1103162

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a4.301 sn/an/a24.53Kn/an/a306.41 MiBn/an/a105,492n/an/a10.61 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.33 GiBn/a
String.splitn/a6.71Kn/an/a264.3 msn/an/a1.12 GiBn/a
InitStdn/a6.30Kn/an/a14.129 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a931.07 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.7 msn/an/a1.02 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.7 msn/an/a887.48 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a765.2 msn/an/a841.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.08 GiBn/a
Vector.appendn/a1.96Kn/an/a254.4 msn/an/a669.67 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a1.79Kn/an/a1.015 sn/an/a914.25 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a255.3 msn/an/a657.64 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.16 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.11 GiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.08 GiBn/a
Int.gcdn/a823.880n/an/a252.5 msn/an/a607.91 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a821.940n/an/a6.893 sn/an/a1.64 GiBn/a
Nat.sub_le_of_le_addn/a673.360n/an/a252.5 msn/an/a547.86 MiBn/a
Nat.add_commn/a166.540n/an/a252.2 msn/an/a435.36 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b82aed8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.947 sn/an/a26.73Kn/an/a11.24 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.412 sn/an/a8.55Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.404 sn/an/a884.740n/an/a1.91 GiBn/a
Array.extract_appendn/a1.017 sn/an/a1.52Kn/an/a1.25 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.5 msn/an/a3.43Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.09 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.15 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.6 msn/an/a5.07Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a264.7 msn/an/a6.70Kn/an/a1.19 GiBn/a
List.mergeSortn/a262.3 msn/an/a5.54Kn/an/a998.22 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a765.08 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a702.54 MiBn/a
Nat.sub_le_of_le_addn/a253.2 msn/an/a671.490n/an/a601.42 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.01 GiBn/a
Int.gcdn/a252.5 msn/an/a823.710n/an/a636.20 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.730n/an/a484.27 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 930ebb8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.355 sn/an/a24.22Kn/an/a11.14 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.409 sn/an/a8.55Kn/an/a2.03 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.98 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.23 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.20 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.2 msn/an/a5.08Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.8 msn/an/a6.81Kn/an/a1.46 GiBn/a
String.splitn/a265.0 msn/an/a6.69Kn/an/a1.31 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1013.36 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a891.58 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a745.38 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.13 GiBn/a
Int.gcdn/a252.5 msn/an/a823.670n/an/a762.65 MiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.360n/an/a651.23 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.570n/an/a508.57 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs d69aaee

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.231 sn/an/a24.93Kn/an/a11.03 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.159 sn/an/a8.76Kn/an/a2.09 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.090n/an/a2.04 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.10 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a939.29 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.4 msn/an/a2.38Kn/an/a1014.35 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.4 msn/an/a2.37Kn/an/a1.25 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.15 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.51 GiBn/a
String.splitn/a265.1 msn/an/a6.69Kn/an/a1.25 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1008.04 MiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a775.05 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a730.16 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.24 GiBn/a
Nat.sub_le_of_le_addn/a252.7 msn/an/a672.780n/an/a616.39 MiBn/a
Int.gcdn/a252.5 msn/an/a823.830n/an/a666.57 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a499.68 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!bencher-thresholds-reset all

@github-actionsgithub-actionsBot added the bencher-thresholds-reset:all bencher baseline reset queued on merge label Jul 8, 2026
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset queued for: all — will anchor to the merge commit when this PR merges.

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 8595ee8

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.258 sn/an/a24.78Kn/an/a11.27 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.158 sn/an/a8.76Kn/an/a2.04 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.140n/an/a2.01 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a988.55 MiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.32 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.29 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.24 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.9 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.3 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a265.4 msn/an/a6.68Kn/an/a1.26 GiBn/a
List.mergeSortn/a261.9 msn/an/a5.55Kn/an/a1004.43 MiBn/a
Nat.gcd_commn/a254.8 msn/an/a1.53Kn/an/a813.46 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a740.42 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.08 GiBn/a
Nat.add_commn/a252.6 msn/an/a166.290n/an/a503.77 MiBn/a
Int.gcdn/a252.5 msn/an/a823.900n/an/a707.26 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.440n/an/a634.98 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 94e942d

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.050 sn/an/a26.05Kn/an/a11.11 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.426 sn/an/a8.54Kn/an/a2.00 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.149 sn/an/a921.510n/an/a1.97 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.13 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a991.18 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.22 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.0 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.37 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.28 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a990.69 MiBn/a
Nat.gcd_commn/a255.1 msn/an/a1.53Kn/an/a776.26 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a681.59 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.220n/an/a604.52 MiBn/a
Int.gcdn/a252.5 msn/an/a823.790n/an/a672.67 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.760n/an/a477.46 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5fa582b

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.993 sn/an/a26.42Kn/an/a11.05 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.677 sn/an/a8.34Kn/an/a2.11 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.148 sn/an/a921.570n/an/a1.86 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.12 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.25 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.17 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.38 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1.03 GiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a855.45 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a715.77 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.6 msn/an/a673.030n/an/a612.18 MiBn/a
Int.gcdn/a252.5 msn/an/a823.860n/an/a724.20 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.550n/an/a479.64 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 3c3d090

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.039 sn/an/a26.12Kn/an/a11.25 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.174 sn/an/a8.75Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.99 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.21 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.30 GiBn/a
Char.ofOrdinal_le_of_len/a775.2 msn/an/a3.43Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.08 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.3 msn/an/a5.08Kn/an/a1.14 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.4 msn/an/a6.82Kn/an/a1.30 GiBn/a
String.splitn/a265.2 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1012.01 MiBn/a
Nat.gcd_commn/a254.9 msn/an/a1.53Kn/an/a783.17 MiBn/a
Vector.appendn/a254.4 msn/an/a1.96Kn/an/a736.90 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a956.42 MiBn/a
Int.gcdn/a252.4 msn/an/a824.030n/an/a669.97 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.580n/an/a605.84 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a482.89 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 8, 2026 21:46
arthurpaulino
arthurpaulino previously approved these changes Jul 9, 2026
Lowering the witness cap below Zisk's built-in default (10) was measured to
have a negligible effect on host RAM and prove time for the kernel typecheck
workload, so the CLI override (which defaulted to 5) is removed and the prover
uses EmbeddedOpts::default(). Drop the now-stale flag mentions and per-RAM
tuning guidance from the README, the cost-model doc, and the shard.rs model
comments.
Rebased onto main (post #411 + #459) and integrated with the renamed
bench-main.yml and reworked bencher-track interface.
- Benchmarks/Vectors.csv: single shared source of truth (71 library constants
from Init/Std/Mathlib/Lean). Consumed by Aiur (bench-typecheck --manifest),
the zkVM hosts, and shell.
- bench-pr.yml: `!benchmark [aiur] [zisk] [sp1|all] [execute|prove]` over the
curated set, posting a main-vs-PR table; main results cached by base SHA.
Hardened: comment body from env (no injection), allowlisted env parsing.
- .github/scripts/{bench.py,run.sh}: parse/manifest/compare/comment, and the
compile-.ixe + backend driver (cycles/execute-time/throughput/peak-rss, plus
shards/max-shard-cycles for sharded runs).
- .github/actions/install-{sp1,zisk}: shared zkVM toolchain + deps install,
used by bench-pr.yml, bench-main.yml, and riscv-bench.yml.
- bench-main.yml: add zkvm-execute (Zisk/SP1 cycle counts + time/RAM) and
native-check (native parallel `ix check --anon` throughput) jobs, using the
new bencher-track workload/thresholds interface.
- bench-typecheck: add --constant / --skip-deps (align with the zkVM hosts;
--skip-deps replaces --subject-only) and --execute-only (fast execute path).
issue_comment workflows only run from the default branch, so the `!benchmark`
path can't be exercised on a PR branch. Add a pull_request trigger (base/head
from the PR payload; empty comment → parser defaults) to test pre-merge.
Revert before merge — delete the `pull_request:` trigger; the dual base/head
resolution and `|| pull_request.number` fallbacks are harmless to keep.
Revert the cgroup mode (and the earlier RLIMIT_DATA layer): back to the
plain tree-RSS sampler, sudo-free and identical everywhere. The burst
problem is handled by cadence instead of a kernel cap: sampling drops
from ~1s to 0.2s once the tree is within 20 GB of the ceiling (100 GB
at the default 120), and the post-TERM grace re-checks every 0.2s,
KILLing immediately while the tree is still at the ceiling. Worst-case
overshoot shrinks from GB-per-second x seconds to x ~0.4s.
ix bench run still hard-fails when the watchdog script is missing — an
unenforced ceiling is not a benchmark run.
The flat 120 was a leftover from the RLIMIT_DATA era (a VA cap needed
fixed slack above RSS); for the sampler it protects nothing on machines
with less RAM and leaves ~3 GB of headroom on the 123 GiB runner. Back
to MemTotal minus 12 GiB (runner: 111; 64 GiB workstation: 52), which
the adaptive fast-cadence zone sits under wherever the run happens.
Same lesson aiur taught: shared measure names (peak-rss, throughput)
mean that mode's phase, so a future zisk/sp1 prove mode needs its own
testbed — and an unsuffixed zisk-check silently meaning "execute only"
is the asymmetry we just cleaned up for aiur. Renaming now rides the
merge's existing bencher migration (console rename + reset-all) instead
of paying a second cycle later.
The zkvm job derives testbed/workload from the cell's mode, so a prove
cell would land on zisk-check-prove-x64-32x with no workflow edits.
The per-cell .ixe cache only helped re-runs: on a fresh commit every
same-env cell missed the cold cache simultaneously and paid its own ix
compile in parallel. A prepare job (matrix over ci parse's new
prep-envs output — envs consumed by non-compile cells) now compiles
each .ixe once and publishes it under the key the cells already
restore, so cells start warm. Skipped for compile-only requests, whose
cells compile fresh by design; a prepare failure stops the cells (they
would just re-fail the same compile lazily).
Two more runner deaths, two measured causes:
1. aiur prove crossed the ceiling by 13 GB inside one 0.2s sample —
first-touch of pre-reserved prover buffers grows RSS at memory
bandwidth, which no cadence outruns. Headroom widens to 24 GiB (the
~123 GiB runner's ceiling drops 111 → 99) so the worst measured
overshoot plus OS/agent fits, and the sampler now TERMs on a
one-sample linear projection (level + last delta), buying back one
sample of reaction time — verified live: the kill fires before the
ceiling is crossed on a steep ramp.
2. zisk died at a nominal 0.4 GB over: the ASM services' locked shared
segments are under-attributed by per-process RSS. /dev/shm usage now
counts into the tree total.
…tion
Everything hairy in the sampler (two ps/awk tree walks, the /dev/shm
add-on, adaptive cadence, trajectory projection, conditional grace)
existed to reconstruct a number the kernel already publishes:
/proc/meminfo MemAvailable, its own estimate of what can be allocated
without thrashing. It natively accounts for everything the tree
consumes (RSS, locked shm, page tables) plus everything else on the
host, and correctly ignores reclaimable page cache.
The watchdog now kills the tree when MemAvailable < MemTotal - ceiling,
at a fixed 0.25s cadence (a meminfo read is ~free, so no adaptive zone)
with a plain TERM -> 2s -> KILL (rows are flushed continuously; the
grace was only ever for destructors). The floor never drops below 4 GiB
so an oversized ceiling still protects the host, and a machine without
/proc/meminfo is refused loudly. ~40 lines shorter, and strictly harder
to fool than the tree-RSS sum it replaces.
…ottery
A 50-run log sweep showed the ubuntu-latest build hosts hand out 4 CPU
models, baking AVX-512 into the -Ctarget-cpu=native binaries on only
~18% of builds — main's history randomly flipped Plonky3 codepaths
between pushes, and main-vs-PR comparisons crossed ISAs ~30% of the
time. The warp fleet is CPU-uniform (AMD EPYC 9R45 / Intel, all
AVX-512), so building there makes the ISA deterministic AND faster.
Every job that runs the binaries moves with the build (a non-AVX-512
GitHub host would SIGILL): bench-main's plan, bench-pr's build (parse)
and assemble (report). setup/comment/thresholds-reset run no ix and
stay on ubuntu-latest. The Log build CPU step stays, as the check that
a regression wasn't a fleet change.
The cache-hit and cache-miss branches each carried their own
lean-action step (build vs provision-only); a computed build flag
collapses them — miss builds, hit provisions the toolchain the
restored binaries need.
The 24 GiB headroom killed the Mathlib compile 3 GB from completion
(machine-wide usage ~99.6 GB vs the 99 ceiling): that headroom is sized
for the aiur prover's memory-bandwidth bursts (~13 GB between samples),
while ix compile grows build-paced at a few GB/s and legitimately peaks
near 100 GB. One number can't serve both on a 123 GB machine, so the
headroom moves into the registry per backend: 24 GiB default (provers),
12 for compile (runner ceiling 111, ~11 GB above the measured Mathlib
peak, floor still 4x its worst per-sample growth).
With the MemAvailable watchdog, the per-backend headroom machinery
reduces to one number: 110 sits above the largest legitimate workload
(Mathlib ix compile, ~100 GB) and leaves a ~13 GB free floor on the
~123 GiB runner; the script's 4 GiB minimum floor keeps smaller
machines protected when the default exceeds their RAM. Deletes the
headroomGb registry field and the /proc/meminfo parsing in Lean.
Derived again (a flat 110 protects nothing on smaller machines and
tracks nothing when the runner class changes): MemTotal - 15 puts the
~123 GiB runner at ~108, above Mathlib ix compile's ~100 GB peak, with
the 15 GB as the MemAvailable kill floor. Same rule for every backend.
The serialized env size wiggles slightly run-to-run, so the 0/0 pin
alerts on noise. A 1% band still catches real serialization-format
regressions (~32 MB on Mathlib) while tolerating the wiggle. constants
stays pinned — the count is deterministic. That the .ixe is not
byte-reproducible at all is worth its own investigation for a
content-addressed store; noted in the threshold comment.
Replaces the avx512f present/absent binary with the full avx2/avx512*
flag list from cpuinfo (or 'absent'), so a regression can be traced to
exactly which extensions the build host offered.
plan (ci matrix) and assemble (bench report) never execute the Rust
objects where the warp build's AVX-512 lives — Lean code is compiled by
leanc at baseline ISA, and Rust has no life-before-main initializers.
Each job's comment records the assumption: move back to warp if ix
startup or these subcommands ever touch the FFI. The build/prepare/
benchmark/compile jobs keep warp (they compile with target-cpu=native
or execute the prover FFI).
Validated on both ubuntu-latest and warp runners (ix-cpu-info's
cgroup-memcap.yml): systemd-run --user --scope -p MemoryMax=<G>
-p MemorySwapMax=0 hard-caps the tool's cgroup; the kernel OOM-kills at
the ceiling with SIGKILL (exit 137, the orchestrator's OOM signal). No
sampler cadence to race, no tree to sum, no burst arithmetic — the
cgroup charges the whole tree's resident memory and cached allocator
reservations don't count.
The script shrinks to an exec: a passwordless-sudo enable-linger boots
the user manager on CI (no-op locally where a session provides one),
XDG_RUNTIME_DIR is defaulted, and systemd-run replaces the process. No
fallback: without a user bus it fails loudly (exit 1 -> the cell
aborts).
bench-main runs on pushes to main only again; bench-pr is
issue_comment-only — the pull_request trigger, its fixed test command,
the head-ref gate, and the || fallbacks in concurrency/SHA-resolution/
comment-target all go with it. The OOM enforcement and both workflows
were verified end to end from this branch before the revert.
The zisk shard-plan run for the heavy bitblast block exposed the hole:
a plain systemd scope doesn't set memory.oom.group, so at the cap the
kernel killed only the biggest process — Zisk's ASM MT service — and
the surviving host converted the memory kill into a clean exit 1, which
the orchestrator (correctly) treats as a deterministic failure and
aborts the cell instead of recording the oom row this expected-OOM
constant should produce.
The wrapper now writes memory.oom.group=1 on the scope's cgroup (user-
delegated, no sudo) before exec'ing the tool: breach -> the whole tree
dies with SIGKILL -> exit 137 -> oom row, same semantics the sampler
era had. Failure to set it exits 2 rather than running with
single-victim kill semantics.
One-off runs no longer need a names file: --consts takes the same
comma-separated grammar as the tools, unioned with --names-file via
ConstsFile.gather (the machinery every other consumer already uses).
…lace name files
- ix bench run/shard take --ixe <path> (must exist, used as-is; no flag
= compile fresh) instead of the magic reuse-if-present flag. The
workflows pass the cache-restored path explicitly; bench-pr guards
with [ -f ] so a missed cache still compiles rather than failing.
- ix bench run drops --names-file: --consts (comma-separated, the
tools' grammar) is the one selection override. bench-pr's targeted
base run builds the list with paste -sd, from fetch-main's
missing-out file.
- fetch-main gains --consts alongside the workflow-facing --names file
(unioned), so the local compare-vs-main flow needs no temp files.
…ompile
The prepare job compiled the .ixe for the prover cells while a
compile-backend cell compiled the same env again for measurement. The
renamed compile job (prepare was ambiguous) now runs for every
requested env and serves both purposes: it publishes the .ixe the
prover cells restore, and its measured row is published too
(bench-pr-row-<sha>-<env>) for the compile cell to reuse as its PR side
— same runner class, same binaries, same command. A row-cache miss just
means the compile cell compiles and measures itself, as before.
ci parse's prep-envs output simplifies to envs (all requested envs).
The rss-sampler/json-sink additions this branch relied on landed
upstream in argumentcomputer/tracing-texray; pin the merged commit
465bbca in place of the pre-merge fork rev.
@samuelburnham
samuelburnham merged commit 49945d1 into mainJul 9, 2026
17 of 18 checks passed
@samuelburnham
samuelburnham deleted the sb/ci-benchmarks branch July 9, 2026 18:10
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset to 49945d1 for: aiur-check-execute aiur-check-prove ix-compile ooc-check sp1-check-execute zisk-check-execute

samuelburnham added a commit that referenced this pull request Jul 10, 2026
* bench: curate Vectors.csv by measured workload distinctness
Local aiur prove runs plus per-constant closure profiles (targets,
ingress bytes, fft-cost) showed a third of the cheap tier measuring
the same thing:
- drop the base-cost floor duplicates (3-9 constant closures, <13 kB,
prove within noise of each other): Acc.rec, Trans.mk, Sum.elim,
Prod.map, Option.bind, Array.toList — Eq.rec stays as the recursor
representative, Except.bind for monadic bind, WellFounded.fix for
recursion combinators;
- drop Nat.toDigits (strictly inside Nat.repr's closure), Array.filter
and Array.foldlM (within 1.5x of Array.map, which stays), Int.add
(scale twin of primary Nat.add_comm; Int is covered by emod/gcd);
- drop the Int8/Int16/Int32 instRxcHasSize_eq triplets (byte-identical
siblings of the kept Int64) and the trivials Nat, HEq, HEq.rec,
Nat.add;
- add Std.HashMap as HEAVY: 1,982-constant closure, 2.28 MB ingress,
84.6 s / 49 GiB / 18.4B FFTs proved locally — 6-40x every cheap
constant on every axis.
The prove-feasible full set is now 20 constants spanning recursors,
WF recursion, monadic bind, List/Array, Nat/Int/BitVec/USize
arithmetic, decidability, bytes/strings, hashing, and (via the heavy
tier) big structures.
* fix(bench): align tracing-texray pins with the root workspace
The zisk and sp1 hosts pinned tracing-texray at an older rev than the
root workspace (bumped in #467), so cargo linked TWO instances of the
crate into each host: main() started one instance's RSS sampler while
ix_bench::peak_rss_bytes() read the other's never-started one — always
None — and the resulting null was dropped by `ix bench bmf`'s
numeric-fields filter. Net effect: every zisk upload silently lost
peak-rss (parent and per-shard rows alike) since the pin diverged.
Align both hosts on the root rev and re-lock; cargo tree confirms a
single shared instance, so the sampler the host starts is the one the
row emission reads.
* bench: zisk rows report constants and shards
constants = the named constants certified over the checked closure —
the pre-shard input set, the same universe the aiur rows count via
closureFrom. The cheap paths emit the cover size; the shard-plan path
emits `needed` (targets this run answers for), computed before shard
partitioning and store-reuse filtering, so neither sharding overhead
nor covered-shard skips distort it. Anon-work dedup shrinks the WORK
item count, never this number; sharding's extra work stays visible in
cycles/execute-time where it belongs.
shards was already emitted on shard-plan rows; a non-sharded execute
now reports 1 (a single leaf IS one shard) instead of omitting the
field and rendering n/a in the compare table.
bench-main pins constants 0/0 on the zkvm testbeds like the other
cells: it is deterministic, and a drop means lost coverage, not a win.
* bench: compare-table and !benchmark upgrades
- aiur prove cells report throughput (constants/prove-time was already
uploaded and thresholded; the registry column list just omitted it —
every other cell follows the time/throughput/peak-rss convention).
- zisk compare tables gain constants and shards columns, next to cycles.
- The per-constant phase drill-downs are now opt-in via BENCH_PHASES=1
(a passthrough config key): the spans are noisy and dynamically
named, so the default comment stays at the headline measures.
- KEY=VALUE config parses inline on the command line too, whitespace-
separated — the single-line form for bench-pr.yml's manual
workflow_dispatch, whose input box cannot hold newlines. Inline keys
are strict (an unknown key rejects, like a typo'd backend); config
lines stay lenient since comment prose contains `=`.
* bench: `ix bench plots` — registry-driven bencher dashboard sync
One plot per (testbed, measure) bench-main tracks, one line per
benchmark row the cell uploads, plus the cross-kernel input-constants
overlay (aiur and zisk report the same pre-shard closure count, so the
paired lines must coincide — separation is a coverage-drift tripwire).
Titles, dashboard ordering, redundancy skips, and canonical measure
units live here as typed data; the spec derives from the registry +
Vectors.csv, so nothing is hand-listed.
Idempotent, keyed by title: matching plots are kept (index
re-asserted), stale ones deleted and recreated (the plot PATCH endpoint
only takes index/title/window), hand-pinned ones untouched. The sync
also asserts measure units — bencher auto-creates measures with
placeholder units on first upload, leaving plots unitless.
All bencher.dev traffic goes through the bencher CLI; --dry-run
previews with no key. bencher-plots.yml dispatches it manually (like
bencher-thresholds-reset) off the freshest bench-bins cache: run it
after a registry change has merged AND bench-main has built it — the
registry is compiled into the binary, and a new constant only gets its
plot line once its first rows upload.
* fix(ci): bench-pr Mathlib env — mathlib lives in the Benchmarks/Compile subpackage
BENCH_ENVS=Mathlib died at 'Get Mathlib Cache' with 'unknown executable
cache': use-mathlib-cache runs `lake exe cache get`, and mathlib is a
dependency of the Benchmarks/Compile subpackage, not the root workspace
lean-action was pointed at. bench-main had this right; bench-pr now
mirrors it:
- compile job: provision from Benchmarks/Compile (same toolchain as
root) and `lake build Compile<env>` before the measured compile;
- benchmark cells: no mathlib cache at all — the .ixe comes from the
compile job, and the lazy Mathlib fallback fails loudly rather than
fetching oleans it still couldn't build;
- base side: the build action stays on the base root (it builds ix);
a separate step fetches/builds base mathlib oleans in the subpackage
when a Mathlib cell must re-run the base.
* ci: bench-pr cells fail on a compile-cache miss instead of recompiling
The benchmark cells carried two lazy fallbacks for artifacts the
compile job publishes in the same run: a missing compile row made the
compile cell re-measure the compile in-cell, and a missing `.ixe` made
`ix bench run` recompile the env fresh. Neither could ever work for
the Mathlib env (its oleans live only in the compile job's subpackage
provisioning), so the fallbacks meant InitStd and Mathlib failed
differently for the same infrastructure problem.
Both restores are now fail-on-cache-miss and the run step always
passes `--ixe`: the artifacts were published moments earlier, so a
miss is an infrastructure failure and every env fails the same way,
loudly, at the restore step. The in-cell "Save PR .ixe" step goes with
the fallback that produced it.
* bench: throughput means constants per second on every backend
The zkVM hosts uploaded cycles/second under the same `throughput` slug
every other cell used for constants/second, so the shared measure had
no honest unit (and the dashboard showed a generic "per second"). The
hosts now report constants/second like everyone else — cheap zisk rows
over the certified cover, shard-plan rows over the pre-shard `needed`
set, sp1 over its checked count (its stdout already printed this
number; the row disagreed) — via one shared `ix_bench::throughput`
calculator. A zkVM's cycle rate stays derivable from its `cycles` and
`execute-time` fields.
The bencher measure's canonical units become "constants / second".
NB: the first post-merge zisk upload drops throughput by orders of
magnitude (meaning change, not a regression) — reset the
zisk-check-execute baseline (!bencher-thresholds-reset) right after,
or the 10% lower bound alerts.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bencher-thresholds-reset:allbencher baseline reset queued on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@samuelburnham@arthurpaulino@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ci: Standardize benchmarks and input constants - #467

Merged
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks
Jul 9, 2026
Merged

ci: Standardize benchmarks and input constants#467
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks

Conversation

@samuelburnham

@samuelburnhamsamuelburnham commented Jul 2, 2026

Copy link
Copy Markdown
Member

CI benchmarking:

  • ix bench Lean CLI for comprehensive local and CI benchmarks of ix compilation and typechecking over multiple backends, against a curated set of constants. Provides comparative runs against local history, or current main (fetches cached bencher.dev results), and formats them in a Markdown table.
  • Updates bench-pr.yml to use this framework and print the Markdown table as a PR comment (see example comments below).
  • Updates bench-main.yml to fully bench all backends and upload them to bencher.dev, except for RISC-V proving for now due to GPU requirements. SP1 is also left as a TODO.
  • Now tracks per-phase span measurements from tracing-texray as first-class benchmark metrics, and uploads them to bencher.dev for regression testing and also direct PR comparison in the comment table with a collapsible drop-down view (not fully tested).
  • Adds a RAM watchdog via systemd-run cgroups to prevent an OOM constant from killing the runner and failing the workflow.
  • Moves the benchmark binaries onto AVX-512-compatible runner after testing that the Warpbuild 32 vCPU runner (AMD EPYC 9R45 in all my tests) has full AVX-512 support. This should provide a one-time speedup that more accurately tracks production performance.

Usage

Local benchmarks:

# Compare local runs
ix bench run --backend aiur --env InitStd --mode execute --consts Nat.add_comm --ixe initstd.ixe
ix bench compare --backend aiur --env InitStd --mode execute --consts Nat.add_comm
# Compare against main
ix bench fetch-main --sha $(git rev-parse origin/main) \
--backend aiur --mode execute --consts Nat.add_comm --out main.json
ix bench compare --backend aiur --env InitStd --mode execute \
--main main.json --pr .lake/benches/aiur-InitStd-execute.json

PR comparative benchmarks against main:

!benchmark [aiur] [zisk] [sp1] [ooc] [compile] | all [execute]
# Optional env vars
BENCH_ENVS=InitStd,Mathlib
BENCH_FULL=1 # the env's full curated set (56 InitStd / 10 Mathlib consts) instead of the default primary subset (17 InitStd / 2 Mathlib)
BENCH_SHARD=1 # restrict to the multi-shard target constants
RUST_LOG=info

Successful runs:

Merge after argumentcomputer/tracing-texray#3

Note

Before merge:

  • Bencher console: rename aiur-typecheck-x64-32x → aiur-check-prove-x64-32x, zisk-check-x64-32x → zisk-check-execute-x64-32x; archive stale shard-cycles:N measures.
  • Delete the old threshold Git tags for aiur as the names have been updated

@samuelburnham
samuelburnhamforce-pushed the sb/ci-benchmarks branch 7 times, most recently from 07264b9 to f1ff88aCompareJuly 3, 2026 20:39
Comment thread.github/workflows/bench-pr.yml Fixed
Comment thread.github/workflows/bench-pr.yml Fixed
@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b56201f

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

No result tables were produced — see the workflow logs.

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 70d60b8

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%file-size (main)file-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.222 sn/an/a24.99Kn/an/a306.41 MiBn/an/a105492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqOOM6.86Kn/aOOM264.7 msn/aOOM1.16 GiBn/a
String.splitOOM6.71Kn/aOOM264.0 msn/aOOM971.84 MiBn/a
InitStdn/a6.08Kn/an/a14.644 sn/an/a1.48 GiBn/a
List.mergeSortOOM5.56Kn/aOOM261.5 msn/aOOM802.59 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendOOM5.09Kn/aOOM529.6 msn/aOOM998.39 MiBn/a
Char.ofOrdinal_le_of_leOOM3.44Kn/aOOM773.9 msn/aOOM980.05 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqOOM2.38Kn/aOOM764.8 msn/aOOM841.74 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqOOM2.37Kn/aOOM764.8 msn/aOOM977.59 MiBn/a
Vector.appendOOM1.96Kn/aOOM254.4 msn/aOOM665.40 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqOOM1.79Kn/aOOM1.015 sn/aOOM853.80 MiBn/a
Nat.gcd_commOOM1.53Kn/aOOM254.2 msn/aOOM640.46 MiBn/a
Array.extract_appendOOM1.52Kn/aOOM1.017 sn/aOOM1.04 GiBn/a
Vector.extract_append._proof_2OOM1.29Kn/aOOM1.012 sn/aOOM916.29 MiBn/a
String.appendOOM1.21Kn/aOOM253.1 msn/aOOM1.01 GiBn/a
Int.gcdOOM823.880n/aOOM252.5 msn/aOOM616.14 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualOOM821.770n/aOOM6.895 sn/aOOM1.73 GiBn/a
Nat.sub_le_of_le_addOOM673.120n/aOOM252.6 msn/aOOM568.05 MiBn/a
Nat.add_commOOM166.670n/aOOM252.0 msn/aOOM457.39 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 431ae38

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a3.955 sn/an/a26.67Kn/an/a306.41 MiBn/an/a105492n/an/a10.67 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.87Kn/an/a264.4 msn/an/a1.19 GiBn/a
String.splitn/a6.72Kn/an/a263.8 msn/an/a1.07 GiBn/a
InitStdn/a6.41Kn/an/a13.881 sn/an/a1.47 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.7 msn/an/a858.98 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.10Kn/an/a528.9 msn/an/a1.01 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a774.0 msn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.5 msn/an/a880.31 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.6 msn/an/a815.45 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.6 msn/an/a979.52 MiBn/a
Vector.appendn/a1.95Kn/an/a254.8 msn/an/a667.94 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a254.9 msn/an/a681.33 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.01 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.07 GiBn/a
String.appendn/a1.21Kn/an/a252.8 msn/an/a965.88 MiBn/a
Int.gcdn/a824.190n/an/a252.4 msn/an/a619.82 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a822.230n/an/a6.891 sn/an/a1.72 GiBn/a
Nat.sub_le_of_le_addn/a673.260n/an/a252.5 msn/an/a564.67 MiBn/a
Nat.add_commn/a166.640n/an/a252.0 msn/an/a451.35 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 7d3388b

backends: ooc=execute compile=execute · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a4.352 sn/an/a24.24Kn/an/a306.41 MiBn/an/a105,492n/an/a10.59 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.15 GiBn/a
String.splitn/a6.71Kn/an/a263.9 msn/an/a1.05 GiBn/a
InitStdn/a6.41Kn/an/a13.882 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a838.87 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.5 msn/an/a982.43 MiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.9 msn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.7 msn/an/a917.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.8 msn/an/a812.00 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.01 GiBn/a
Vector.appendn/a1.96Kn/an/a254.3 msn/an/a659.75 MiBn/a
Nat.gcd_commn/a1.54Kn/an/a253.9 msn/an/a643.67 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a920.13 MiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a978.00 MiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.02 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a853.640n/an/a6.637 sn/an/a1.80 GiBn/a
Int.gcdn/a824.010n/an/a252.4 msn/an/a612.75 MiBn/a
Nat.sub_le_of_le_addn/a673.230n/an/a252.5 msn/an/a568.57 MiBn/a
Nat.add_commn/a166.670n/an/a252.0 msn/an/a467.85 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 1103162

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a4.301 sn/an/a24.53Kn/an/a306.41 MiBn/an/a105,492n/an/a10.61 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.33 GiBn/a
String.splitn/a6.71Kn/an/a264.3 msn/an/a1.12 GiBn/a
InitStdn/a6.30Kn/an/a14.129 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a931.07 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.7 msn/an/a1.02 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.7 msn/an/a887.48 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a765.2 msn/an/a841.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.08 GiBn/a
Vector.appendn/a1.96Kn/an/a254.4 msn/an/a669.67 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a1.79Kn/an/a1.015 sn/an/a914.25 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a255.3 msn/an/a657.64 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.16 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.11 GiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.08 GiBn/a
Int.gcdn/a823.880n/an/a252.5 msn/an/a607.91 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a821.940n/an/a6.893 sn/an/a1.64 GiBn/a
Nat.sub_le_of_le_addn/a673.360n/an/a252.5 msn/an/a547.86 MiBn/a
Nat.add_commn/a166.540n/an/a252.2 msn/an/a435.36 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b82aed8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.947 sn/an/a26.73Kn/an/a11.24 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.412 sn/an/a8.55Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.404 sn/an/a884.740n/an/a1.91 GiBn/a
Array.extract_appendn/a1.017 sn/an/a1.52Kn/an/a1.25 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.5 msn/an/a3.43Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.09 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.15 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.6 msn/an/a5.07Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a264.7 msn/an/a6.70Kn/an/a1.19 GiBn/a
List.mergeSortn/a262.3 msn/an/a5.54Kn/an/a998.22 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a765.08 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a702.54 MiBn/a
Nat.sub_le_of_le_addn/a253.2 msn/an/a671.490n/an/a601.42 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.01 GiBn/a
Int.gcdn/a252.5 msn/an/a823.710n/an/a636.20 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.730n/an/a484.27 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 930ebb8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.355 sn/an/a24.22Kn/an/a11.14 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.409 sn/an/a8.55Kn/an/a2.03 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.98 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.23 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.20 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.2 msn/an/a5.08Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.8 msn/an/a6.81Kn/an/a1.46 GiBn/a
String.splitn/a265.0 msn/an/a6.69Kn/an/a1.31 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1013.36 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a891.58 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a745.38 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.13 GiBn/a
Int.gcdn/a252.5 msn/an/a823.670n/an/a762.65 MiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.360n/an/a651.23 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.570n/an/a508.57 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs d69aaee

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.231 sn/an/a24.93Kn/an/a11.03 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.159 sn/an/a8.76Kn/an/a2.09 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.090n/an/a2.04 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.10 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a939.29 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.4 msn/an/a2.38Kn/an/a1014.35 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.4 msn/an/a2.37Kn/an/a1.25 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.15 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.51 GiBn/a
String.splitn/a265.1 msn/an/a6.69Kn/an/a1.25 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1008.04 MiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a775.05 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a730.16 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.24 GiBn/a
Nat.sub_le_of_le_addn/a252.7 msn/an/a672.780n/an/a616.39 MiBn/a
Int.gcdn/a252.5 msn/an/a823.830n/an/a666.57 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a499.68 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!bencher-thresholds-reset all

@github-actionsgithub-actionsBot added the bencher-thresholds-reset:all bencher baseline reset queued on merge label Jul 8, 2026
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset queued for: all — will anchor to the merge commit when this PR merges.

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 8595ee8

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.258 sn/an/a24.78Kn/an/a11.27 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.158 sn/an/a8.76Kn/an/a2.04 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.140n/an/a2.01 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a988.55 MiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.32 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.29 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.24 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.9 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.3 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a265.4 msn/an/a6.68Kn/an/a1.26 GiBn/a
List.mergeSortn/a261.9 msn/an/a5.55Kn/an/a1004.43 MiBn/a
Nat.gcd_commn/a254.8 msn/an/a1.53Kn/an/a813.46 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a740.42 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.08 GiBn/a
Nat.add_commn/a252.6 msn/an/a166.290n/an/a503.77 MiBn/a
Int.gcdn/a252.5 msn/an/a823.900n/an/a707.26 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.440n/an/a634.98 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 94e942d

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.050 sn/an/a26.05Kn/an/a11.11 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.426 sn/an/a8.54Kn/an/a2.00 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.149 sn/an/a921.510n/an/a1.97 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.13 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a991.18 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.22 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.0 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.37 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.28 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a990.69 MiBn/a
Nat.gcd_commn/a255.1 msn/an/a1.53Kn/an/a776.26 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a681.59 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.220n/an/a604.52 MiBn/a
Int.gcdn/a252.5 msn/an/a823.790n/an/a672.67 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.760n/an/a477.46 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5fa582b

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.993 sn/an/a26.42Kn/an/a11.05 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.677 sn/an/a8.34Kn/an/a2.11 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.148 sn/an/a921.570n/an/a1.86 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.12 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.25 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.17 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.38 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1.03 GiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a855.45 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a715.77 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.6 msn/an/a673.030n/an/a612.18 MiBn/a
Int.gcdn/a252.5 msn/an/a823.860n/an/a724.20 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.550n/an/a479.64 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 3c3d090

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.039 sn/an/a26.12Kn/an/a11.25 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.174 sn/an/a8.75Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.99 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.21 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.30 GiBn/a
Char.ofOrdinal_le_of_len/a775.2 msn/an/a3.43Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.08 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.3 msn/an/a5.08Kn/an/a1.14 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.4 msn/an/a6.82Kn/an/a1.30 GiBn/a
String.splitn/a265.2 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1012.01 MiBn/a
Nat.gcd_commn/a254.9 msn/an/a1.53Kn/an/a783.17 MiBn/a
Vector.appendn/a254.4 msn/an/a1.96Kn/an/a736.90 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a956.42 MiBn/a
Int.gcdn/a252.4 msn/an/a824.030n/an/a669.97 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.580n/an/a605.84 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a482.89 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 8, 2026 21:46
arthurpaulino
arthurpaulino previously approved these changes Jul 9, 2026
Lowering the witness cap below Zisk's built-in default (10) was measured to
have a negligible effect on host RAM and prove time for the kernel typecheck
workload, so the CLI override (which defaulted to 5) is removed and the prover
uses EmbeddedOpts::default(). Drop the now-stale flag mentions and per-RAM
tuning guidance from the README, the cost-model doc, and the shard.rs model
comments.
Rebased onto main (post #411 + #459) and integrated with the renamed
bench-main.yml and reworked bencher-track interface.
- Benchmarks/Vectors.csv: single shared source of truth (71 library constants
from Init/Std/Mathlib/Lean). Consumed by Aiur (bench-typecheck --manifest),
the zkVM hosts, and shell.
- bench-pr.yml: `!benchmark [aiur] [zisk] [sp1|all] [execute|prove]` over the
curated set, posting a main-vs-PR table; main results cached by base SHA.
Hardened: comment body from env (no injection), allowlisted env parsing.
- .github/scripts/{bench.py,run.sh}: parse/manifest/compare/comment, and the
compile-.ixe + backend driver (cycles/execute-time/throughput/peak-rss, plus
shards/max-shard-cycles for sharded runs).
- .github/actions/install-{sp1,zisk}: shared zkVM toolchain + deps install,
used by bench-pr.yml, bench-main.yml, and riscv-bench.yml.
- bench-main.yml: add zkvm-execute (Zisk/SP1 cycle counts + time/RAM) and
native-check (native parallel `ix check --anon` throughput) jobs, using the
new bencher-track workload/thresholds interface.
- bench-typecheck: add --constant / --skip-deps (align with the zkVM hosts;
--skip-deps replaces --subject-only) and --execute-only (fast execute path).
issue_comment workflows only run from the default branch, so the `!benchmark`
path can't be exercised on a PR branch. Add a pull_request trigger (base/head
from the PR payload; empty comment → parser defaults) to test pre-merge.
Revert before merge — delete the `pull_request:` trigger; the dual base/head
resolution and `|| pull_request.number` fallbacks are harmless to keep.
Revert the cgroup mode (and the earlier RLIMIT_DATA layer): back to the
plain tree-RSS sampler, sudo-free and identical everywhere. The burst
problem is handled by cadence instead of a kernel cap: sampling drops
from ~1s to 0.2s once the tree is within 20 GB of the ceiling (100 GB
at the default 120), and the post-TERM grace re-checks every 0.2s,
KILLing immediately while the tree is still at the ceiling. Worst-case
overshoot shrinks from GB-per-second x seconds to x ~0.4s.
ix bench run still hard-fails when the watchdog script is missing — an
unenforced ceiling is not a benchmark run.
The flat 120 was a leftover from the RLIMIT_DATA era (a VA cap needed
fixed slack above RSS); for the sampler it protects nothing on machines
with less RAM and leaves ~3 GB of headroom on the 123 GiB runner. Back
to MemTotal minus 12 GiB (runner: 111; 64 GiB workstation: 52), which
the adaptive fast-cadence zone sits under wherever the run happens.
Same lesson aiur taught: shared measure names (peak-rss, throughput)
mean that mode's phase, so a future zisk/sp1 prove mode needs its own
testbed — and an unsuffixed zisk-check silently meaning "execute only"
is the asymmetry we just cleaned up for aiur. Renaming now rides the
merge's existing bencher migration (console rename + reset-all) instead
of paying a second cycle later.
The zkvm job derives testbed/workload from the cell's mode, so a prove
cell would land on zisk-check-prove-x64-32x with no workflow edits.
The per-cell .ixe cache only helped re-runs: on a fresh commit every
same-env cell missed the cold cache simultaneously and paid its own ix
compile in parallel. A prepare job (matrix over ci parse's new
prep-envs output — envs consumed by non-compile cells) now compiles
each .ixe once and publishes it under the key the cells already
restore, so cells start warm. Skipped for compile-only requests, whose
cells compile fresh by design; a prepare failure stops the cells (they
would just re-fail the same compile lazily).
Two more runner deaths, two measured causes:
1. aiur prove crossed the ceiling by 13 GB inside one 0.2s sample —
first-touch of pre-reserved prover buffers grows RSS at memory
bandwidth, which no cadence outruns. Headroom widens to 24 GiB (the
~123 GiB runner's ceiling drops 111 → 99) so the worst measured
overshoot plus OS/agent fits, and the sampler now TERMs on a
one-sample linear projection (level + last delta), buying back one
sample of reaction time — verified live: the kill fires before the
ceiling is crossed on a steep ramp.
2. zisk died at a nominal 0.4 GB over: the ASM services' locked shared
segments are under-attributed by per-process RSS. /dev/shm usage now
counts into the tree total.
…tion
Everything hairy in the sampler (two ps/awk tree walks, the /dev/shm
add-on, adaptive cadence, trajectory projection, conditional grace)
existed to reconstruct a number the kernel already publishes:
/proc/meminfo MemAvailable, its own estimate of what can be allocated
without thrashing. It natively accounts for everything the tree
consumes (RSS, locked shm, page tables) plus everything else on the
host, and correctly ignores reclaimable page cache.
The watchdog now kills the tree when MemAvailable < MemTotal - ceiling,
at a fixed 0.25s cadence (a meminfo read is ~free, so no adaptive zone)
with a plain TERM -> 2s -> KILL (rows are flushed continuously; the
grace was only ever for destructors). The floor never drops below 4 GiB
so an oversized ceiling still protects the host, and a machine without
/proc/meminfo is refused loudly. ~40 lines shorter, and strictly harder
to fool than the tree-RSS sum it replaces.
…ottery
A 50-run log sweep showed the ubuntu-latest build hosts hand out 4 CPU
models, baking AVX-512 into the -Ctarget-cpu=native binaries on only
~18% of builds — main's history randomly flipped Plonky3 codepaths
between pushes, and main-vs-PR comparisons crossed ISAs ~30% of the
time. The warp fleet is CPU-uniform (AMD EPYC 9R45 / Intel, all
AVX-512), so building there makes the ISA deterministic AND faster.
Every job that runs the binaries moves with the build (a non-AVX-512
GitHub host would SIGILL): bench-main's plan, bench-pr's build (parse)
and assemble (report). setup/comment/thresholds-reset run no ix and
stay on ubuntu-latest. The Log build CPU step stays, as the check that
a regression wasn't a fleet change.
The cache-hit and cache-miss branches each carried their own
lean-action step (build vs provision-only); a computed build flag
collapses them — miss builds, hit provisions the toolchain the
restored binaries need.
The 24 GiB headroom killed the Mathlib compile 3 GB from completion
(machine-wide usage ~99.6 GB vs the 99 ceiling): that headroom is sized
for the aiur prover's memory-bandwidth bursts (~13 GB between samples),
while ix compile grows build-paced at a few GB/s and legitimately peaks
near 100 GB. One number can't serve both on a 123 GB machine, so the
headroom moves into the registry per backend: 24 GiB default (provers),
12 for compile (runner ceiling 111, ~11 GB above the measured Mathlib
peak, floor still 4x its worst per-sample growth).
With the MemAvailable watchdog, the per-backend headroom machinery
reduces to one number: 110 sits above the largest legitimate workload
(Mathlib ix compile, ~100 GB) and leaves a ~13 GB free floor on the
~123 GiB runner; the script's 4 GiB minimum floor keeps smaller
machines protected when the default exceeds their RAM. Deletes the
headroomGb registry field and the /proc/meminfo parsing in Lean.
Derived again (a flat 110 protects nothing on smaller machines and
tracks nothing when the runner class changes): MemTotal - 15 puts the
~123 GiB runner at ~108, above Mathlib ix compile's ~100 GB peak, with
the 15 GB as the MemAvailable kill floor. Same rule for every backend.
The serialized env size wiggles slightly run-to-run, so the 0/0 pin
alerts on noise. A 1% band still catches real serialization-format
regressions (~32 MB on Mathlib) while tolerating the wiggle. constants
stays pinned — the count is deterministic. That the .ixe is not
byte-reproducible at all is worth its own investigation for a
content-addressed store; noted in the threshold comment.
Replaces the avx512f present/absent binary with the full avx2/avx512*
flag list from cpuinfo (or 'absent'), so a regression can be traced to
exactly which extensions the build host offered.
plan (ci matrix) and assemble (bench report) never execute the Rust
objects where the warp build's AVX-512 lives — Lean code is compiled by
leanc at baseline ISA, and Rust has no life-before-main initializers.
Each job's comment records the assumption: move back to warp if ix
startup or these subcommands ever touch the FFI. The build/prepare/
benchmark/compile jobs keep warp (they compile with target-cpu=native
or execute the prover FFI).
Validated on both ubuntu-latest and warp runners (ix-cpu-info's
cgroup-memcap.yml): systemd-run --user --scope -p MemoryMax=<G>
-p MemorySwapMax=0 hard-caps the tool's cgroup; the kernel OOM-kills at
the ceiling with SIGKILL (exit 137, the orchestrator's OOM signal). No
sampler cadence to race, no tree to sum, no burst arithmetic — the
cgroup charges the whole tree's resident memory and cached allocator
reservations don't count.
The script shrinks to an exec: a passwordless-sudo enable-linger boots
the user manager on CI (no-op locally where a session provides one),
XDG_RUNTIME_DIR is defaulted, and systemd-run replaces the process. No
fallback: without a user bus it fails loudly (exit 1 -> the cell
aborts).
bench-main runs on pushes to main only again; bench-pr is
issue_comment-only — the pull_request trigger, its fixed test command,
the head-ref gate, and the || fallbacks in concurrency/SHA-resolution/
comment-target all go with it. The OOM enforcement and both workflows
were verified end to end from this branch before the revert.
The zisk shard-plan run for the heavy bitblast block exposed the hole:
a plain systemd scope doesn't set memory.oom.group, so at the cap the
kernel killed only the biggest process — Zisk's ASM MT service — and
the surviving host converted the memory kill into a clean exit 1, which
the orchestrator (correctly) treats as a deterministic failure and
aborts the cell instead of recording the oom row this expected-OOM
constant should produce.
The wrapper now writes memory.oom.group=1 on the scope's cgroup (user-
delegated, no sudo) before exec'ing the tool: breach -> the whole tree
dies with SIGKILL -> exit 137 -> oom row, same semantics the sampler
era had. Failure to set it exits 2 rather than running with
single-victim kill semantics.
One-off runs no longer need a names file: --consts takes the same
comma-separated grammar as the tools, unioned with --names-file via
ConstsFile.gather (the machinery every other consumer already uses).
…lace name files
- ix bench run/shard take --ixe <path> (must exist, used as-is; no flag
= compile fresh) instead of the magic reuse-if-present flag. The
workflows pass the cache-restored path explicitly; bench-pr guards
with [ -f ] so a missed cache still compiles rather than failing.
- ix bench run drops --names-file: --consts (comma-separated, the
tools' grammar) is the one selection override. bench-pr's targeted
base run builds the list with paste -sd, from fetch-main's
missing-out file.
- fetch-main gains --consts alongside the workflow-facing --names file
(unioned), so the local compare-vs-main flow needs no temp files.
…ompile
The prepare job compiled the .ixe for the prover cells while a
compile-backend cell compiled the same env again for measurement. The
renamed compile job (prepare was ambiguous) now runs for every
requested env and serves both purposes: it publishes the .ixe the
prover cells restore, and its measured row is published too
(bench-pr-row-<sha>-<env>) for the compile cell to reuse as its PR side
— same runner class, same binaries, same command. A row-cache miss just
means the compile cell compiles and measures itself, as before.
ci parse's prep-envs output simplifies to envs (all requested envs).
The rss-sampler/json-sink additions this branch relied on landed
upstream in argumentcomputer/tracing-texray; pin the merged commit
465bbca in place of the pre-merge fork rev.
@samuelburnham
samuelburnham merged commit 49945d1 into mainJul 9, 2026
17 of 18 checks passed
@samuelburnham
samuelburnham deleted the sb/ci-benchmarks branch July 9, 2026 18:10
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset to 49945d1 for: aiur-check-execute aiur-check-prove ix-compile ooc-check sp1-check-execute zisk-check-execute

samuelburnham added a commit that referenced this pull request Jul 10, 2026
* bench: curate Vectors.csv by measured workload distinctness
Local aiur prove runs plus per-constant closure profiles (targets,
ingress bytes, fft-cost) showed a third of the cheap tier measuring
the same thing:
- drop the base-cost floor duplicates (3-9 constant closures, <13 kB,
prove within noise of each other): Acc.rec, Trans.mk, Sum.elim,
Prod.map, Option.bind, Array.toList — Eq.rec stays as the recursor
representative, Except.bind for monadic bind, WellFounded.fix for
recursion combinators;
- drop Nat.toDigits (strictly inside Nat.repr's closure), Array.filter
and Array.foldlM (within 1.5x of Array.map, which stays), Int.add
(scale twin of primary Nat.add_comm; Int is covered by emod/gcd);
- drop the Int8/Int16/Int32 instRxcHasSize_eq triplets (byte-identical
siblings of the kept Int64) and the trivials Nat, HEq, HEq.rec,
Nat.add;
- add Std.HashMap as HEAVY: 1,982-constant closure, 2.28 MB ingress,
84.6 s / 49 GiB / 18.4B FFTs proved locally — 6-40x every cheap
constant on every axis.
The prove-feasible full set is now 20 constants spanning recursors,
WF recursion, monadic bind, List/Array, Nat/Int/BitVec/USize
arithmetic, decidability, bytes/strings, hashing, and (via the heavy
tier) big structures.
* fix(bench): align tracing-texray pins with the root workspace
The zisk and sp1 hosts pinned tracing-texray at an older rev than the
root workspace (bumped in #467), so cargo linked TWO instances of the
crate into each host: main() started one instance's RSS sampler while
ix_bench::peak_rss_bytes() read the other's never-started one — always
None — and the resulting null was dropped by `ix bench bmf`'s
numeric-fields filter. Net effect: every zisk upload silently lost
peak-rss (parent and per-shard rows alike) since the pin diverged.
Align both hosts on the root rev and re-lock; cargo tree confirms a
single shared instance, so the sampler the host starts is the one the
row emission reads.
* bench: zisk rows report constants and shards
constants = the named constants certified over the checked closure —
the pre-shard input set, the same universe the aiur rows count via
closureFrom. The cheap paths emit the cover size; the shard-plan path
emits `needed` (targets this run answers for), computed before shard
partitioning and store-reuse filtering, so neither sharding overhead
nor covered-shard skips distort it. Anon-work dedup shrinks the WORK
item count, never this number; sharding's extra work stays visible in
cycles/execute-time where it belongs.
shards was already emitted on shard-plan rows; a non-sharded execute
now reports 1 (a single leaf IS one shard) instead of omitting the
field and rendering n/a in the compare table.
bench-main pins constants 0/0 on the zkvm testbeds like the other
cells: it is deterministic, and a drop means lost coverage, not a win.
* bench: compare-table and !benchmark upgrades
- aiur prove cells report throughput (constants/prove-time was already
uploaded and thresholded; the registry column list just omitted it —
every other cell follows the time/throughput/peak-rss convention).
- zisk compare tables gain constants and shards columns, next to cycles.
- The per-constant phase drill-downs are now opt-in via BENCH_PHASES=1
(a passthrough config key): the spans are noisy and dynamically
named, so the default comment stays at the headline measures.
- KEY=VALUE config parses inline on the command line too, whitespace-
separated — the single-line form for bench-pr.yml's manual
workflow_dispatch, whose input box cannot hold newlines. Inline keys
are strict (an unknown key rejects, like a typo'd backend); config
lines stay lenient since comment prose contains `=`.
* bench: `ix bench plots` — registry-driven bencher dashboard sync
One plot per (testbed, measure) bench-main tracks, one line per
benchmark row the cell uploads, plus the cross-kernel input-constants
overlay (aiur and zisk report the same pre-shard closure count, so the
paired lines must coincide — separation is a coverage-drift tripwire).
Titles, dashboard ordering, redundancy skips, and canonical measure
units live here as typed data; the spec derives from the registry +
Vectors.csv, so nothing is hand-listed.
Idempotent, keyed by title: matching plots are kept (index
re-asserted), stale ones deleted and recreated (the plot PATCH endpoint
only takes index/title/window), hand-pinned ones untouched. The sync
also asserts measure units — bencher auto-creates measures with
placeholder units on first upload, leaving plots unitless.
All bencher.dev traffic goes through the bencher CLI; --dry-run
previews with no key. bencher-plots.yml dispatches it manually (like
bencher-thresholds-reset) off the freshest bench-bins cache: run it
after a registry change has merged AND bench-main has built it — the
registry is compiled into the binary, and a new constant only gets its
plot line once its first rows upload.
* fix(ci): bench-pr Mathlib env — mathlib lives in the Benchmarks/Compile subpackage
BENCH_ENVS=Mathlib died at 'Get Mathlib Cache' with 'unknown executable
cache': use-mathlib-cache runs `lake exe cache get`, and mathlib is a
dependency of the Benchmarks/Compile subpackage, not the root workspace
lean-action was pointed at. bench-main had this right; bench-pr now
mirrors it:
- compile job: provision from Benchmarks/Compile (same toolchain as
root) and `lake build Compile<env>` before the measured compile;
- benchmark cells: no mathlib cache at all — the .ixe comes from the
compile job, and the lazy Mathlib fallback fails loudly rather than
fetching oleans it still couldn't build;
- base side: the build action stays on the base root (it builds ix);
a separate step fetches/builds base mathlib oleans in the subpackage
when a Mathlib cell must re-run the base.
* ci: bench-pr cells fail on a compile-cache miss instead of recompiling
The benchmark cells carried two lazy fallbacks for artifacts the
compile job publishes in the same run: a missing compile row made the
compile cell re-measure the compile in-cell, and a missing `.ixe` made
`ix bench run` recompile the env fresh. Neither could ever work for
the Mathlib env (its oleans live only in the compile job's subpackage
provisioning), so the fallbacks meant InitStd and Mathlib failed
differently for the same infrastructure problem.
Both restores are now fail-on-cache-miss and the run step always
passes `--ixe`: the artifacts were published moments earlier, so a
miss is an infrastructure failure and every env fails the same way,
loudly, at the restore step. The in-cell "Save PR .ixe" step goes with
the fallback that produced it.
* bench: throughput means constants per second on every backend
The zkVM hosts uploaded cycles/second under the same `throughput` slug
every other cell used for constants/second, so the shared measure had
no honest unit (and the dashboard showed a generic "per second"). The
hosts now report constants/second like everyone else — cheap zisk rows
over the certified cover, shard-plan rows over the pre-shard `needed`
set, sp1 over its checked count (its stdout already printed this
number; the row disagreed) — via one shared `ix_bench::throughput`
calculator. A zkVM's cycle rate stays derivable from its `cycles` and
`execute-time` fields.
The bencher measure's canonical units become "constants / second".
NB: the first post-merge zisk upload drops throughput by orders of
magnitude (meaning change, not a regression) — reset the
zisk-check-execute baseline (!bencher-thresholds-reset) right after,
or the 10% lower bound alerts.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bencher-thresholds-reset:allbencher baseline reset queued on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@samuelburnham@arthurpaulino@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ci: Standardize benchmarks and input constants - #467

Merged
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks
Jul 9, 2026
Merged

ci: Standardize benchmarks and input constants#467
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks

Conversation

@samuelburnham

@samuelburnhamsamuelburnham commented Jul 2, 2026

Copy link
Copy Markdown
Member

CI benchmarking:

  • ix bench Lean CLI for comprehensive local and CI benchmarks of ix compilation and typechecking over multiple backends, against a curated set of constants. Provides comparative runs against local history, or current main (fetches cached bencher.dev results), and formats them in a Markdown table.
  • Updates bench-pr.yml to use this framework and print the Markdown table as a PR comment (see example comments below).
  • Updates bench-main.yml to fully bench all backends and upload them to bencher.dev, except for RISC-V proving for now due to GPU requirements. SP1 is also left as a TODO.
  • Now tracks per-phase span measurements from tracing-texray as first-class benchmark metrics, and uploads them to bencher.dev for regression testing and also direct PR comparison in the comment table with a collapsible drop-down view (not fully tested).
  • Adds a RAM watchdog via systemd-run cgroups to prevent an OOM constant from killing the runner and failing the workflow.
  • Moves the benchmark binaries onto AVX-512-compatible runner after testing that the Warpbuild 32 vCPU runner (AMD EPYC 9R45 in all my tests) has full AVX-512 support. This should provide a one-time speedup that more accurately tracks production performance.

Usage

Local benchmarks:

# Compare local runs
ix bench run --backend aiur --env InitStd --mode execute --consts Nat.add_comm --ixe initstd.ixe
ix bench compare --backend aiur --env InitStd --mode execute --consts Nat.add_comm
# Compare against main
ix bench fetch-main --sha $(git rev-parse origin/main) \
--backend aiur --mode execute --consts Nat.add_comm --out main.json
ix bench compare --backend aiur --env InitStd --mode execute \
--main main.json --pr .lake/benches/aiur-InitStd-execute.json

PR comparative benchmarks against main:

!benchmark [aiur] [zisk] [sp1] [ooc] [compile] | all [execute]
# Optional env vars
BENCH_ENVS=InitStd,Mathlib
BENCH_FULL=1 # the env's full curated set (56 InitStd / 10 Mathlib consts) instead of the default primary subset (17 InitStd / 2 Mathlib)
BENCH_SHARD=1 # restrict to the multi-shard target constants
RUST_LOG=info

Successful runs:

Merge after argumentcomputer/tracing-texray#3

Note

Before merge:

  • Bencher console: rename aiur-typecheck-x64-32x → aiur-check-prove-x64-32x, zisk-check-x64-32x → zisk-check-execute-x64-32x; archive stale shard-cycles:N measures.
  • Delete the old threshold Git tags for aiur as the names have been updated

@samuelburnham
samuelburnhamforce-pushed the sb/ci-benchmarks branch 7 times, most recently from 07264b9 to f1ff88aCompareJuly 3, 2026 20:39
Comment thread.github/workflows/bench-pr.yml Fixed
Comment thread.github/workflows/bench-pr.yml Fixed
@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b56201f

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

No result tables were produced — see the workflow logs.

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 70d60b8

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%file-size (main)file-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.222 sn/an/a24.99Kn/an/a306.41 MiBn/an/a105492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqOOM6.86Kn/aOOM264.7 msn/aOOM1.16 GiBn/a
String.splitOOM6.71Kn/aOOM264.0 msn/aOOM971.84 MiBn/a
InitStdn/a6.08Kn/an/a14.644 sn/an/a1.48 GiBn/a
List.mergeSortOOM5.56Kn/aOOM261.5 msn/aOOM802.59 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendOOM5.09Kn/aOOM529.6 msn/aOOM998.39 MiBn/a
Char.ofOrdinal_le_of_leOOM3.44Kn/aOOM773.9 msn/aOOM980.05 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqOOM2.38Kn/aOOM764.8 msn/aOOM841.74 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqOOM2.37Kn/aOOM764.8 msn/aOOM977.59 MiBn/a
Vector.appendOOM1.96Kn/aOOM254.4 msn/aOOM665.40 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqOOM1.79Kn/aOOM1.015 sn/aOOM853.80 MiBn/a
Nat.gcd_commOOM1.53Kn/aOOM254.2 msn/aOOM640.46 MiBn/a
Array.extract_appendOOM1.52Kn/aOOM1.017 sn/aOOM1.04 GiBn/a
Vector.extract_append._proof_2OOM1.29Kn/aOOM1.012 sn/aOOM916.29 MiBn/a
String.appendOOM1.21Kn/aOOM253.1 msn/aOOM1.01 GiBn/a
Int.gcdOOM823.880n/aOOM252.5 msn/aOOM616.14 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualOOM821.770n/aOOM6.895 sn/aOOM1.73 GiBn/a
Nat.sub_le_of_le_addOOM673.120n/aOOM252.6 msn/aOOM568.05 MiBn/a
Nat.add_commOOM166.670n/aOOM252.0 msn/aOOM457.39 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 431ae38

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a3.955 sn/an/a26.67Kn/an/a306.41 MiBn/an/a105492n/an/a10.67 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.87Kn/an/a264.4 msn/an/a1.19 GiBn/a
String.splitn/a6.72Kn/an/a263.8 msn/an/a1.07 GiBn/a
InitStdn/a6.41Kn/an/a13.881 sn/an/a1.47 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.7 msn/an/a858.98 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.10Kn/an/a528.9 msn/an/a1.01 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a774.0 msn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.5 msn/an/a880.31 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.6 msn/an/a815.45 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.6 msn/an/a979.52 MiBn/a
Vector.appendn/a1.95Kn/an/a254.8 msn/an/a667.94 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a254.9 msn/an/a681.33 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.01 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.07 GiBn/a
String.appendn/a1.21Kn/an/a252.8 msn/an/a965.88 MiBn/a
Int.gcdn/a824.190n/an/a252.4 msn/an/a619.82 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a822.230n/an/a6.891 sn/an/a1.72 GiBn/a
Nat.sub_le_of_le_addn/a673.260n/an/a252.5 msn/an/a564.67 MiBn/a
Nat.add_commn/a166.640n/an/a252.0 msn/an/a451.35 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 7d3388b

backends: ooc=execute compile=execute · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a4.352 sn/an/a24.24Kn/an/a306.41 MiBn/an/a105,492n/an/a10.59 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.15 GiBn/a
String.splitn/a6.71Kn/an/a263.9 msn/an/a1.05 GiBn/a
InitStdn/a6.41Kn/an/a13.882 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a838.87 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.5 msn/an/a982.43 MiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.9 msn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.7 msn/an/a917.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.8 msn/an/a812.00 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.01 GiBn/a
Vector.appendn/a1.96Kn/an/a254.3 msn/an/a659.75 MiBn/a
Nat.gcd_commn/a1.54Kn/an/a253.9 msn/an/a643.67 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a920.13 MiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a978.00 MiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.02 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a853.640n/an/a6.637 sn/an/a1.80 GiBn/a
Int.gcdn/a824.010n/an/a252.4 msn/an/a612.75 MiBn/a
Nat.sub_le_of_le_addn/a673.230n/an/a252.5 msn/an/a568.57 MiBn/a
Nat.add_commn/a166.670n/an/a252.0 msn/an/a467.85 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 1103162

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a4.301 sn/an/a24.53Kn/an/a306.41 MiBn/an/a105,492n/an/a10.61 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.33 GiBn/a
String.splitn/a6.71Kn/an/a264.3 msn/an/a1.12 GiBn/a
InitStdn/a6.30Kn/an/a14.129 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a931.07 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.7 msn/an/a1.02 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.7 msn/an/a887.48 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a765.2 msn/an/a841.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.08 GiBn/a
Vector.appendn/a1.96Kn/an/a254.4 msn/an/a669.67 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a1.79Kn/an/a1.015 sn/an/a914.25 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a255.3 msn/an/a657.64 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.16 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.11 GiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.08 GiBn/a
Int.gcdn/a823.880n/an/a252.5 msn/an/a607.91 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a821.940n/an/a6.893 sn/an/a1.64 GiBn/a
Nat.sub_le_of_le_addn/a673.360n/an/a252.5 msn/an/a547.86 MiBn/a
Nat.add_commn/a166.540n/an/a252.2 msn/an/a435.36 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b82aed8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.947 sn/an/a26.73Kn/an/a11.24 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.412 sn/an/a8.55Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.404 sn/an/a884.740n/an/a1.91 GiBn/a
Array.extract_appendn/a1.017 sn/an/a1.52Kn/an/a1.25 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.5 msn/an/a3.43Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.09 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.15 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.6 msn/an/a5.07Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a264.7 msn/an/a6.70Kn/an/a1.19 GiBn/a
List.mergeSortn/a262.3 msn/an/a5.54Kn/an/a998.22 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a765.08 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a702.54 MiBn/a
Nat.sub_le_of_le_addn/a253.2 msn/an/a671.490n/an/a601.42 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.01 GiBn/a
Int.gcdn/a252.5 msn/an/a823.710n/an/a636.20 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.730n/an/a484.27 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 930ebb8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.355 sn/an/a24.22Kn/an/a11.14 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.409 sn/an/a8.55Kn/an/a2.03 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.98 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.23 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.20 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.2 msn/an/a5.08Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.8 msn/an/a6.81Kn/an/a1.46 GiBn/a
String.splitn/a265.0 msn/an/a6.69Kn/an/a1.31 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1013.36 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a891.58 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a745.38 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.13 GiBn/a
Int.gcdn/a252.5 msn/an/a823.670n/an/a762.65 MiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.360n/an/a651.23 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.570n/an/a508.57 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs d69aaee

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.231 sn/an/a24.93Kn/an/a11.03 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.159 sn/an/a8.76Kn/an/a2.09 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.090n/an/a2.04 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.10 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a939.29 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.4 msn/an/a2.38Kn/an/a1014.35 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.4 msn/an/a2.37Kn/an/a1.25 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.15 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.51 GiBn/a
String.splitn/a265.1 msn/an/a6.69Kn/an/a1.25 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1008.04 MiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a775.05 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a730.16 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.24 GiBn/a
Nat.sub_le_of_le_addn/a252.7 msn/an/a672.780n/an/a616.39 MiBn/a
Int.gcdn/a252.5 msn/an/a823.830n/an/a666.57 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a499.68 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!bencher-thresholds-reset all

@github-actionsgithub-actionsBot added the bencher-thresholds-reset:all bencher baseline reset queued on merge label Jul 8, 2026
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset queued for: all — will anchor to the merge commit when this PR merges.

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 8595ee8

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.258 sn/an/a24.78Kn/an/a11.27 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.158 sn/an/a8.76Kn/an/a2.04 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.140n/an/a2.01 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a988.55 MiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.32 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.29 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.24 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.9 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.3 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a265.4 msn/an/a6.68Kn/an/a1.26 GiBn/a
List.mergeSortn/a261.9 msn/an/a5.55Kn/an/a1004.43 MiBn/a
Nat.gcd_commn/a254.8 msn/an/a1.53Kn/an/a813.46 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a740.42 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.08 GiBn/a
Nat.add_commn/a252.6 msn/an/a166.290n/an/a503.77 MiBn/a
Int.gcdn/a252.5 msn/an/a823.900n/an/a707.26 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.440n/an/a634.98 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 94e942d

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.050 sn/an/a26.05Kn/an/a11.11 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.426 sn/an/a8.54Kn/an/a2.00 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.149 sn/an/a921.510n/an/a1.97 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.13 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a991.18 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.22 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.0 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.37 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.28 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a990.69 MiBn/a
Nat.gcd_commn/a255.1 msn/an/a1.53Kn/an/a776.26 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a681.59 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.220n/an/a604.52 MiBn/a
Int.gcdn/a252.5 msn/an/a823.790n/an/a672.67 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.760n/an/a477.46 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5fa582b

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.993 sn/an/a26.42Kn/an/a11.05 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.677 sn/an/a8.34Kn/an/a2.11 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.148 sn/an/a921.570n/an/a1.86 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.12 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.25 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.17 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.38 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1.03 GiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a855.45 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a715.77 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.6 msn/an/a673.030n/an/a612.18 MiBn/a
Int.gcdn/a252.5 msn/an/a823.860n/an/a724.20 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.550n/an/a479.64 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 3c3d090

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.039 sn/an/a26.12Kn/an/a11.25 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.174 sn/an/a8.75Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.99 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.21 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.30 GiBn/a
Char.ofOrdinal_le_of_len/a775.2 msn/an/a3.43Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.08 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.3 msn/an/a5.08Kn/an/a1.14 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.4 msn/an/a6.82Kn/an/a1.30 GiBn/a
String.splitn/a265.2 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1012.01 MiBn/a
Nat.gcd_commn/a254.9 msn/an/a1.53Kn/an/a783.17 MiBn/a
Vector.appendn/a254.4 msn/an/a1.96Kn/an/a736.90 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a956.42 MiBn/a
Int.gcdn/a252.4 msn/an/a824.030n/an/a669.97 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.580n/an/a605.84 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a482.89 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 8, 2026 21:46
arthurpaulino
arthurpaulino previously approved these changes Jul 9, 2026
Lowering the witness cap below Zisk's built-in default (10) was measured to
have a negligible effect on host RAM and prove time for the kernel typecheck
workload, so the CLI override (which defaulted to 5) is removed and the prover
uses EmbeddedOpts::default(). Drop the now-stale flag mentions and per-RAM
tuning guidance from the README, the cost-model doc, and the shard.rs model
comments.
Rebased onto main (post #411 + #459) and integrated with the renamed
bench-main.yml and reworked bencher-track interface.
- Benchmarks/Vectors.csv: single shared source of truth (71 library constants
from Init/Std/Mathlib/Lean). Consumed by Aiur (bench-typecheck --manifest),
the zkVM hosts, and shell.
- bench-pr.yml: `!benchmark [aiur] [zisk] [sp1|all] [execute|prove]` over the
curated set, posting a main-vs-PR table; main results cached by base SHA.
Hardened: comment body from env (no injection), allowlisted env parsing.
- .github/scripts/{bench.py,run.sh}: parse/manifest/compare/comment, and the
compile-.ixe + backend driver (cycles/execute-time/throughput/peak-rss, plus
shards/max-shard-cycles for sharded runs).
- .github/actions/install-{sp1,zisk}: shared zkVM toolchain + deps install,
used by bench-pr.yml, bench-main.yml, and riscv-bench.yml.
- bench-main.yml: add zkvm-execute (Zisk/SP1 cycle counts + time/RAM) and
native-check (native parallel `ix check --anon` throughput) jobs, using the
new bencher-track workload/thresholds interface.
- bench-typecheck: add --constant / --skip-deps (align with the zkVM hosts;
--skip-deps replaces --subject-only) and --execute-only (fast execute path).
issue_comment workflows only run from the default branch, so the `!benchmark`
path can't be exercised on a PR branch. Add a pull_request trigger (base/head
from the PR payload; empty comment → parser defaults) to test pre-merge.
Revert before merge — delete the `pull_request:` trigger; the dual base/head
resolution and `|| pull_request.number` fallbacks are harmless to keep.
Revert the cgroup mode (and the earlier RLIMIT_DATA layer): back to the
plain tree-RSS sampler, sudo-free and identical everywhere. The burst
problem is handled by cadence instead of a kernel cap: sampling drops
from ~1s to 0.2s once the tree is within 20 GB of the ceiling (100 GB
at the default 120), and the post-TERM grace re-checks every 0.2s,
KILLing immediately while the tree is still at the ceiling. Worst-case
overshoot shrinks from GB-per-second x seconds to x ~0.4s.
ix bench run still hard-fails when the watchdog script is missing — an
unenforced ceiling is not a benchmark run.
The flat 120 was a leftover from the RLIMIT_DATA era (a VA cap needed
fixed slack above RSS); for the sampler it protects nothing on machines
with less RAM and leaves ~3 GB of headroom on the 123 GiB runner. Back
to MemTotal minus 12 GiB (runner: 111; 64 GiB workstation: 52), which
the adaptive fast-cadence zone sits under wherever the run happens.
Same lesson aiur taught: shared measure names (peak-rss, throughput)
mean that mode's phase, so a future zisk/sp1 prove mode needs its own
testbed — and an unsuffixed zisk-check silently meaning "execute only"
is the asymmetry we just cleaned up for aiur. Renaming now rides the
merge's existing bencher migration (console rename + reset-all) instead
of paying a second cycle later.
The zkvm job derives testbed/workload from the cell's mode, so a prove
cell would land on zisk-check-prove-x64-32x with no workflow edits.
The per-cell .ixe cache only helped re-runs: on a fresh commit every
same-env cell missed the cold cache simultaneously and paid its own ix
compile in parallel. A prepare job (matrix over ci parse's new
prep-envs output — envs consumed by non-compile cells) now compiles
each .ixe once and publishes it under the key the cells already
restore, so cells start warm. Skipped for compile-only requests, whose
cells compile fresh by design; a prepare failure stops the cells (they
would just re-fail the same compile lazily).
Two more runner deaths, two measured causes:
1. aiur prove crossed the ceiling by 13 GB inside one 0.2s sample —
first-touch of pre-reserved prover buffers grows RSS at memory
bandwidth, which no cadence outruns. Headroom widens to 24 GiB (the
~123 GiB runner's ceiling drops 111 → 99) so the worst measured
overshoot plus OS/agent fits, and the sampler now TERMs on a
one-sample linear projection (level + last delta), buying back one
sample of reaction time — verified live: the kill fires before the
ceiling is crossed on a steep ramp.
2. zisk died at a nominal 0.4 GB over: the ASM services' locked shared
segments are under-attributed by per-process RSS. /dev/shm usage now
counts into the tree total.
…tion
Everything hairy in the sampler (two ps/awk tree walks, the /dev/shm
add-on, adaptive cadence, trajectory projection, conditional grace)
existed to reconstruct a number the kernel already publishes:
/proc/meminfo MemAvailable, its own estimate of what can be allocated
without thrashing. It natively accounts for everything the tree
consumes (RSS, locked shm, page tables) plus everything else on the
host, and correctly ignores reclaimable page cache.
The watchdog now kills the tree when MemAvailable < MemTotal - ceiling,
at a fixed 0.25s cadence (a meminfo read is ~free, so no adaptive zone)
with a plain TERM -> 2s -> KILL (rows are flushed continuously; the
grace was only ever for destructors). The floor never drops below 4 GiB
so an oversized ceiling still protects the host, and a machine without
/proc/meminfo is refused loudly. ~40 lines shorter, and strictly harder
to fool than the tree-RSS sum it replaces.
…ottery
A 50-run log sweep showed the ubuntu-latest build hosts hand out 4 CPU
models, baking AVX-512 into the -Ctarget-cpu=native binaries on only
~18% of builds — main's history randomly flipped Plonky3 codepaths
between pushes, and main-vs-PR comparisons crossed ISAs ~30% of the
time. The warp fleet is CPU-uniform (AMD EPYC 9R45 / Intel, all
AVX-512), so building there makes the ISA deterministic AND faster.
Every job that runs the binaries moves with the build (a non-AVX-512
GitHub host would SIGILL): bench-main's plan, bench-pr's build (parse)
and assemble (report). setup/comment/thresholds-reset run no ix and
stay on ubuntu-latest. The Log build CPU step stays, as the check that
a regression wasn't a fleet change.
The cache-hit and cache-miss branches each carried their own
lean-action step (build vs provision-only); a computed build flag
collapses them — miss builds, hit provisions the toolchain the
restored binaries need.
The 24 GiB headroom killed the Mathlib compile 3 GB from completion
(machine-wide usage ~99.6 GB vs the 99 ceiling): that headroom is sized
for the aiur prover's memory-bandwidth bursts (~13 GB between samples),
while ix compile grows build-paced at a few GB/s and legitimately peaks
near 100 GB. One number can't serve both on a 123 GB machine, so the
headroom moves into the registry per backend: 24 GiB default (provers),
12 for compile (runner ceiling 111, ~11 GB above the measured Mathlib
peak, floor still 4x its worst per-sample growth).
With the MemAvailable watchdog, the per-backend headroom machinery
reduces to one number: 110 sits above the largest legitimate workload
(Mathlib ix compile, ~100 GB) and leaves a ~13 GB free floor on the
~123 GiB runner; the script's 4 GiB minimum floor keeps smaller
machines protected when the default exceeds their RAM. Deletes the
headroomGb registry field and the /proc/meminfo parsing in Lean.
Derived again (a flat 110 protects nothing on smaller machines and
tracks nothing when the runner class changes): MemTotal - 15 puts the
~123 GiB runner at ~108, above Mathlib ix compile's ~100 GB peak, with
the 15 GB as the MemAvailable kill floor. Same rule for every backend.
The serialized env size wiggles slightly run-to-run, so the 0/0 pin
alerts on noise. A 1% band still catches real serialization-format
regressions (~32 MB on Mathlib) while tolerating the wiggle. constants
stays pinned — the count is deterministic. That the .ixe is not
byte-reproducible at all is worth its own investigation for a
content-addressed store; noted in the threshold comment.
Replaces the avx512f present/absent binary with the full avx2/avx512*
flag list from cpuinfo (or 'absent'), so a regression can be traced to
exactly which extensions the build host offered.
plan (ci matrix) and assemble (bench report) never execute the Rust
objects where the warp build's AVX-512 lives — Lean code is compiled by
leanc at baseline ISA, and Rust has no life-before-main initializers.
Each job's comment records the assumption: move back to warp if ix
startup or these subcommands ever touch the FFI. The build/prepare/
benchmark/compile jobs keep warp (they compile with target-cpu=native
or execute the prover FFI).
Validated on both ubuntu-latest and warp runners (ix-cpu-info's
cgroup-memcap.yml): systemd-run --user --scope -p MemoryMax=<G>
-p MemorySwapMax=0 hard-caps the tool's cgroup; the kernel OOM-kills at
the ceiling with SIGKILL (exit 137, the orchestrator's OOM signal). No
sampler cadence to race, no tree to sum, no burst arithmetic — the
cgroup charges the whole tree's resident memory and cached allocator
reservations don't count.
The script shrinks to an exec: a passwordless-sudo enable-linger boots
the user manager on CI (no-op locally where a session provides one),
XDG_RUNTIME_DIR is defaulted, and systemd-run replaces the process. No
fallback: without a user bus it fails loudly (exit 1 -> the cell
aborts).
bench-main runs on pushes to main only again; bench-pr is
issue_comment-only — the pull_request trigger, its fixed test command,
the head-ref gate, and the || fallbacks in concurrency/SHA-resolution/
comment-target all go with it. The OOM enforcement and both workflows
were verified end to end from this branch before the revert.
The zisk shard-plan run for the heavy bitblast block exposed the hole:
a plain systemd scope doesn't set memory.oom.group, so at the cap the
kernel killed only the biggest process — Zisk's ASM MT service — and
the surviving host converted the memory kill into a clean exit 1, which
the orchestrator (correctly) treats as a deterministic failure and
aborts the cell instead of recording the oom row this expected-OOM
constant should produce.
The wrapper now writes memory.oom.group=1 on the scope's cgroup (user-
delegated, no sudo) before exec'ing the tool: breach -> the whole tree
dies with SIGKILL -> exit 137 -> oom row, same semantics the sampler
era had. Failure to set it exits 2 rather than running with
single-victim kill semantics.
One-off runs no longer need a names file: --consts takes the same
comma-separated grammar as the tools, unioned with --names-file via
ConstsFile.gather (the machinery every other consumer already uses).
…lace name files
- ix bench run/shard take --ixe <path> (must exist, used as-is; no flag
= compile fresh) instead of the magic reuse-if-present flag. The
workflows pass the cache-restored path explicitly; bench-pr guards
with [ -f ] so a missed cache still compiles rather than failing.
- ix bench run drops --names-file: --consts (comma-separated, the
tools' grammar) is the one selection override. bench-pr's targeted
base run builds the list with paste -sd, from fetch-main's
missing-out file.
- fetch-main gains --consts alongside the workflow-facing --names file
(unioned), so the local compare-vs-main flow needs no temp files.
…ompile
The prepare job compiled the .ixe for the prover cells while a
compile-backend cell compiled the same env again for measurement. The
renamed compile job (prepare was ambiguous) now runs for every
requested env and serves both purposes: it publishes the .ixe the
prover cells restore, and its measured row is published too
(bench-pr-row-<sha>-<env>) for the compile cell to reuse as its PR side
— same runner class, same binaries, same command. A row-cache miss just
means the compile cell compiles and measures itself, as before.
ci parse's prep-envs output simplifies to envs (all requested envs).
The rss-sampler/json-sink additions this branch relied on landed
upstream in argumentcomputer/tracing-texray; pin the merged commit
465bbca in place of the pre-merge fork rev.
@samuelburnham
samuelburnham merged commit 49945d1 into mainJul 9, 2026
17 of 18 checks passed
@samuelburnham
samuelburnham deleted the sb/ci-benchmarks branch July 9, 2026 18:10
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset to 49945d1 for: aiur-check-execute aiur-check-prove ix-compile ooc-check sp1-check-execute zisk-check-execute

samuelburnham added a commit that referenced this pull request Jul 10, 2026
* bench: curate Vectors.csv by measured workload distinctness
Local aiur prove runs plus per-constant closure profiles (targets,
ingress bytes, fft-cost) showed a third of the cheap tier measuring
the same thing:
- drop the base-cost floor duplicates (3-9 constant closures, <13 kB,
prove within noise of each other): Acc.rec, Trans.mk, Sum.elim,
Prod.map, Option.bind, Array.toList — Eq.rec stays as the recursor
representative, Except.bind for monadic bind, WellFounded.fix for
recursion combinators;
- drop Nat.toDigits (strictly inside Nat.repr's closure), Array.filter
and Array.foldlM (within 1.5x of Array.map, which stays), Int.add
(scale twin of primary Nat.add_comm; Int is covered by emod/gcd);
- drop the Int8/Int16/Int32 instRxcHasSize_eq triplets (byte-identical
siblings of the kept Int64) and the trivials Nat, HEq, HEq.rec,
Nat.add;
- add Std.HashMap as HEAVY: 1,982-constant closure, 2.28 MB ingress,
84.6 s / 49 GiB / 18.4B FFTs proved locally — 6-40x every cheap
constant on every axis.
The prove-feasible full set is now 20 constants spanning recursors,
WF recursion, monadic bind, List/Array, Nat/Int/BitVec/USize
arithmetic, decidability, bytes/strings, hashing, and (via the heavy
tier) big structures.
* fix(bench): align tracing-texray pins with the root workspace
The zisk and sp1 hosts pinned tracing-texray at an older rev than the
root workspace (bumped in #467), so cargo linked TWO instances of the
crate into each host: main() started one instance's RSS sampler while
ix_bench::peak_rss_bytes() read the other's never-started one — always
None — and the resulting null was dropped by `ix bench bmf`'s
numeric-fields filter. Net effect: every zisk upload silently lost
peak-rss (parent and per-shard rows alike) since the pin diverged.
Align both hosts on the root rev and re-lock; cargo tree confirms a
single shared instance, so the sampler the host starts is the one the
row emission reads.
* bench: zisk rows report constants and shards
constants = the named constants certified over the checked closure —
the pre-shard input set, the same universe the aiur rows count via
closureFrom. The cheap paths emit the cover size; the shard-plan path
emits `needed` (targets this run answers for), computed before shard
partitioning and store-reuse filtering, so neither sharding overhead
nor covered-shard skips distort it. Anon-work dedup shrinks the WORK
item count, never this number; sharding's extra work stays visible in
cycles/execute-time where it belongs.
shards was already emitted on shard-plan rows; a non-sharded execute
now reports 1 (a single leaf IS one shard) instead of omitting the
field and rendering n/a in the compare table.
bench-main pins constants 0/0 on the zkvm testbeds like the other
cells: it is deterministic, and a drop means lost coverage, not a win.
* bench: compare-table and !benchmark upgrades
- aiur prove cells report throughput (constants/prove-time was already
uploaded and thresholded; the registry column list just omitted it —
every other cell follows the time/throughput/peak-rss convention).
- zisk compare tables gain constants and shards columns, next to cycles.
- The per-constant phase drill-downs are now opt-in via BENCH_PHASES=1
(a passthrough config key): the spans are noisy and dynamically
named, so the default comment stays at the headline measures.
- KEY=VALUE config parses inline on the command line too, whitespace-
separated — the single-line form for bench-pr.yml's manual
workflow_dispatch, whose input box cannot hold newlines. Inline keys
are strict (an unknown key rejects, like a typo'd backend); config
lines stay lenient since comment prose contains `=`.
* bench: `ix bench plots` — registry-driven bencher dashboard sync
One plot per (testbed, measure) bench-main tracks, one line per
benchmark row the cell uploads, plus the cross-kernel input-constants
overlay (aiur and zisk report the same pre-shard closure count, so the
paired lines must coincide — separation is a coverage-drift tripwire).
Titles, dashboard ordering, redundancy skips, and canonical measure
units live here as typed data; the spec derives from the registry +
Vectors.csv, so nothing is hand-listed.
Idempotent, keyed by title: matching plots are kept (index
re-asserted), stale ones deleted and recreated (the plot PATCH endpoint
only takes index/title/window), hand-pinned ones untouched. The sync
also asserts measure units — bencher auto-creates measures with
placeholder units on first upload, leaving plots unitless.
All bencher.dev traffic goes through the bencher CLI; --dry-run
previews with no key. bencher-plots.yml dispatches it manually (like
bencher-thresholds-reset) off the freshest bench-bins cache: run it
after a registry change has merged AND bench-main has built it — the
registry is compiled into the binary, and a new constant only gets its
plot line once its first rows upload.
* fix(ci): bench-pr Mathlib env — mathlib lives in the Benchmarks/Compile subpackage
BENCH_ENVS=Mathlib died at 'Get Mathlib Cache' with 'unknown executable
cache': use-mathlib-cache runs `lake exe cache get`, and mathlib is a
dependency of the Benchmarks/Compile subpackage, not the root workspace
lean-action was pointed at. bench-main had this right; bench-pr now
mirrors it:
- compile job: provision from Benchmarks/Compile (same toolchain as
root) and `lake build Compile<env>` before the measured compile;
- benchmark cells: no mathlib cache at all — the .ixe comes from the
compile job, and the lazy Mathlib fallback fails loudly rather than
fetching oleans it still couldn't build;
- base side: the build action stays on the base root (it builds ix);
a separate step fetches/builds base mathlib oleans in the subpackage
when a Mathlib cell must re-run the base.
* ci: bench-pr cells fail on a compile-cache miss instead of recompiling
The benchmark cells carried two lazy fallbacks for artifacts the
compile job publishes in the same run: a missing compile row made the
compile cell re-measure the compile in-cell, and a missing `.ixe` made
`ix bench run` recompile the env fresh. Neither could ever work for
the Mathlib env (its oleans live only in the compile job's subpackage
provisioning), so the fallbacks meant InitStd and Mathlib failed
differently for the same infrastructure problem.
Both restores are now fail-on-cache-miss and the run step always
passes `--ixe`: the artifacts were published moments earlier, so a
miss is an infrastructure failure and every env fails the same way,
loudly, at the restore step. The in-cell "Save PR .ixe" step goes with
the fallback that produced it.
* bench: throughput means constants per second on every backend
The zkVM hosts uploaded cycles/second under the same `throughput` slug
every other cell used for constants/second, so the shared measure had
no honest unit (and the dashboard showed a generic "per second"). The
hosts now report constants/second like everyone else — cheap zisk rows
over the certified cover, shard-plan rows over the pre-shard `needed`
set, sp1 over its checked count (its stdout already printed this
number; the row disagreed) — via one shared `ix_bench::throughput`
calculator. A zkVM's cycle rate stays derivable from its `cycles` and
`execute-time` fields.
The bencher measure's canonical units become "constants / second".
NB: the first post-merge zisk upload drops throughput by orders of
magnitude (meaning change, not a regression) — reset the
zisk-check-execute baseline (!bencher-thresholds-reset) right after,
or the 10% lower bound alerts.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bencher-thresholds-reset:allbencher baseline reset queued on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@samuelburnham@arthurpaulino@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ci: Standardize benchmarks and input constants - #467

Merged
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks
Jul 9, 2026
Merged

ci: Standardize benchmarks and input constants#467
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks

Conversation

@samuelburnham

@samuelburnhamsamuelburnham commented Jul 2, 2026

Copy link
Copy Markdown
Member

CI benchmarking:

  • ix bench Lean CLI for comprehensive local and CI benchmarks of ix compilation and typechecking over multiple backends, against a curated set of constants. Provides comparative runs against local history, or current main (fetches cached bencher.dev results), and formats them in a Markdown table.
  • Updates bench-pr.yml to use this framework and print the Markdown table as a PR comment (see example comments below).
  • Updates bench-main.yml to fully bench all backends and upload them to bencher.dev, except for RISC-V proving for now due to GPU requirements. SP1 is also left as a TODO.
  • Now tracks per-phase span measurements from tracing-texray as first-class benchmark metrics, and uploads them to bencher.dev for regression testing and also direct PR comparison in the comment table with a collapsible drop-down view (not fully tested).
  • Adds a RAM watchdog via systemd-run cgroups to prevent an OOM constant from killing the runner and failing the workflow.
  • Moves the benchmark binaries onto AVX-512-compatible runner after testing that the Warpbuild 32 vCPU runner (AMD EPYC 9R45 in all my tests) has full AVX-512 support. This should provide a one-time speedup that more accurately tracks production performance.

Usage

Local benchmarks:

# Compare local runs
ix bench run --backend aiur --env InitStd --mode execute --consts Nat.add_comm --ixe initstd.ixe
ix bench compare --backend aiur --env InitStd --mode execute --consts Nat.add_comm
# Compare against main
ix bench fetch-main --sha $(git rev-parse origin/main) \
--backend aiur --mode execute --consts Nat.add_comm --out main.json
ix bench compare --backend aiur --env InitStd --mode execute \
--main main.json --pr .lake/benches/aiur-InitStd-execute.json

PR comparative benchmarks against main:

!benchmark [aiur] [zisk] [sp1] [ooc] [compile] | all [execute]
# Optional env vars
BENCH_ENVS=InitStd,Mathlib
BENCH_FULL=1 # the env's full curated set (56 InitStd / 10 Mathlib consts) instead of the default primary subset (17 InitStd / 2 Mathlib)
BENCH_SHARD=1 # restrict to the multi-shard target constants
RUST_LOG=info

Successful runs:

Merge after argumentcomputer/tracing-texray#3

Note

Before merge:

  • Bencher console: rename aiur-typecheck-x64-32x → aiur-check-prove-x64-32x, zisk-check-x64-32x → zisk-check-execute-x64-32x; archive stale shard-cycles:N measures.
  • Delete the old threshold Git tags for aiur as the names have been updated

@samuelburnham
samuelburnhamforce-pushed the sb/ci-benchmarks branch 7 times, most recently from 07264b9 to f1ff88aCompareJuly 3, 2026 20:39
Comment thread.github/workflows/bench-pr.yml Fixed
Comment thread.github/workflows/bench-pr.yml Fixed
@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b56201f

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

No result tables were produced — see the workflow logs.

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 70d60b8

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%file-size (main)file-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.222 sn/an/a24.99Kn/an/a306.41 MiBn/an/a105492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqOOM6.86Kn/aOOM264.7 msn/aOOM1.16 GiBn/a
String.splitOOM6.71Kn/aOOM264.0 msn/aOOM971.84 MiBn/a
InitStdn/a6.08Kn/an/a14.644 sn/an/a1.48 GiBn/a
List.mergeSortOOM5.56Kn/aOOM261.5 msn/aOOM802.59 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendOOM5.09Kn/aOOM529.6 msn/aOOM998.39 MiBn/a
Char.ofOrdinal_le_of_leOOM3.44Kn/aOOM773.9 msn/aOOM980.05 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqOOM2.38Kn/aOOM764.8 msn/aOOM841.74 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqOOM2.37Kn/aOOM764.8 msn/aOOM977.59 MiBn/a
Vector.appendOOM1.96Kn/aOOM254.4 msn/aOOM665.40 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqOOM1.79Kn/aOOM1.015 sn/aOOM853.80 MiBn/a
Nat.gcd_commOOM1.53Kn/aOOM254.2 msn/aOOM640.46 MiBn/a
Array.extract_appendOOM1.52Kn/aOOM1.017 sn/aOOM1.04 GiBn/a
Vector.extract_append._proof_2OOM1.29Kn/aOOM1.012 sn/aOOM916.29 MiBn/a
String.appendOOM1.21Kn/aOOM253.1 msn/aOOM1.01 GiBn/a
Int.gcdOOM823.880n/aOOM252.5 msn/aOOM616.14 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualOOM821.770n/aOOM6.895 sn/aOOM1.73 GiBn/a
Nat.sub_le_of_le_addOOM673.120n/aOOM252.6 msn/aOOM568.05 MiBn/a
Nat.add_commOOM166.670n/aOOM252.0 msn/aOOM457.39 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 431ae38

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a3.955 sn/an/a26.67Kn/an/a306.41 MiBn/an/a105492n/an/a10.67 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.87Kn/an/a264.4 msn/an/a1.19 GiBn/a
String.splitn/a6.72Kn/an/a263.8 msn/an/a1.07 GiBn/a
InitStdn/a6.41Kn/an/a13.881 sn/an/a1.47 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.7 msn/an/a858.98 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.10Kn/an/a528.9 msn/an/a1.01 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a774.0 msn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.5 msn/an/a880.31 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.6 msn/an/a815.45 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.6 msn/an/a979.52 MiBn/a
Vector.appendn/a1.95Kn/an/a254.8 msn/an/a667.94 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a254.9 msn/an/a681.33 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.01 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.07 GiBn/a
String.appendn/a1.21Kn/an/a252.8 msn/an/a965.88 MiBn/a
Int.gcdn/a824.190n/an/a252.4 msn/an/a619.82 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a822.230n/an/a6.891 sn/an/a1.72 GiBn/a
Nat.sub_le_of_le_addn/a673.260n/an/a252.5 msn/an/a564.67 MiBn/a
Nat.add_commn/a166.640n/an/a252.0 msn/an/a451.35 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 7d3388b

backends: ooc=execute compile=execute · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a4.352 sn/an/a24.24Kn/an/a306.41 MiBn/an/a105,492n/an/a10.59 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.15 GiBn/a
String.splitn/a6.71Kn/an/a263.9 msn/an/a1.05 GiBn/a
InitStdn/a6.41Kn/an/a13.882 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a838.87 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.5 msn/an/a982.43 MiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.9 msn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.7 msn/an/a917.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.8 msn/an/a812.00 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.01 GiBn/a
Vector.appendn/a1.96Kn/an/a254.3 msn/an/a659.75 MiBn/a
Nat.gcd_commn/a1.54Kn/an/a253.9 msn/an/a643.67 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a920.13 MiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a978.00 MiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.02 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a853.640n/an/a6.637 sn/an/a1.80 GiBn/a
Int.gcdn/a824.010n/an/a252.4 msn/an/a612.75 MiBn/a
Nat.sub_le_of_le_addn/a673.230n/an/a252.5 msn/an/a568.57 MiBn/a
Nat.add_commn/a166.670n/an/a252.0 msn/an/a467.85 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 1103162

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a4.301 sn/an/a24.53Kn/an/a306.41 MiBn/an/a105,492n/an/a10.61 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.33 GiBn/a
String.splitn/a6.71Kn/an/a264.3 msn/an/a1.12 GiBn/a
InitStdn/a6.30Kn/an/a14.129 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a931.07 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.7 msn/an/a1.02 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.7 msn/an/a887.48 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a765.2 msn/an/a841.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.08 GiBn/a
Vector.appendn/a1.96Kn/an/a254.4 msn/an/a669.67 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a1.79Kn/an/a1.015 sn/an/a914.25 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a255.3 msn/an/a657.64 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.16 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.11 GiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.08 GiBn/a
Int.gcdn/a823.880n/an/a252.5 msn/an/a607.91 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a821.940n/an/a6.893 sn/an/a1.64 GiBn/a
Nat.sub_le_of_le_addn/a673.360n/an/a252.5 msn/an/a547.86 MiBn/a
Nat.add_commn/a166.540n/an/a252.2 msn/an/a435.36 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b82aed8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.947 sn/an/a26.73Kn/an/a11.24 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.412 sn/an/a8.55Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.404 sn/an/a884.740n/an/a1.91 GiBn/a
Array.extract_appendn/a1.017 sn/an/a1.52Kn/an/a1.25 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.5 msn/an/a3.43Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.09 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.15 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.6 msn/an/a5.07Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a264.7 msn/an/a6.70Kn/an/a1.19 GiBn/a
List.mergeSortn/a262.3 msn/an/a5.54Kn/an/a998.22 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a765.08 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a702.54 MiBn/a
Nat.sub_le_of_le_addn/a253.2 msn/an/a671.490n/an/a601.42 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.01 GiBn/a
Int.gcdn/a252.5 msn/an/a823.710n/an/a636.20 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.730n/an/a484.27 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 930ebb8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.355 sn/an/a24.22Kn/an/a11.14 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.409 sn/an/a8.55Kn/an/a2.03 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.98 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.23 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.20 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.2 msn/an/a5.08Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.8 msn/an/a6.81Kn/an/a1.46 GiBn/a
String.splitn/a265.0 msn/an/a6.69Kn/an/a1.31 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1013.36 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a891.58 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a745.38 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.13 GiBn/a
Int.gcdn/a252.5 msn/an/a823.670n/an/a762.65 MiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.360n/an/a651.23 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.570n/an/a508.57 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs d69aaee

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.231 sn/an/a24.93Kn/an/a11.03 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.159 sn/an/a8.76Kn/an/a2.09 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.090n/an/a2.04 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.10 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a939.29 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.4 msn/an/a2.38Kn/an/a1014.35 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.4 msn/an/a2.37Kn/an/a1.25 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.15 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.51 GiBn/a
String.splitn/a265.1 msn/an/a6.69Kn/an/a1.25 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1008.04 MiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a775.05 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a730.16 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.24 GiBn/a
Nat.sub_le_of_le_addn/a252.7 msn/an/a672.780n/an/a616.39 MiBn/a
Int.gcdn/a252.5 msn/an/a823.830n/an/a666.57 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a499.68 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!bencher-thresholds-reset all

@github-actionsgithub-actionsBot added the bencher-thresholds-reset:all bencher baseline reset queued on merge label Jul 8, 2026
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset queued for: all — will anchor to the merge commit when this PR merges.

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 8595ee8

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.258 sn/an/a24.78Kn/an/a11.27 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.158 sn/an/a8.76Kn/an/a2.04 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.140n/an/a2.01 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a988.55 MiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.32 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.29 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.24 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.9 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.3 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a265.4 msn/an/a6.68Kn/an/a1.26 GiBn/a
List.mergeSortn/a261.9 msn/an/a5.55Kn/an/a1004.43 MiBn/a
Nat.gcd_commn/a254.8 msn/an/a1.53Kn/an/a813.46 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a740.42 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.08 GiBn/a
Nat.add_commn/a252.6 msn/an/a166.290n/an/a503.77 MiBn/a
Int.gcdn/a252.5 msn/an/a823.900n/an/a707.26 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.440n/an/a634.98 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 94e942d

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.050 sn/an/a26.05Kn/an/a11.11 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.426 sn/an/a8.54Kn/an/a2.00 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.149 sn/an/a921.510n/an/a1.97 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.13 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a991.18 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.22 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.0 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.37 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.28 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a990.69 MiBn/a
Nat.gcd_commn/a255.1 msn/an/a1.53Kn/an/a776.26 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a681.59 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.220n/an/a604.52 MiBn/a
Int.gcdn/a252.5 msn/an/a823.790n/an/a672.67 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.760n/an/a477.46 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5fa582b

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.993 sn/an/a26.42Kn/an/a11.05 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.677 sn/an/a8.34Kn/an/a2.11 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.148 sn/an/a921.570n/an/a1.86 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.12 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.25 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.17 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.38 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1.03 GiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a855.45 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a715.77 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.6 msn/an/a673.030n/an/a612.18 MiBn/a
Int.gcdn/a252.5 msn/an/a823.860n/an/a724.20 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.550n/an/a479.64 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 3c3d090

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.039 sn/an/a26.12Kn/an/a11.25 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.174 sn/an/a8.75Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.99 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.21 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.30 GiBn/a
Char.ofOrdinal_le_of_len/a775.2 msn/an/a3.43Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.08 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.3 msn/an/a5.08Kn/an/a1.14 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.4 msn/an/a6.82Kn/an/a1.30 GiBn/a
String.splitn/a265.2 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1012.01 MiBn/a
Nat.gcd_commn/a254.9 msn/an/a1.53Kn/an/a783.17 MiBn/a
Vector.appendn/a254.4 msn/an/a1.96Kn/an/a736.90 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a956.42 MiBn/a
Int.gcdn/a252.4 msn/an/a824.030n/an/a669.97 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.580n/an/a605.84 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a482.89 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 8, 2026 21:46
arthurpaulino
arthurpaulino previously approved these changes Jul 9, 2026
Lowering the witness cap below Zisk's built-in default (10) was measured to
have a negligible effect on host RAM and prove time for the kernel typecheck
workload, so the CLI override (which defaulted to 5) is removed and the prover
uses EmbeddedOpts::default(). Drop the now-stale flag mentions and per-RAM
tuning guidance from the README, the cost-model doc, and the shard.rs model
comments.
Rebased onto main (post #411 + #459) and integrated with the renamed
bench-main.yml and reworked bencher-track interface.
- Benchmarks/Vectors.csv: single shared source of truth (71 library constants
from Init/Std/Mathlib/Lean). Consumed by Aiur (bench-typecheck --manifest),
the zkVM hosts, and shell.
- bench-pr.yml: `!benchmark [aiur] [zisk] [sp1|all] [execute|prove]` over the
curated set, posting a main-vs-PR table; main results cached by base SHA.
Hardened: comment body from env (no injection), allowlisted env parsing.
- .github/scripts/{bench.py,run.sh}: parse/manifest/compare/comment, and the
compile-.ixe + backend driver (cycles/execute-time/throughput/peak-rss, plus
shards/max-shard-cycles for sharded runs).
- .github/actions/install-{sp1,zisk}: shared zkVM toolchain + deps install,
used by bench-pr.yml, bench-main.yml, and riscv-bench.yml.
- bench-main.yml: add zkvm-execute (Zisk/SP1 cycle counts + time/RAM) and
native-check (native parallel `ix check --anon` throughput) jobs, using the
new bencher-track workload/thresholds interface.
- bench-typecheck: add --constant / --skip-deps (align with the zkVM hosts;
--skip-deps replaces --subject-only) and --execute-only (fast execute path).
issue_comment workflows only run from the default branch, so the `!benchmark`
path can't be exercised on a PR branch. Add a pull_request trigger (base/head
from the PR payload; empty comment → parser defaults) to test pre-merge.
Revert before merge — delete the `pull_request:` trigger; the dual base/head
resolution and `|| pull_request.number` fallbacks are harmless to keep.
Revert the cgroup mode (and the earlier RLIMIT_DATA layer): back to the
plain tree-RSS sampler, sudo-free and identical everywhere. The burst
problem is handled by cadence instead of a kernel cap: sampling drops
from ~1s to 0.2s once the tree is within 20 GB of the ceiling (100 GB
at the default 120), and the post-TERM grace re-checks every 0.2s,
KILLing immediately while the tree is still at the ceiling. Worst-case
overshoot shrinks from GB-per-second x seconds to x ~0.4s.
ix bench run still hard-fails when the watchdog script is missing — an
unenforced ceiling is not a benchmark run.
The flat 120 was a leftover from the RLIMIT_DATA era (a VA cap needed
fixed slack above RSS); for the sampler it protects nothing on machines
with less RAM and leaves ~3 GB of headroom on the 123 GiB runner. Back
to MemTotal minus 12 GiB (runner: 111; 64 GiB workstation: 52), which
the adaptive fast-cadence zone sits under wherever the run happens.
Same lesson aiur taught: shared measure names (peak-rss, throughput)
mean that mode's phase, so a future zisk/sp1 prove mode needs its own
testbed — and an unsuffixed zisk-check silently meaning "execute only"
is the asymmetry we just cleaned up for aiur. Renaming now rides the
merge's existing bencher migration (console rename + reset-all) instead
of paying a second cycle later.
The zkvm job derives testbed/workload from the cell's mode, so a prove
cell would land on zisk-check-prove-x64-32x with no workflow edits.
The per-cell .ixe cache only helped re-runs: on a fresh commit every
same-env cell missed the cold cache simultaneously and paid its own ix
compile in parallel. A prepare job (matrix over ci parse's new
prep-envs output — envs consumed by non-compile cells) now compiles
each .ixe once and publishes it under the key the cells already
restore, so cells start warm. Skipped for compile-only requests, whose
cells compile fresh by design; a prepare failure stops the cells (they
would just re-fail the same compile lazily).
Two more runner deaths, two measured causes:
1. aiur prove crossed the ceiling by 13 GB inside one 0.2s sample —
first-touch of pre-reserved prover buffers grows RSS at memory
bandwidth, which no cadence outruns. Headroom widens to 24 GiB (the
~123 GiB runner's ceiling drops 111 → 99) so the worst measured
overshoot plus OS/agent fits, and the sampler now TERMs on a
one-sample linear projection (level + last delta), buying back one
sample of reaction time — verified live: the kill fires before the
ceiling is crossed on a steep ramp.
2. zisk died at a nominal 0.4 GB over: the ASM services' locked shared
segments are under-attributed by per-process RSS. /dev/shm usage now
counts into the tree total.
…tion
Everything hairy in the sampler (two ps/awk tree walks, the /dev/shm
add-on, adaptive cadence, trajectory projection, conditional grace)
existed to reconstruct a number the kernel already publishes:
/proc/meminfo MemAvailable, its own estimate of what can be allocated
without thrashing. It natively accounts for everything the tree
consumes (RSS, locked shm, page tables) plus everything else on the
host, and correctly ignores reclaimable page cache.
The watchdog now kills the tree when MemAvailable < MemTotal - ceiling,
at a fixed 0.25s cadence (a meminfo read is ~free, so no adaptive zone)
with a plain TERM -> 2s -> KILL (rows are flushed continuously; the
grace was only ever for destructors). The floor never drops below 4 GiB
so an oversized ceiling still protects the host, and a machine without
/proc/meminfo is refused loudly. ~40 lines shorter, and strictly harder
to fool than the tree-RSS sum it replaces.
…ottery
A 50-run log sweep showed the ubuntu-latest build hosts hand out 4 CPU
models, baking AVX-512 into the -Ctarget-cpu=native binaries on only
~18% of builds — main's history randomly flipped Plonky3 codepaths
between pushes, and main-vs-PR comparisons crossed ISAs ~30% of the
time. The warp fleet is CPU-uniform (AMD EPYC 9R45 / Intel, all
AVX-512), so building there makes the ISA deterministic AND faster.
Every job that runs the binaries moves with the build (a non-AVX-512
GitHub host would SIGILL): bench-main's plan, bench-pr's build (parse)
and assemble (report). setup/comment/thresholds-reset run no ix and
stay on ubuntu-latest. The Log build CPU step stays, as the check that
a regression wasn't a fleet change.
The cache-hit and cache-miss branches each carried their own
lean-action step (build vs provision-only); a computed build flag
collapses them — miss builds, hit provisions the toolchain the
restored binaries need.
The 24 GiB headroom killed the Mathlib compile 3 GB from completion
(machine-wide usage ~99.6 GB vs the 99 ceiling): that headroom is sized
for the aiur prover's memory-bandwidth bursts (~13 GB between samples),
while ix compile grows build-paced at a few GB/s and legitimately peaks
near 100 GB. One number can't serve both on a 123 GB machine, so the
headroom moves into the registry per backend: 24 GiB default (provers),
12 for compile (runner ceiling 111, ~11 GB above the measured Mathlib
peak, floor still 4x its worst per-sample growth).
With the MemAvailable watchdog, the per-backend headroom machinery
reduces to one number: 110 sits above the largest legitimate workload
(Mathlib ix compile, ~100 GB) and leaves a ~13 GB free floor on the
~123 GiB runner; the script's 4 GiB minimum floor keeps smaller
machines protected when the default exceeds their RAM. Deletes the
headroomGb registry field and the /proc/meminfo parsing in Lean.
Derived again (a flat 110 protects nothing on smaller machines and
tracks nothing when the runner class changes): MemTotal - 15 puts the
~123 GiB runner at ~108, above Mathlib ix compile's ~100 GB peak, with
the 15 GB as the MemAvailable kill floor. Same rule for every backend.
The serialized env size wiggles slightly run-to-run, so the 0/0 pin
alerts on noise. A 1% band still catches real serialization-format
regressions (~32 MB on Mathlib) while tolerating the wiggle. constants
stays pinned — the count is deterministic. That the .ixe is not
byte-reproducible at all is worth its own investigation for a
content-addressed store; noted in the threshold comment.
Replaces the avx512f present/absent binary with the full avx2/avx512*
flag list from cpuinfo (or 'absent'), so a regression can be traced to
exactly which extensions the build host offered.
plan (ci matrix) and assemble (bench report) never execute the Rust
objects where the warp build's AVX-512 lives — Lean code is compiled by
leanc at baseline ISA, and Rust has no life-before-main initializers.
Each job's comment records the assumption: move back to warp if ix
startup or these subcommands ever touch the FFI. The build/prepare/
benchmark/compile jobs keep warp (they compile with target-cpu=native
or execute the prover FFI).
Validated on both ubuntu-latest and warp runners (ix-cpu-info's
cgroup-memcap.yml): systemd-run --user --scope -p MemoryMax=<G>
-p MemorySwapMax=0 hard-caps the tool's cgroup; the kernel OOM-kills at
the ceiling with SIGKILL (exit 137, the orchestrator's OOM signal). No
sampler cadence to race, no tree to sum, no burst arithmetic — the
cgroup charges the whole tree's resident memory and cached allocator
reservations don't count.
The script shrinks to an exec: a passwordless-sudo enable-linger boots
the user manager on CI (no-op locally where a session provides one),
XDG_RUNTIME_DIR is defaulted, and systemd-run replaces the process. No
fallback: without a user bus it fails loudly (exit 1 -> the cell
aborts).
bench-main runs on pushes to main only again; bench-pr is
issue_comment-only — the pull_request trigger, its fixed test command,
the head-ref gate, and the || fallbacks in concurrency/SHA-resolution/
comment-target all go with it. The OOM enforcement and both workflows
were verified end to end from this branch before the revert.
The zisk shard-plan run for the heavy bitblast block exposed the hole:
a plain systemd scope doesn't set memory.oom.group, so at the cap the
kernel killed only the biggest process — Zisk's ASM MT service — and
the surviving host converted the memory kill into a clean exit 1, which
the orchestrator (correctly) treats as a deterministic failure and
aborts the cell instead of recording the oom row this expected-OOM
constant should produce.
The wrapper now writes memory.oom.group=1 on the scope's cgroup (user-
delegated, no sudo) before exec'ing the tool: breach -> the whole tree
dies with SIGKILL -> exit 137 -> oom row, same semantics the sampler
era had. Failure to set it exits 2 rather than running with
single-victim kill semantics.
One-off runs no longer need a names file: --consts takes the same
comma-separated grammar as the tools, unioned with --names-file via
ConstsFile.gather (the machinery every other consumer already uses).
…lace name files
- ix bench run/shard take --ixe <path> (must exist, used as-is; no flag
= compile fresh) instead of the magic reuse-if-present flag. The
workflows pass the cache-restored path explicitly; bench-pr guards
with [ -f ] so a missed cache still compiles rather than failing.
- ix bench run drops --names-file: --consts (comma-separated, the
tools' grammar) is the one selection override. bench-pr's targeted
base run builds the list with paste -sd, from fetch-main's
missing-out file.
- fetch-main gains --consts alongside the workflow-facing --names file
(unioned), so the local compare-vs-main flow needs no temp files.
…ompile
The prepare job compiled the .ixe for the prover cells while a
compile-backend cell compiled the same env again for measurement. The
renamed compile job (prepare was ambiguous) now runs for every
requested env and serves both purposes: it publishes the .ixe the
prover cells restore, and its measured row is published too
(bench-pr-row-<sha>-<env>) for the compile cell to reuse as its PR side
— same runner class, same binaries, same command. A row-cache miss just
means the compile cell compiles and measures itself, as before.
ci parse's prep-envs output simplifies to envs (all requested envs).
The rss-sampler/json-sink additions this branch relied on landed
upstream in argumentcomputer/tracing-texray; pin the merged commit
465bbca in place of the pre-merge fork rev.
@samuelburnham
samuelburnham merged commit 49945d1 into mainJul 9, 2026
17 of 18 checks passed
@samuelburnham
samuelburnham deleted the sb/ci-benchmarks branch July 9, 2026 18:10
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset to 49945d1 for: aiur-check-execute aiur-check-prove ix-compile ooc-check sp1-check-execute zisk-check-execute

samuelburnham added a commit that referenced this pull request Jul 10, 2026
* bench: curate Vectors.csv by measured workload distinctness
Local aiur prove runs plus per-constant closure profiles (targets,
ingress bytes, fft-cost) showed a third of the cheap tier measuring
the same thing:
- drop the base-cost floor duplicates (3-9 constant closures, <13 kB,
prove within noise of each other): Acc.rec, Trans.mk, Sum.elim,
Prod.map, Option.bind, Array.toList — Eq.rec stays as the recursor
representative, Except.bind for monadic bind, WellFounded.fix for
recursion combinators;
- drop Nat.toDigits (strictly inside Nat.repr's closure), Array.filter
and Array.foldlM (within 1.5x of Array.map, which stays), Int.add
(scale twin of primary Nat.add_comm; Int is covered by emod/gcd);
- drop the Int8/Int16/Int32 instRxcHasSize_eq triplets (byte-identical
siblings of the kept Int64) and the trivials Nat, HEq, HEq.rec,
Nat.add;
- add Std.HashMap as HEAVY: 1,982-constant closure, 2.28 MB ingress,
84.6 s / 49 GiB / 18.4B FFTs proved locally — 6-40x every cheap
constant on every axis.
The prove-feasible full set is now 20 constants spanning recursors,
WF recursion, monadic bind, List/Array, Nat/Int/BitVec/USize
arithmetic, decidability, bytes/strings, hashing, and (via the heavy
tier) big structures.
* fix(bench): align tracing-texray pins with the root workspace
The zisk and sp1 hosts pinned tracing-texray at an older rev than the
root workspace (bumped in #467), so cargo linked TWO instances of the
crate into each host: main() started one instance's RSS sampler while
ix_bench::peak_rss_bytes() read the other's never-started one — always
None — and the resulting null was dropped by `ix bench bmf`'s
numeric-fields filter. Net effect: every zisk upload silently lost
peak-rss (parent and per-shard rows alike) since the pin diverged.
Align both hosts on the root rev and re-lock; cargo tree confirms a
single shared instance, so the sampler the host starts is the one the
row emission reads.
* bench: zisk rows report constants and shards
constants = the named constants certified over the checked closure —
the pre-shard input set, the same universe the aiur rows count via
closureFrom. The cheap paths emit the cover size; the shard-plan path
emits `needed` (targets this run answers for), computed before shard
partitioning and store-reuse filtering, so neither sharding overhead
nor covered-shard skips distort it. Anon-work dedup shrinks the WORK
item count, never this number; sharding's extra work stays visible in
cycles/execute-time where it belongs.
shards was already emitted on shard-plan rows; a non-sharded execute
now reports 1 (a single leaf IS one shard) instead of omitting the
field and rendering n/a in the compare table.
bench-main pins constants 0/0 on the zkvm testbeds like the other
cells: it is deterministic, and a drop means lost coverage, not a win.
* bench: compare-table and !benchmark upgrades
- aiur prove cells report throughput (constants/prove-time was already
uploaded and thresholded; the registry column list just omitted it —
every other cell follows the time/throughput/peak-rss convention).
- zisk compare tables gain constants and shards columns, next to cycles.
- The per-constant phase drill-downs are now opt-in via BENCH_PHASES=1
(a passthrough config key): the spans are noisy and dynamically
named, so the default comment stays at the headline measures.
- KEY=VALUE config parses inline on the command line too, whitespace-
separated — the single-line form for bench-pr.yml's manual
workflow_dispatch, whose input box cannot hold newlines. Inline keys
are strict (an unknown key rejects, like a typo'd backend); config
lines stay lenient since comment prose contains `=`.
* bench: `ix bench plots` — registry-driven bencher dashboard sync
One plot per (testbed, measure) bench-main tracks, one line per
benchmark row the cell uploads, plus the cross-kernel input-constants
overlay (aiur and zisk report the same pre-shard closure count, so the
paired lines must coincide — separation is a coverage-drift tripwire).
Titles, dashboard ordering, redundancy skips, and canonical measure
units live here as typed data; the spec derives from the registry +
Vectors.csv, so nothing is hand-listed.
Idempotent, keyed by title: matching plots are kept (index
re-asserted), stale ones deleted and recreated (the plot PATCH endpoint
only takes index/title/window), hand-pinned ones untouched. The sync
also asserts measure units — bencher auto-creates measures with
placeholder units on first upload, leaving plots unitless.
All bencher.dev traffic goes through the bencher CLI; --dry-run
previews with no key. bencher-plots.yml dispatches it manually (like
bencher-thresholds-reset) off the freshest bench-bins cache: run it
after a registry change has merged AND bench-main has built it — the
registry is compiled into the binary, and a new constant only gets its
plot line once its first rows upload.
* fix(ci): bench-pr Mathlib env — mathlib lives in the Benchmarks/Compile subpackage
BENCH_ENVS=Mathlib died at 'Get Mathlib Cache' with 'unknown executable
cache': use-mathlib-cache runs `lake exe cache get`, and mathlib is a
dependency of the Benchmarks/Compile subpackage, not the root workspace
lean-action was pointed at. bench-main had this right; bench-pr now
mirrors it:
- compile job: provision from Benchmarks/Compile (same toolchain as
root) and `lake build Compile<env>` before the measured compile;
- benchmark cells: no mathlib cache at all — the .ixe comes from the
compile job, and the lazy Mathlib fallback fails loudly rather than
fetching oleans it still couldn't build;
- base side: the build action stays on the base root (it builds ix);
a separate step fetches/builds base mathlib oleans in the subpackage
when a Mathlib cell must re-run the base.
* ci: bench-pr cells fail on a compile-cache miss instead of recompiling
The benchmark cells carried two lazy fallbacks for artifacts the
compile job publishes in the same run: a missing compile row made the
compile cell re-measure the compile in-cell, and a missing `.ixe` made
`ix bench run` recompile the env fresh. Neither could ever work for
the Mathlib env (its oleans live only in the compile job's subpackage
provisioning), so the fallbacks meant InitStd and Mathlib failed
differently for the same infrastructure problem.
Both restores are now fail-on-cache-miss and the run step always
passes `--ixe`: the artifacts were published moments earlier, so a
miss is an infrastructure failure and every env fails the same way,
loudly, at the restore step. The in-cell "Save PR .ixe" step goes with
the fallback that produced it.
* bench: throughput means constants per second on every backend
The zkVM hosts uploaded cycles/second under the same `throughput` slug
every other cell used for constants/second, so the shared measure had
no honest unit (and the dashboard showed a generic "per second"). The
hosts now report constants/second like everyone else — cheap zisk rows
over the certified cover, shard-plan rows over the pre-shard `needed`
set, sp1 over its checked count (its stdout already printed this
number; the row disagreed) — via one shared `ix_bench::throughput`
calculator. A zkVM's cycle rate stays derivable from its `cycles` and
`execute-time` fields.
The bencher measure's canonical units become "constants / second".
NB: the first post-merge zisk upload drops throughput by orders of
magnitude (meaning change, not a regression) — reset the
zisk-check-execute baseline (!bencher-thresholds-reset) right after,
or the 10% lower bound alerts.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bencher-thresholds-reset:allbencher baseline reset queued on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@samuelburnham@arthurpaulino@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ci: Standardize benchmarks and input constants - #467

Merged
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks
Jul 9, 2026
Merged

ci: Standardize benchmarks and input constants#467
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks

Conversation

@samuelburnham

@samuelburnhamsamuelburnham commented Jul 2, 2026

Copy link
Copy Markdown
Member

CI benchmarking:

  • ix bench Lean CLI for comprehensive local and CI benchmarks of ix compilation and typechecking over multiple backends, against a curated set of constants. Provides comparative runs against local history, or current main (fetches cached bencher.dev results), and formats them in a Markdown table.
  • Updates bench-pr.yml to use this framework and print the Markdown table as a PR comment (see example comments below).
  • Updates bench-main.yml to fully bench all backends and upload them to bencher.dev, except for RISC-V proving for now due to GPU requirements. SP1 is also left as a TODO.
  • Now tracks per-phase span measurements from tracing-texray as first-class benchmark metrics, and uploads them to bencher.dev for regression testing and also direct PR comparison in the comment table with a collapsible drop-down view (not fully tested).
  • Adds a RAM watchdog via systemd-run cgroups to prevent an OOM constant from killing the runner and failing the workflow.
  • Moves the benchmark binaries onto AVX-512-compatible runner after testing that the Warpbuild 32 vCPU runner (AMD EPYC 9R45 in all my tests) has full AVX-512 support. This should provide a one-time speedup that more accurately tracks production performance.

Usage

Local benchmarks:

# Compare local runs
ix bench run --backend aiur --env InitStd --mode execute --consts Nat.add_comm --ixe initstd.ixe
ix bench compare --backend aiur --env InitStd --mode execute --consts Nat.add_comm
# Compare against main
ix bench fetch-main --sha $(git rev-parse origin/main) \
--backend aiur --mode execute --consts Nat.add_comm --out main.json
ix bench compare --backend aiur --env InitStd --mode execute \
--main main.json --pr .lake/benches/aiur-InitStd-execute.json

PR comparative benchmarks against main:

!benchmark [aiur] [zisk] [sp1] [ooc] [compile] | all [execute]
# Optional env vars
BENCH_ENVS=InitStd,Mathlib
BENCH_FULL=1 # the env's full curated set (56 InitStd / 10 Mathlib consts) instead of the default primary subset (17 InitStd / 2 Mathlib)
BENCH_SHARD=1 # restrict to the multi-shard target constants
RUST_LOG=info

Successful runs:

Merge after argumentcomputer/tracing-texray#3

Note

Before merge:

  • Bencher console: rename aiur-typecheck-x64-32x → aiur-check-prove-x64-32x, zisk-check-x64-32x → zisk-check-execute-x64-32x; archive stale shard-cycles:N measures.
  • Delete the old threshold Git tags for aiur as the names have been updated

@samuelburnham
samuelburnhamforce-pushed the sb/ci-benchmarks branch 7 times, most recently from 07264b9 to f1ff88aCompareJuly 3, 2026 20:39
Comment thread.github/workflows/bench-pr.yml Fixed
Comment thread.github/workflows/bench-pr.yml Fixed
@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b56201f

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

No result tables were produced — see the workflow logs.

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 70d60b8

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%file-size (main)file-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.222 sn/an/a24.99Kn/an/a306.41 MiBn/an/a105492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqOOM6.86Kn/aOOM264.7 msn/aOOM1.16 GiBn/a
String.splitOOM6.71Kn/aOOM264.0 msn/aOOM971.84 MiBn/a
InitStdn/a6.08Kn/an/a14.644 sn/an/a1.48 GiBn/a
List.mergeSortOOM5.56Kn/aOOM261.5 msn/aOOM802.59 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendOOM5.09Kn/aOOM529.6 msn/aOOM998.39 MiBn/a
Char.ofOrdinal_le_of_leOOM3.44Kn/aOOM773.9 msn/aOOM980.05 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqOOM2.38Kn/aOOM764.8 msn/aOOM841.74 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqOOM2.37Kn/aOOM764.8 msn/aOOM977.59 MiBn/a
Vector.appendOOM1.96Kn/aOOM254.4 msn/aOOM665.40 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqOOM1.79Kn/aOOM1.015 sn/aOOM853.80 MiBn/a
Nat.gcd_commOOM1.53Kn/aOOM254.2 msn/aOOM640.46 MiBn/a
Array.extract_appendOOM1.52Kn/aOOM1.017 sn/aOOM1.04 GiBn/a
Vector.extract_append._proof_2OOM1.29Kn/aOOM1.012 sn/aOOM916.29 MiBn/a
String.appendOOM1.21Kn/aOOM253.1 msn/aOOM1.01 GiBn/a
Int.gcdOOM823.880n/aOOM252.5 msn/aOOM616.14 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualOOM821.770n/aOOM6.895 sn/aOOM1.73 GiBn/a
Nat.sub_le_of_le_addOOM673.120n/aOOM252.6 msn/aOOM568.05 MiBn/a
Nat.add_commOOM166.670n/aOOM252.0 msn/aOOM457.39 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 431ae38

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a3.955 sn/an/a26.67Kn/an/a306.41 MiBn/an/a105492n/an/a10.67 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.87Kn/an/a264.4 msn/an/a1.19 GiBn/a
String.splitn/a6.72Kn/an/a263.8 msn/an/a1.07 GiBn/a
InitStdn/a6.41Kn/an/a13.881 sn/an/a1.47 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.7 msn/an/a858.98 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.10Kn/an/a528.9 msn/an/a1.01 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a774.0 msn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.5 msn/an/a880.31 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.6 msn/an/a815.45 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.6 msn/an/a979.52 MiBn/a
Vector.appendn/a1.95Kn/an/a254.8 msn/an/a667.94 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a254.9 msn/an/a681.33 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.01 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.07 GiBn/a
String.appendn/a1.21Kn/an/a252.8 msn/an/a965.88 MiBn/a
Int.gcdn/a824.190n/an/a252.4 msn/an/a619.82 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a822.230n/an/a6.891 sn/an/a1.72 GiBn/a
Nat.sub_le_of_le_addn/a673.260n/an/a252.5 msn/an/a564.67 MiBn/a
Nat.add_commn/a166.640n/an/a252.0 msn/an/a451.35 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 7d3388b

backends: ooc=execute compile=execute · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a4.352 sn/an/a24.24Kn/an/a306.41 MiBn/an/a105,492n/an/a10.59 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.15 GiBn/a
String.splitn/a6.71Kn/an/a263.9 msn/an/a1.05 GiBn/a
InitStdn/a6.41Kn/an/a13.882 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a838.87 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.5 msn/an/a982.43 MiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.9 msn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.7 msn/an/a917.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.8 msn/an/a812.00 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.01 GiBn/a
Vector.appendn/a1.96Kn/an/a254.3 msn/an/a659.75 MiBn/a
Nat.gcd_commn/a1.54Kn/an/a253.9 msn/an/a643.67 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a920.13 MiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a978.00 MiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.02 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a853.640n/an/a6.637 sn/an/a1.80 GiBn/a
Int.gcdn/a824.010n/an/a252.4 msn/an/a612.75 MiBn/a
Nat.sub_le_of_le_addn/a673.230n/an/a252.5 msn/an/a568.57 MiBn/a
Nat.add_commn/a166.670n/an/a252.0 msn/an/a467.85 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 1103162

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a4.301 sn/an/a24.53Kn/an/a306.41 MiBn/an/a105,492n/an/a10.61 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.33 GiBn/a
String.splitn/a6.71Kn/an/a264.3 msn/an/a1.12 GiBn/a
InitStdn/a6.30Kn/an/a14.129 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a931.07 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.7 msn/an/a1.02 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.7 msn/an/a887.48 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a765.2 msn/an/a841.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.08 GiBn/a
Vector.appendn/a1.96Kn/an/a254.4 msn/an/a669.67 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a1.79Kn/an/a1.015 sn/an/a914.25 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a255.3 msn/an/a657.64 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.16 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.11 GiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.08 GiBn/a
Int.gcdn/a823.880n/an/a252.5 msn/an/a607.91 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a821.940n/an/a6.893 sn/an/a1.64 GiBn/a
Nat.sub_le_of_le_addn/a673.360n/an/a252.5 msn/an/a547.86 MiBn/a
Nat.add_commn/a166.540n/an/a252.2 msn/an/a435.36 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b82aed8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.947 sn/an/a26.73Kn/an/a11.24 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.412 sn/an/a8.55Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.404 sn/an/a884.740n/an/a1.91 GiBn/a
Array.extract_appendn/a1.017 sn/an/a1.52Kn/an/a1.25 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.5 msn/an/a3.43Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.09 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.15 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.6 msn/an/a5.07Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a264.7 msn/an/a6.70Kn/an/a1.19 GiBn/a
List.mergeSortn/a262.3 msn/an/a5.54Kn/an/a998.22 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a765.08 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a702.54 MiBn/a
Nat.sub_le_of_le_addn/a253.2 msn/an/a671.490n/an/a601.42 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.01 GiBn/a
Int.gcdn/a252.5 msn/an/a823.710n/an/a636.20 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.730n/an/a484.27 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 930ebb8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.355 sn/an/a24.22Kn/an/a11.14 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.409 sn/an/a8.55Kn/an/a2.03 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.98 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.23 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.20 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.2 msn/an/a5.08Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.8 msn/an/a6.81Kn/an/a1.46 GiBn/a
String.splitn/a265.0 msn/an/a6.69Kn/an/a1.31 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1013.36 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a891.58 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a745.38 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.13 GiBn/a
Int.gcdn/a252.5 msn/an/a823.670n/an/a762.65 MiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.360n/an/a651.23 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.570n/an/a508.57 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs d69aaee

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.231 sn/an/a24.93Kn/an/a11.03 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.159 sn/an/a8.76Kn/an/a2.09 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.090n/an/a2.04 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.10 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a939.29 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.4 msn/an/a2.38Kn/an/a1014.35 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.4 msn/an/a2.37Kn/an/a1.25 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.15 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.51 GiBn/a
String.splitn/a265.1 msn/an/a6.69Kn/an/a1.25 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1008.04 MiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a775.05 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a730.16 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.24 GiBn/a
Nat.sub_le_of_le_addn/a252.7 msn/an/a672.780n/an/a616.39 MiBn/a
Int.gcdn/a252.5 msn/an/a823.830n/an/a666.57 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a499.68 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!bencher-thresholds-reset all

@github-actionsgithub-actionsBot added the bencher-thresholds-reset:all bencher baseline reset queued on merge label Jul 8, 2026
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset queued for: all — will anchor to the merge commit when this PR merges.

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 8595ee8

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.258 sn/an/a24.78Kn/an/a11.27 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.158 sn/an/a8.76Kn/an/a2.04 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.140n/an/a2.01 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a988.55 MiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.32 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.29 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.24 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.9 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.3 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a265.4 msn/an/a6.68Kn/an/a1.26 GiBn/a
List.mergeSortn/a261.9 msn/an/a5.55Kn/an/a1004.43 MiBn/a
Nat.gcd_commn/a254.8 msn/an/a1.53Kn/an/a813.46 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a740.42 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.08 GiBn/a
Nat.add_commn/a252.6 msn/an/a166.290n/an/a503.77 MiBn/a
Int.gcdn/a252.5 msn/an/a823.900n/an/a707.26 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.440n/an/a634.98 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 94e942d

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.050 sn/an/a26.05Kn/an/a11.11 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.426 sn/an/a8.54Kn/an/a2.00 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.149 sn/an/a921.510n/an/a1.97 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.13 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a991.18 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.22 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.0 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.37 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.28 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a990.69 MiBn/a
Nat.gcd_commn/a255.1 msn/an/a1.53Kn/an/a776.26 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a681.59 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.220n/an/a604.52 MiBn/a
Int.gcdn/a252.5 msn/an/a823.790n/an/a672.67 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.760n/an/a477.46 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5fa582b

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.993 sn/an/a26.42Kn/an/a11.05 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.677 sn/an/a8.34Kn/an/a2.11 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.148 sn/an/a921.570n/an/a1.86 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.12 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.25 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.17 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.38 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1.03 GiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a855.45 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a715.77 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.6 msn/an/a673.030n/an/a612.18 MiBn/a
Int.gcdn/a252.5 msn/an/a823.860n/an/a724.20 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.550n/an/a479.64 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 3c3d090

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.039 sn/an/a26.12Kn/an/a11.25 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.174 sn/an/a8.75Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.99 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.21 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.30 GiBn/a
Char.ofOrdinal_le_of_len/a775.2 msn/an/a3.43Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.08 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.3 msn/an/a5.08Kn/an/a1.14 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.4 msn/an/a6.82Kn/an/a1.30 GiBn/a
String.splitn/a265.2 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1012.01 MiBn/a
Nat.gcd_commn/a254.9 msn/an/a1.53Kn/an/a783.17 MiBn/a
Vector.appendn/a254.4 msn/an/a1.96Kn/an/a736.90 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a956.42 MiBn/a
Int.gcdn/a252.4 msn/an/a824.030n/an/a669.97 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.580n/an/a605.84 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a482.89 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 8, 2026 21:46
arthurpaulino
arthurpaulino previously approved these changes Jul 9, 2026
Lowering the witness cap below Zisk's built-in default (10) was measured to
have a negligible effect on host RAM and prove time for the kernel typecheck
workload, so the CLI override (which defaulted to 5) is removed and the prover
uses EmbeddedOpts::default(). Drop the now-stale flag mentions and per-RAM
tuning guidance from the README, the cost-model doc, and the shard.rs model
comments.
Rebased onto main (post #411 + #459) and integrated with the renamed
bench-main.yml and reworked bencher-track interface.
- Benchmarks/Vectors.csv: single shared source of truth (71 library constants
from Init/Std/Mathlib/Lean). Consumed by Aiur (bench-typecheck --manifest),
the zkVM hosts, and shell.
- bench-pr.yml: `!benchmark [aiur] [zisk] [sp1|all] [execute|prove]` over the
curated set, posting a main-vs-PR table; main results cached by base SHA.
Hardened: comment body from env (no injection), allowlisted env parsing.
- .github/scripts/{bench.py,run.sh}: parse/manifest/compare/comment, and the
compile-.ixe + backend driver (cycles/execute-time/throughput/peak-rss, plus
shards/max-shard-cycles for sharded runs).
- .github/actions/install-{sp1,zisk}: shared zkVM toolchain + deps install,
used by bench-pr.yml, bench-main.yml, and riscv-bench.yml.
- bench-main.yml: add zkvm-execute (Zisk/SP1 cycle counts + time/RAM) and
native-check (native parallel `ix check --anon` throughput) jobs, using the
new bencher-track workload/thresholds interface.
- bench-typecheck: add --constant / --skip-deps (align with the zkVM hosts;
--skip-deps replaces --subject-only) and --execute-only (fast execute path).
issue_comment workflows only run from the default branch, so the `!benchmark`
path can't be exercised on a PR branch. Add a pull_request trigger (base/head
from the PR payload; empty comment → parser defaults) to test pre-merge.
Revert before merge — delete the `pull_request:` trigger; the dual base/head
resolution and `|| pull_request.number` fallbacks are harmless to keep.
Revert the cgroup mode (and the earlier RLIMIT_DATA layer): back to the
plain tree-RSS sampler, sudo-free and identical everywhere. The burst
problem is handled by cadence instead of a kernel cap: sampling drops
from ~1s to 0.2s once the tree is within 20 GB of the ceiling (100 GB
at the default 120), and the post-TERM grace re-checks every 0.2s,
KILLing immediately while the tree is still at the ceiling. Worst-case
overshoot shrinks from GB-per-second x seconds to x ~0.4s.
ix bench run still hard-fails when the watchdog script is missing — an
unenforced ceiling is not a benchmark run.
The flat 120 was a leftover from the RLIMIT_DATA era (a VA cap needed
fixed slack above RSS); for the sampler it protects nothing on machines
with less RAM and leaves ~3 GB of headroom on the 123 GiB runner. Back
to MemTotal minus 12 GiB (runner: 111; 64 GiB workstation: 52), which
the adaptive fast-cadence zone sits under wherever the run happens.
Same lesson aiur taught: shared measure names (peak-rss, throughput)
mean that mode's phase, so a future zisk/sp1 prove mode needs its own
testbed — and an unsuffixed zisk-check silently meaning "execute only"
is the asymmetry we just cleaned up for aiur. Renaming now rides the
merge's existing bencher migration (console rename + reset-all) instead
of paying a second cycle later.
The zkvm job derives testbed/workload from the cell's mode, so a prove
cell would land on zisk-check-prove-x64-32x with no workflow edits.
The per-cell .ixe cache only helped re-runs: on a fresh commit every
same-env cell missed the cold cache simultaneously and paid its own ix
compile in parallel. A prepare job (matrix over ci parse's new
prep-envs output — envs consumed by non-compile cells) now compiles
each .ixe once and publishes it under the key the cells already
restore, so cells start warm. Skipped for compile-only requests, whose
cells compile fresh by design; a prepare failure stops the cells (they
would just re-fail the same compile lazily).
Two more runner deaths, two measured causes:
1. aiur prove crossed the ceiling by 13 GB inside one 0.2s sample —
first-touch of pre-reserved prover buffers grows RSS at memory
bandwidth, which no cadence outruns. Headroom widens to 24 GiB (the
~123 GiB runner's ceiling drops 111 → 99) so the worst measured
overshoot plus OS/agent fits, and the sampler now TERMs on a
one-sample linear projection (level + last delta), buying back one
sample of reaction time — verified live: the kill fires before the
ceiling is crossed on a steep ramp.
2. zisk died at a nominal 0.4 GB over: the ASM services' locked shared
segments are under-attributed by per-process RSS. /dev/shm usage now
counts into the tree total.
…tion
Everything hairy in the sampler (two ps/awk tree walks, the /dev/shm
add-on, adaptive cadence, trajectory projection, conditional grace)
existed to reconstruct a number the kernel already publishes:
/proc/meminfo MemAvailable, its own estimate of what can be allocated
without thrashing. It natively accounts for everything the tree
consumes (RSS, locked shm, page tables) plus everything else on the
host, and correctly ignores reclaimable page cache.
The watchdog now kills the tree when MemAvailable < MemTotal - ceiling,
at a fixed 0.25s cadence (a meminfo read is ~free, so no adaptive zone)
with a plain TERM -> 2s -> KILL (rows are flushed continuously; the
grace was only ever for destructors). The floor never drops below 4 GiB
so an oversized ceiling still protects the host, and a machine without
/proc/meminfo is refused loudly. ~40 lines shorter, and strictly harder
to fool than the tree-RSS sum it replaces.
…ottery
A 50-run log sweep showed the ubuntu-latest build hosts hand out 4 CPU
models, baking AVX-512 into the -Ctarget-cpu=native binaries on only
~18% of builds — main's history randomly flipped Plonky3 codepaths
between pushes, and main-vs-PR comparisons crossed ISAs ~30% of the
time. The warp fleet is CPU-uniform (AMD EPYC 9R45 / Intel, all
AVX-512), so building there makes the ISA deterministic AND faster.
Every job that runs the binaries moves with the build (a non-AVX-512
GitHub host would SIGILL): bench-main's plan, bench-pr's build (parse)
and assemble (report). setup/comment/thresholds-reset run no ix and
stay on ubuntu-latest. The Log build CPU step stays, as the check that
a regression wasn't a fleet change.
The cache-hit and cache-miss branches each carried their own
lean-action step (build vs provision-only); a computed build flag
collapses them — miss builds, hit provisions the toolchain the
restored binaries need.
The 24 GiB headroom killed the Mathlib compile 3 GB from completion
(machine-wide usage ~99.6 GB vs the 99 ceiling): that headroom is sized
for the aiur prover's memory-bandwidth bursts (~13 GB between samples),
while ix compile grows build-paced at a few GB/s and legitimately peaks
near 100 GB. One number can't serve both on a 123 GB machine, so the
headroom moves into the registry per backend: 24 GiB default (provers),
12 for compile (runner ceiling 111, ~11 GB above the measured Mathlib
peak, floor still 4x its worst per-sample growth).
With the MemAvailable watchdog, the per-backend headroom machinery
reduces to one number: 110 sits above the largest legitimate workload
(Mathlib ix compile, ~100 GB) and leaves a ~13 GB free floor on the
~123 GiB runner; the script's 4 GiB minimum floor keeps smaller
machines protected when the default exceeds their RAM. Deletes the
headroomGb registry field and the /proc/meminfo parsing in Lean.
Derived again (a flat 110 protects nothing on smaller machines and
tracks nothing when the runner class changes): MemTotal - 15 puts the
~123 GiB runner at ~108, above Mathlib ix compile's ~100 GB peak, with
the 15 GB as the MemAvailable kill floor. Same rule for every backend.
The serialized env size wiggles slightly run-to-run, so the 0/0 pin
alerts on noise. A 1% band still catches real serialization-format
regressions (~32 MB on Mathlib) while tolerating the wiggle. constants
stays pinned — the count is deterministic. That the .ixe is not
byte-reproducible at all is worth its own investigation for a
content-addressed store; noted in the threshold comment.
Replaces the avx512f present/absent binary with the full avx2/avx512*
flag list from cpuinfo (or 'absent'), so a regression can be traced to
exactly which extensions the build host offered.
plan (ci matrix) and assemble (bench report) never execute the Rust
objects where the warp build's AVX-512 lives — Lean code is compiled by
leanc at baseline ISA, and Rust has no life-before-main initializers.
Each job's comment records the assumption: move back to warp if ix
startup or these subcommands ever touch the FFI. The build/prepare/
benchmark/compile jobs keep warp (they compile with target-cpu=native
or execute the prover FFI).
Validated on both ubuntu-latest and warp runners (ix-cpu-info's
cgroup-memcap.yml): systemd-run --user --scope -p MemoryMax=<G>
-p MemorySwapMax=0 hard-caps the tool's cgroup; the kernel OOM-kills at
the ceiling with SIGKILL (exit 137, the orchestrator's OOM signal). No
sampler cadence to race, no tree to sum, no burst arithmetic — the
cgroup charges the whole tree's resident memory and cached allocator
reservations don't count.
The script shrinks to an exec: a passwordless-sudo enable-linger boots
the user manager on CI (no-op locally where a session provides one),
XDG_RUNTIME_DIR is defaulted, and systemd-run replaces the process. No
fallback: without a user bus it fails loudly (exit 1 -> the cell
aborts).
bench-main runs on pushes to main only again; bench-pr is
issue_comment-only — the pull_request trigger, its fixed test command,
the head-ref gate, and the || fallbacks in concurrency/SHA-resolution/
comment-target all go with it. The OOM enforcement and both workflows
were verified end to end from this branch before the revert.
The zisk shard-plan run for the heavy bitblast block exposed the hole:
a plain systemd scope doesn't set memory.oom.group, so at the cap the
kernel killed only the biggest process — Zisk's ASM MT service — and
the surviving host converted the memory kill into a clean exit 1, which
the orchestrator (correctly) treats as a deterministic failure and
aborts the cell instead of recording the oom row this expected-OOM
constant should produce.
The wrapper now writes memory.oom.group=1 on the scope's cgroup (user-
delegated, no sudo) before exec'ing the tool: breach -> the whole tree
dies with SIGKILL -> exit 137 -> oom row, same semantics the sampler
era had. Failure to set it exits 2 rather than running with
single-victim kill semantics.
One-off runs no longer need a names file: --consts takes the same
comma-separated grammar as the tools, unioned with --names-file via
ConstsFile.gather (the machinery every other consumer already uses).
…lace name files
- ix bench run/shard take --ixe <path> (must exist, used as-is; no flag
= compile fresh) instead of the magic reuse-if-present flag. The
workflows pass the cache-restored path explicitly; bench-pr guards
with [ -f ] so a missed cache still compiles rather than failing.
- ix bench run drops --names-file: --consts (comma-separated, the
tools' grammar) is the one selection override. bench-pr's targeted
base run builds the list with paste -sd, from fetch-main's
missing-out file.
- fetch-main gains --consts alongside the workflow-facing --names file
(unioned), so the local compare-vs-main flow needs no temp files.
…ompile
The prepare job compiled the .ixe for the prover cells while a
compile-backend cell compiled the same env again for measurement. The
renamed compile job (prepare was ambiguous) now runs for every
requested env and serves both purposes: it publishes the .ixe the
prover cells restore, and its measured row is published too
(bench-pr-row-<sha>-<env>) for the compile cell to reuse as its PR side
— same runner class, same binaries, same command. A row-cache miss just
means the compile cell compiles and measures itself, as before.
ci parse's prep-envs output simplifies to envs (all requested envs).
The rss-sampler/json-sink additions this branch relied on landed
upstream in argumentcomputer/tracing-texray; pin the merged commit
465bbca in place of the pre-merge fork rev.
@samuelburnham
samuelburnham merged commit 49945d1 into mainJul 9, 2026
17 of 18 checks passed
@samuelburnham
samuelburnham deleted the sb/ci-benchmarks branch July 9, 2026 18:10
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset to 49945d1 for: aiur-check-execute aiur-check-prove ix-compile ooc-check sp1-check-execute zisk-check-execute

samuelburnham added a commit that referenced this pull request Jul 10, 2026
* bench: curate Vectors.csv by measured workload distinctness
Local aiur prove runs plus per-constant closure profiles (targets,
ingress bytes, fft-cost) showed a third of the cheap tier measuring
the same thing:
- drop the base-cost floor duplicates (3-9 constant closures, <13 kB,
prove within noise of each other): Acc.rec, Trans.mk, Sum.elim,
Prod.map, Option.bind, Array.toList — Eq.rec stays as the recursor
representative, Except.bind for monadic bind, WellFounded.fix for
recursion combinators;
- drop Nat.toDigits (strictly inside Nat.repr's closure), Array.filter
and Array.foldlM (within 1.5x of Array.map, which stays), Int.add
(scale twin of primary Nat.add_comm; Int is covered by emod/gcd);
- drop the Int8/Int16/Int32 instRxcHasSize_eq triplets (byte-identical
siblings of the kept Int64) and the trivials Nat, HEq, HEq.rec,
Nat.add;
- add Std.HashMap as HEAVY: 1,982-constant closure, 2.28 MB ingress,
84.6 s / 49 GiB / 18.4B FFTs proved locally — 6-40x every cheap
constant on every axis.
The prove-feasible full set is now 20 constants spanning recursors,
WF recursion, monadic bind, List/Array, Nat/Int/BitVec/USize
arithmetic, decidability, bytes/strings, hashing, and (via the heavy
tier) big structures.
* fix(bench): align tracing-texray pins with the root workspace
The zisk and sp1 hosts pinned tracing-texray at an older rev than the
root workspace (bumped in #467), so cargo linked TWO instances of the
crate into each host: main() started one instance's RSS sampler while
ix_bench::peak_rss_bytes() read the other's never-started one — always
None — and the resulting null was dropped by `ix bench bmf`'s
numeric-fields filter. Net effect: every zisk upload silently lost
peak-rss (parent and per-shard rows alike) since the pin diverged.
Align both hosts on the root rev and re-lock; cargo tree confirms a
single shared instance, so the sampler the host starts is the one the
row emission reads.
* bench: zisk rows report constants and shards
constants = the named constants certified over the checked closure —
the pre-shard input set, the same universe the aiur rows count via
closureFrom. The cheap paths emit the cover size; the shard-plan path
emits `needed` (targets this run answers for), computed before shard
partitioning and store-reuse filtering, so neither sharding overhead
nor covered-shard skips distort it. Anon-work dedup shrinks the WORK
item count, never this number; sharding's extra work stays visible in
cycles/execute-time where it belongs.
shards was already emitted on shard-plan rows; a non-sharded execute
now reports 1 (a single leaf IS one shard) instead of omitting the
field and rendering n/a in the compare table.
bench-main pins constants 0/0 on the zkvm testbeds like the other
cells: it is deterministic, and a drop means lost coverage, not a win.
* bench: compare-table and !benchmark upgrades
- aiur prove cells report throughput (constants/prove-time was already
uploaded and thresholded; the registry column list just omitted it —
every other cell follows the time/throughput/peak-rss convention).
- zisk compare tables gain constants and shards columns, next to cycles.
- The per-constant phase drill-downs are now opt-in via BENCH_PHASES=1
(a passthrough config key): the spans are noisy and dynamically
named, so the default comment stays at the headline measures.
- KEY=VALUE config parses inline on the command line too, whitespace-
separated — the single-line form for bench-pr.yml's manual
workflow_dispatch, whose input box cannot hold newlines. Inline keys
are strict (an unknown key rejects, like a typo'd backend); config
lines stay lenient since comment prose contains `=`.
* bench: `ix bench plots` — registry-driven bencher dashboard sync
One plot per (testbed, measure) bench-main tracks, one line per
benchmark row the cell uploads, plus the cross-kernel input-constants
overlay (aiur and zisk report the same pre-shard closure count, so the
paired lines must coincide — separation is a coverage-drift tripwire).
Titles, dashboard ordering, redundancy skips, and canonical measure
units live here as typed data; the spec derives from the registry +
Vectors.csv, so nothing is hand-listed.
Idempotent, keyed by title: matching plots are kept (index
re-asserted), stale ones deleted and recreated (the plot PATCH endpoint
only takes index/title/window), hand-pinned ones untouched. The sync
also asserts measure units — bencher auto-creates measures with
placeholder units on first upload, leaving plots unitless.
All bencher.dev traffic goes through the bencher CLI; --dry-run
previews with no key. bencher-plots.yml dispatches it manually (like
bencher-thresholds-reset) off the freshest bench-bins cache: run it
after a registry change has merged AND bench-main has built it — the
registry is compiled into the binary, and a new constant only gets its
plot line once its first rows upload.
* fix(ci): bench-pr Mathlib env — mathlib lives in the Benchmarks/Compile subpackage
BENCH_ENVS=Mathlib died at 'Get Mathlib Cache' with 'unknown executable
cache': use-mathlib-cache runs `lake exe cache get`, and mathlib is a
dependency of the Benchmarks/Compile subpackage, not the root workspace
lean-action was pointed at. bench-main had this right; bench-pr now
mirrors it:
- compile job: provision from Benchmarks/Compile (same toolchain as
root) and `lake build Compile<env>` before the measured compile;
- benchmark cells: no mathlib cache at all — the .ixe comes from the
compile job, and the lazy Mathlib fallback fails loudly rather than
fetching oleans it still couldn't build;
- base side: the build action stays on the base root (it builds ix);
a separate step fetches/builds base mathlib oleans in the subpackage
when a Mathlib cell must re-run the base.
* ci: bench-pr cells fail on a compile-cache miss instead of recompiling
The benchmark cells carried two lazy fallbacks for artifacts the
compile job publishes in the same run: a missing compile row made the
compile cell re-measure the compile in-cell, and a missing `.ixe` made
`ix bench run` recompile the env fresh. Neither could ever work for
the Mathlib env (its oleans live only in the compile job's subpackage
provisioning), so the fallbacks meant InitStd and Mathlib failed
differently for the same infrastructure problem.
Both restores are now fail-on-cache-miss and the run step always
passes `--ixe`: the artifacts were published moments earlier, so a
miss is an infrastructure failure and every env fails the same way,
loudly, at the restore step. The in-cell "Save PR .ixe" step goes with
the fallback that produced it.
* bench: throughput means constants per second on every backend
The zkVM hosts uploaded cycles/second under the same `throughput` slug
every other cell used for constants/second, so the shared measure had
no honest unit (and the dashboard showed a generic "per second"). The
hosts now report constants/second like everyone else — cheap zisk rows
over the certified cover, shard-plan rows over the pre-shard `needed`
set, sp1 over its checked count (its stdout already printed this
number; the row disagreed) — via one shared `ix_bench::throughput`
calculator. A zkVM's cycle rate stays derivable from its `cycles` and
`execute-time` fields.
The bencher measure's canonical units become "constants / second".
NB: the first post-merge zisk upload drops throughput by orders of
magnitude (meaning change, not a regression) — reset the
zisk-check-execute baseline (!bencher-thresholds-reset) right after,
or the 10% lower bound alerts.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bencher-thresholds-reset:allbencher baseline reset queued on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@samuelburnham@arthurpaulino@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ci: Standardize benchmarks and input constants - #467

Merged
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks
Jul 9, 2026
Merged

ci: Standardize benchmarks and input constants#467
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks

Conversation

@samuelburnham

@samuelburnhamsamuelburnham commented Jul 2, 2026

Copy link
Copy Markdown
Member

CI benchmarking:

  • ix bench Lean CLI for comprehensive local and CI benchmarks of ix compilation and typechecking over multiple backends, against a curated set of constants. Provides comparative runs against local history, or current main (fetches cached bencher.dev results), and formats them in a Markdown table.
  • Updates bench-pr.yml to use this framework and print the Markdown table as a PR comment (see example comments below).
  • Updates bench-main.yml to fully bench all backends and upload them to bencher.dev, except for RISC-V proving for now due to GPU requirements. SP1 is also left as a TODO.
  • Now tracks per-phase span measurements from tracing-texray as first-class benchmark metrics, and uploads them to bencher.dev for regression testing and also direct PR comparison in the comment table with a collapsible drop-down view (not fully tested).
  • Adds a RAM watchdog via systemd-run cgroups to prevent an OOM constant from killing the runner and failing the workflow.
  • Moves the benchmark binaries onto AVX-512-compatible runner after testing that the Warpbuild 32 vCPU runner (AMD EPYC 9R45 in all my tests) has full AVX-512 support. This should provide a one-time speedup that more accurately tracks production performance.

Usage

Local benchmarks:

# Compare local runs
ix bench run --backend aiur --env InitStd --mode execute --consts Nat.add_comm --ixe initstd.ixe
ix bench compare --backend aiur --env InitStd --mode execute --consts Nat.add_comm
# Compare against main
ix bench fetch-main --sha $(git rev-parse origin/main) \
--backend aiur --mode execute --consts Nat.add_comm --out main.json
ix bench compare --backend aiur --env InitStd --mode execute \
--main main.json --pr .lake/benches/aiur-InitStd-execute.json

PR comparative benchmarks against main:

!benchmark [aiur] [zisk] [sp1] [ooc] [compile] | all [execute]
# Optional env vars
BENCH_ENVS=InitStd,Mathlib
BENCH_FULL=1 # the env's full curated set (56 InitStd / 10 Mathlib consts) instead of the default primary subset (17 InitStd / 2 Mathlib)
BENCH_SHARD=1 # restrict to the multi-shard target constants
RUST_LOG=info

Successful runs:

Merge after argumentcomputer/tracing-texray#3

Note

Before merge:

  • Bencher console: rename aiur-typecheck-x64-32x → aiur-check-prove-x64-32x, zisk-check-x64-32x → zisk-check-execute-x64-32x; archive stale shard-cycles:N measures.
  • Delete the old threshold Git tags for aiur as the names have been updated

@samuelburnham
samuelburnhamforce-pushed the sb/ci-benchmarks branch 7 times, most recently from 07264b9 to f1ff88aCompareJuly 3, 2026 20:39
Comment thread.github/workflows/bench-pr.yml Fixed
Comment thread.github/workflows/bench-pr.yml Fixed
@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b56201f

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

No result tables were produced — see the workflow logs.

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 70d60b8

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%file-size (main)file-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.222 sn/an/a24.99Kn/an/a306.41 MiBn/an/a105492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqOOM6.86Kn/aOOM264.7 msn/aOOM1.16 GiBn/a
String.splitOOM6.71Kn/aOOM264.0 msn/aOOM971.84 MiBn/a
InitStdn/a6.08Kn/an/a14.644 sn/an/a1.48 GiBn/a
List.mergeSortOOM5.56Kn/aOOM261.5 msn/aOOM802.59 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendOOM5.09Kn/aOOM529.6 msn/aOOM998.39 MiBn/a
Char.ofOrdinal_le_of_leOOM3.44Kn/aOOM773.9 msn/aOOM980.05 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqOOM2.38Kn/aOOM764.8 msn/aOOM841.74 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqOOM2.37Kn/aOOM764.8 msn/aOOM977.59 MiBn/a
Vector.appendOOM1.96Kn/aOOM254.4 msn/aOOM665.40 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqOOM1.79Kn/aOOM1.015 sn/aOOM853.80 MiBn/a
Nat.gcd_commOOM1.53Kn/aOOM254.2 msn/aOOM640.46 MiBn/a
Array.extract_appendOOM1.52Kn/aOOM1.017 sn/aOOM1.04 GiBn/a
Vector.extract_append._proof_2OOM1.29Kn/aOOM1.012 sn/aOOM916.29 MiBn/a
String.appendOOM1.21Kn/aOOM253.1 msn/aOOM1.01 GiBn/a
Int.gcdOOM823.880n/aOOM252.5 msn/aOOM616.14 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualOOM821.770n/aOOM6.895 sn/aOOM1.73 GiBn/a
Nat.sub_le_of_le_addOOM673.120n/aOOM252.6 msn/aOOM568.05 MiBn/a
Nat.add_commOOM166.670n/aOOM252.0 msn/aOOM457.39 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 431ae38

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a3.955 sn/an/a26.67Kn/an/a306.41 MiBn/an/a105492n/an/a10.67 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.87Kn/an/a264.4 msn/an/a1.19 GiBn/a
String.splitn/a6.72Kn/an/a263.8 msn/an/a1.07 GiBn/a
InitStdn/a6.41Kn/an/a13.881 sn/an/a1.47 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.7 msn/an/a858.98 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.10Kn/an/a528.9 msn/an/a1.01 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a774.0 msn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.5 msn/an/a880.31 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.6 msn/an/a815.45 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.6 msn/an/a979.52 MiBn/a
Vector.appendn/a1.95Kn/an/a254.8 msn/an/a667.94 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a254.9 msn/an/a681.33 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.01 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.07 GiBn/a
String.appendn/a1.21Kn/an/a252.8 msn/an/a965.88 MiBn/a
Int.gcdn/a824.190n/an/a252.4 msn/an/a619.82 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a822.230n/an/a6.891 sn/an/a1.72 GiBn/a
Nat.sub_le_of_le_addn/a673.260n/an/a252.5 msn/an/a564.67 MiBn/a
Nat.add_commn/a166.640n/an/a252.0 msn/an/a451.35 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 7d3388b

backends: ooc=execute compile=execute · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a4.352 sn/an/a24.24Kn/an/a306.41 MiBn/an/a105,492n/an/a10.59 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.15 GiBn/a
String.splitn/a6.71Kn/an/a263.9 msn/an/a1.05 GiBn/a
InitStdn/a6.41Kn/an/a13.882 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a838.87 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.5 msn/an/a982.43 MiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.9 msn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.7 msn/an/a917.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.8 msn/an/a812.00 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.01 GiBn/a
Vector.appendn/a1.96Kn/an/a254.3 msn/an/a659.75 MiBn/a
Nat.gcd_commn/a1.54Kn/an/a253.9 msn/an/a643.67 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a920.13 MiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a978.00 MiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.02 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a853.640n/an/a6.637 sn/an/a1.80 GiBn/a
Int.gcdn/a824.010n/an/a252.4 msn/an/a612.75 MiBn/a
Nat.sub_le_of_le_addn/a673.230n/an/a252.5 msn/an/a568.57 MiBn/a
Nat.add_commn/a166.670n/an/a252.0 msn/an/a467.85 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 1103162

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a4.301 sn/an/a24.53Kn/an/a306.41 MiBn/an/a105,492n/an/a10.61 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.33 GiBn/a
String.splitn/a6.71Kn/an/a264.3 msn/an/a1.12 GiBn/a
InitStdn/a6.30Kn/an/a14.129 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a931.07 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.7 msn/an/a1.02 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.7 msn/an/a887.48 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a765.2 msn/an/a841.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.08 GiBn/a
Vector.appendn/a1.96Kn/an/a254.4 msn/an/a669.67 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a1.79Kn/an/a1.015 sn/an/a914.25 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a255.3 msn/an/a657.64 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.16 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.11 GiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.08 GiBn/a
Int.gcdn/a823.880n/an/a252.5 msn/an/a607.91 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a821.940n/an/a6.893 sn/an/a1.64 GiBn/a
Nat.sub_le_of_le_addn/a673.360n/an/a252.5 msn/an/a547.86 MiBn/a
Nat.add_commn/a166.540n/an/a252.2 msn/an/a435.36 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b82aed8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.947 sn/an/a26.73Kn/an/a11.24 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.412 sn/an/a8.55Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.404 sn/an/a884.740n/an/a1.91 GiBn/a
Array.extract_appendn/a1.017 sn/an/a1.52Kn/an/a1.25 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.5 msn/an/a3.43Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.09 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.15 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.6 msn/an/a5.07Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a264.7 msn/an/a6.70Kn/an/a1.19 GiBn/a
List.mergeSortn/a262.3 msn/an/a5.54Kn/an/a998.22 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a765.08 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a702.54 MiBn/a
Nat.sub_le_of_le_addn/a253.2 msn/an/a671.490n/an/a601.42 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.01 GiBn/a
Int.gcdn/a252.5 msn/an/a823.710n/an/a636.20 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.730n/an/a484.27 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 930ebb8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.355 sn/an/a24.22Kn/an/a11.14 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.409 sn/an/a8.55Kn/an/a2.03 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.98 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.23 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.20 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.2 msn/an/a5.08Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.8 msn/an/a6.81Kn/an/a1.46 GiBn/a
String.splitn/a265.0 msn/an/a6.69Kn/an/a1.31 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1013.36 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a891.58 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a745.38 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.13 GiBn/a
Int.gcdn/a252.5 msn/an/a823.670n/an/a762.65 MiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.360n/an/a651.23 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.570n/an/a508.57 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs d69aaee

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.231 sn/an/a24.93Kn/an/a11.03 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.159 sn/an/a8.76Kn/an/a2.09 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.090n/an/a2.04 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.10 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a939.29 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.4 msn/an/a2.38Kn/an/a1014.35 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.4 msn/an/a2.37Kn/an/a1.25 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.15 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.51 GiBn/a
String.splitn/a265.1 msn/an/a6.69Kn/an/a1.25 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1008.04 MiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a775.05 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a730.16 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.24 GiBn/a
Nat.sub_le_of_le_addn/a252.7 msn/an/a672.780n/an/a616.39 MiBn/a
Int.gcdn/a252.5 msn/an/a823.830n/an/a666.57 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a499.68 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!bencher-thresholds-reset all

@github-actionsgithub-actionsBot added the bencher-thresholds-reset:all bencher baseline reset queued on merge label Jul 8, 2026
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset queued for: all — will anchor to the merge commit when this PR merges.

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 8595ee8

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.258 sn/an/a24.78Kn/an/a11.27 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.158 sn/an/a8.76Kn/an/a2.04 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.140n/an/a2.01 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a988.55 MiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.32 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.29 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.24 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.9 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.3 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a265.4 msn/an/a6.68Kn/an/a1.26 GiBn/a
List.mergeSortn/a261.9 msn/an/a5.55Kn/an/a1004.43 MiBn/a
Nat.gcd_commn/a254.8 msn/an/a1.53Kn/an/a813.46 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a740.42 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.08 GiBn/a
Nat.add_commn/a252.6 msn/an/a166.290n/an/a503.77 MiBn/a
Int.gcdn/a252.5 msn/an/a823.900n/an/a707.26 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.440n/an/a634.98 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 94e942d

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.050 sn/an/a26.05Kn/an/a11.11 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.426 sn/an/a8.54Kn/an/a2.00 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.149 sn/an/a921.510n/an/a1.97 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.13 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a991.18 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.22 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.0 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.37 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.28 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a990.69 MiBn/a
Nat.gcd_commn/a255.1 msn/an/a1.53Kn/an/a776.26 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a681.59 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.220n/an/a604.52 MiBn/a
Int.gcdn/a252.5 msn/an/a823.790n/an/a672.67 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.760n/an/a477.46 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5fa582b

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.993 sn/an/a26.42Kn/an/a11.05 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.677 sn/an/a8.34Kn/an/a2.11 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.148 sn/an/a921.570n/an/a1.86 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.12 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.25 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.17 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.38 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1.03 GiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a855.45 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a715.77 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.6 msn/an/a673.030n/an/a612.18 MiBn/a
Int.gcdn/a252.5 msn/an/a823.860n/an/a724.20 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.550n/an/a479.64 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 3c3d090

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.039 sn/an/a26.12Kn/an/a11.25 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.174 sn/an/a8.75Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.99 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.21 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.30 GiBn/a
Char.ofOrdinal_le_of_len/a775.2 msn/an/a3.43Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.08 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.3 msn/an/a5.08Kn/an/a1.14 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.4 msn/an/a6.82Kn/an/a1.30 GiBn/a
String.splitn/a265.2 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1012.01 MiBn/a
Nat.gcd_commn/a254.9 msn/an/a1.53Kn/an/a783.17 MiBn/a
Vector.appendn/a254.4 msn/an/a1.96Kn/an/a736.90 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a956.42 MiBn/a
Int.gcdn/a252.4 msn/an/a824.030n/an/a669.97 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.580n/an/a605.84 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a482.89 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 8, 2026 21:46
arthurpaulino
arthurpaulino previously approved these changes Jul 9, 2026
Lowering the witness cap below Zisk's built-in default (10) was measured to
have a negligible effect on host RAM and prove time for the kernel typecheck
workload, so the CLI override (which defaulted to 5) is removed and the prover
uses EmbeddedOpts::default(). Drop the now-stale flag mentions and per-RAM
tuning guidance from the README, the cost-model doc, and the shard.rs model
comments.
Rebased onto main (post #411 + #459) and integrated with the renamed
bench-main.yml and reworked bencher-track interface.
- Benchmarks/Vectors.csv: single shared source of truth (71 library constants
from Init/Std/Mathlib/Lean). Consumed by Aiur (bench-typecheck --manifest),
the zkVM hosts, and shell.
- bench-pr.yml: `!benchmark [aiur] [zisk] [sp1|all] [execute|prove]` over the
curated set, posting a main-vs-PR table; main results cached by base SHA.
Hardened: comment body from env (no injection), allowlisted env parsing.
- .github/scripts/{bench.py,run.sh}: parse/manifest/compare/comment, and the
compile-.ixe + backend driver (cycles/execute-time/throughput/peak-rss, plus
shards/max-shard-cycles for sharded runs).
- .github/actions/install-{sp1,zisk}: shared zkVM toolchain + deps install,
used by bench-pr.yml, bench-main.yml, and riscv-bench.yml.
- bench-main.yml: add zkvm-execute (Zisk/SP1 cycle counts + time/RAM) and
native-check (native parallel `ix check --anon` throughput) jobs, using the
new bencher-track workload/thresholds interface.
- bench-typecheck: add --constant / --skip-deps (align with the zkVM hosts;
--skip-deps replaces --subject-only) and --execute-only (fast execute path).
issue_comment workflows only run from the default branch, so the `!benchmark`
path can't be exercised on a PR branch. Add a pull_request trigger (base/head
from the PR payload; empty comment → parser defaults) to test pre-merge.
Revert before merge — delete the `pull_request:` trigger; the dual base/head
resolution and `|| pull_request.number` fallbacks are harmless to keep.
Revert the cgroup mode (and the earlier RLIMIT_DATA layer): back to the
plain tree-RSS sampler, sudo-free and identical everywhere. The burst
problem is handled by cadence instead of a kernel cap: sampling drops
from ~1s to 0.2s once the tree is within 20 GB of the ceiling (100 GB
at the default 120), and the post-TERM grace re-checks every 0.2s,
KILLing immediately while the tree is still at the ceiling. Worst-case
overshoot shrinks from GB-per-second x seconds to x ~0.4s.
ix bench run still hard-fails when the watchdog script is missing — an
unenforced ceiling is not a benchmark run.
The flat 120 was a leftover from the RLIMIT_DATA era (a VA cap needed
fixed slack above RSS); for the sampler it protects nothing on machines
with less RAM and leaves ~3 GB of headroom on the 123 GiB runner. Back
to MemTotal minus 12 GiB (runner: 111; 64 GiB workstation: 52), which
the adaptive fast-cadence zone sits under wherever the run happens.
Same lesson aiur taught: shared measure names (peak-rss, throughput)
mean that mode's phase, so a future zisk/sp1 prove mode needs its own
testbed — and an unsuffixed zisk-check silently meaning "execute only"
is the asymmetry we just cleaned up for aiur. Renaming now rides the
merge's existing bencher migration (console rename + reset-all) instead
of paying a second cycle later.
The zkvm job derives testbed/workload from the cell's mode, so a prove
cell would land on zisk-check-prove-x64-32x with no workflow edits.
The per-cell .ixe cache only helped re-runs: on a fresh commit every
same-env cell missed the cold cache simultaneously and paid its own ix
compile in parallel. A prepare job (matrix over ci parse's new
prep-envs output — envs consumed by non-compile cells) now compiles
each .ixe once and publishes it under the key the cells already
restore, so cells start warm. Skipped for compile-only requests, whose
cells compile fresh by design; a prepare failure stops the cells (they
would just re-fail the same compile lazily).
Two more runner deaths, two measured causes:
1. aiur prove crossed the ceiling by 13 GB inside one 0.2s sample —
first-touch of pre-reserved prover buffers grows RSS at memory
bandwidth, which no cadence outruns. Headroom widens to 24 GiB (the
~123 GiB runner's ceiling drops 111 → 99) so the worst measured
overshoot plus OS/agent fits, and the sampler now TERMs on a
one-sample linear projection (level + last delta), buying back one
sample of reaction time — verified live: the kill fires before the
ceiling is crossed on a steep ramp.
2. zisk died at a nominal 0.4 GB over: the ASM services' locked shared
segments are under-attributed by per-process RSS. /dev/shm usage now
counts into the tree total.
…tion
Everything hairy in the sampler (two ps/awk tree walks, the /dev/shm
add-on, adaptive cadence, trajectory projection, conditional grace)
existed to reconstruct a number the kernel already publishes:
/proc/meminfo MemAvailable, its own estimate of what can be allocated
without thrashing. It natively accounts for everything the tree
consumes (RSS, locked shm, page tables) plus everything else on the
host, and correctly ignores reclaimable page cache.
The watchdog now kills the tree when MemAvailable < MemTotal - ceiling,
at a fixed 0.25s cadence (a meminfo read is ~free, so no adaptive zone)
with a plain TERM -> 2s -> KILL (rows are flushed continuously; the
grace was only ever for destructors). The floor never drops below 4 GiB
so an oversized ceiling still protects the host, and a machine without
/proc/meminfo is refused loudly. ~40 lines shorter, and strictly harder
to fool than the tree-RSS sum it replaces.
…ottery
A 50-run log sweep showed the ubuntu-latest build hosts hand out 4 CPU
models, baking AVX-512 into the -Ctarget-cpu=native binaries on only
~18% of builds — main's history randomly flipped Plonky3 codepaths
between pushes, and main-vs-PR comparisons crossed ISAs ~30% of the
time. The warp fleet is CPU-uniform (AMD EPYC 9R45 / Intel, all
AVX-512), so building there makes the ISA deterministic AND faster.
Every job that runs the binaries moves with the build (a non-AVX-512
GitHub host would SIGILL): bench-main's plan, bench-pr's build (parse)
and assemble (report). setup/comment/thresholds-reset run no ix and
stay on ubuntu-latest. The Log build CPU step stays, as the check that
a regression wasn't a fleet change.
The cache-hit and cache-miss branches each carried their own
lean-action step (build vs provision-only); a computed build flag
collapses them — miss builds, hit provisions the toolchain the
restored binaries need.
The 24 GiB headroom killed the Mathlib compile 3 GB from completion
(machine-wide usage ~99.6 GB vs the 99 ceiling): that headroom is sized
for the aiur prover's memory-bandwidth bursts (~13 GB between samples),
while ix compile grows build-paced at a few GB/s and legitimately peaks
near 100 GB. One number can't serve both on a 123 GB machine, so the
headroom moves into the registry per backend: 24 GiB default (provers),
12 for compile (runner ceiling 111, ~11 GB above the measured Mathlib
peak, floor still 4x its worst per-sample growth).
With the MemAvailable watchdog, the per-backend headroom machinery
reduces to one number: 110 sits above the largest legitimate workload
(Mathlib ix compile, ~100 GB) and leaves a ~13 GB free floor on the
~123 GiB runner; the script's 4 GiB minimum floor keeps smaller
machines protected when the default exceeds their RAM. Deletes the
headroomGb registry field and the /proc/meminfo parsing in Lean.
Derived again (a flat 110 protects nothing on smaller machines and
tracks nothing when the runner class changes): MemTotal - 15 puts the
~123 GiB runner at ~108, above Mathlib ix compile's ~100 GB peak, with
the 15 GB as the MemAvailable kill floor. Same rule for every backend.
The serialized env size wiggles slightly run-to-run, so the 0/0 pin
alerts on noise. A 1% band still catches real serialization-format
regressions (~32 MB on Mathlib) while tolerating the wiggle. constants
stays pinned — the count is deterministic. That the .ixe is not
byte-reproducible at all is worth its own investigation for a
content-addressed store; noted in the threshold comment.
Replaces the avx512f present/absent binary with the full avx2/avx512*
flag list from cpuinfo (or 'absent'), so a regression can be traced to
exactly which extensions the build host offered.
plan (ci matrix) and assemble (bench report) never execute the Rust
objects where the warp build's AVX-512 lives — Lean code is compiled by
leanc at baseline ISA, and Rust has no life-before-main initializers.
Each job's comment records the assumption: move back to warp if ix
startup or these subcommands ever touch the FFI. The build/prepare/
benchmark/compile jobs keep warp (they compile with target-cpu=native
or execute the prover FFI).
Validated on both ubuntu-latest and warp runners (ix-cpu-info's
cgroup-memcap.yml): systemd-run --user --scope -p MemoryMax=<G>
-p MemorySwapMax=0 hard-caps the tool's cgroup; the kernel OOM-kills at
the ceiling with SIGKILL (exit 137, the orchestrator's OOM signal). No
sampler cadence to race, no tree to sum, no burst arithmetic — the
cgroup charges the whole tree's resident memory and cached allocator
reservations don't count.
The script shrinks to an exec: a passwordless-sudo enable-linger boots
the user manager on CI (no-op locally where a session provides one),
XDG_RUNTIME_DIR is defaulted, and systemd-run replaces the process. No
fallback: without a user bus it fails loudly (exit 1 -> the cell
aborts).
bench-main runs on pushes to main only again; bench-pr is
issue_comment-only — the pull_request trigger, its fixed test command,
the head-ref gate, and the || fallbacks in concurrency/SHA-resolution/
comment-target all go with it. The OOM enforcement and both workflows
were verified end to end from this branch before the revert.
The zisk shard-plan run for the heavy bitblast block exposed the hole:
a plain systemd scope doesn't set memory.oom.group, so at the cap the
kernel killed only the biggest process — Zisk's ASM MT service — and
the surviving host converted the memory kill into a clean exit 1, which
the orchestrator (correctly) treats as a deterministic failure and
aborts the cell instead of recording the oom row this expected-OOM
constant should produce.
The wrapper now writes memory.oom.group=1 on the scope's cgroup (user-
delegated, no sudo) before exec'ing the tool: breach -> the whole tree
dies with SIGKILL -> exit 137 -> oom row, same semantics the sampler
era had. Failure to set it exits 2 rather than running with
single-victim kill semantics.
One-off runs no longer need a names file: --consts takes the same
comma-separated grammar as the tools, unioned with --names-file via
ConstsFile.gather (the machinery every other consumer already uses).
…lace name files
- ix bench run/shard take --ixe <path> (must exist, used as-is; no flag
= compile fresh) instead of the magic reuse-if-present flag. The
workflows pass the cache-restored path explicitly; bench-pr guards
with [ -f ] so a missed cache still compiles rather than failing.
- ix bench run drops --names-file: --consts (comma-separated, the
tools' grammar) is the one selection override. bench-pr's targeted
base run builds the list with paste -sd, from fetch-main's
missing-out file.
- fetch-main gains --consts alongside the workflow-facing --names file
(unioned), so the local compare-vs-main flow needs no temp files.
…ompile
The prepare job compiled the .ixe for the prover cells while a
compile-backend cell compiled the same env again for measurement. The
renamed compile job (prepare was ambiguous) now runs for every
requested env and serves both purposes: it publishes the .ixe the
prover cells restore, and its measured row is published too
(bench-pr-row-<sha>-<env>) for the compile cell to reuse as its PR side
— same runner class, same binaries, same command. A row-cache miss just
means the compile cell compiles and measures itself, as before.
ci parse's prep-envs output simplifies to envs (all requested envs).
The rss-sampler/json-sink additions this branch relied on landed
upstream in argumentcomputer/tracing-texray; pin the merged commit
465bbca in place of the pre-merge fork rev.
@samuelburnham
samuelburnham merged commit 49945d1 into mainJul 9, 2026
17 of 18 checks passed
@samuelburnham
samuelburnham deleted the sb/ci-benchmarks branch July 9, 2026 18:10
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset to 49945d1 for: aiur-check-execute aiur-check-prove ix-compile ooc-check sp1-check-execute zisk-check-execute

samuelburnham added a commit that referenced this pull request Jul 10, 2026
* bench: curate Vectors.csv by measured workload distinctness
Local aiur prove runs plus per-constant closure profiles (targets,
ingress bytes, fft-cost) showed a third of the cheap tier measuring
the same thing:
- drop the base-cost floor duplicates (3-9 constant closures, <13 kB,
prove within noise of each other): Acc.rec, Trans.mk, Sum.elim,
Prod.map, Option.bind, Array.toList — Eq.rec stays as the recursor
representative, Except.bind for monadic bind, WellFounded.fix for
recursion combinators;
- drop Nat.toDigits (strictly inside Nat.repr's closure), Array.filter
and Array.foldlM (within 1.5x of Array.map, which stays), Int.add
(scale twin of primary Nat.add_comm; Int is covered by emod/gcd);
- drop the Int8/Int16/Int32 instRxcHasSize_eq triplets (byte-identical
siblings of the kept Int64) and the trivials Nat, HEq, HEq.rec,
Nat.add;
- add Std.HashMap as HEAVY: 1,982-constant closure, 2.28 MB ingress,
84.6 s / 49 GiB / 18.4B FFTs proved locally — 6-40x every cheap
constant on every axis.
The prove-feasible full set is now 20 constants spanning recursors,
WF recursion, monadic bind, List/Array, Nat/Int/BitVec/USize
arithmetic, decidability, bytes/strings, hashing, and (via the heavy
tier) big structures.
* fix(bench): align tracing-texray pins with the root workspace
The zisk and sp1 hosts pinned tracing-texray at an older rev than the
root workspace (bumped in #467), so cargo linked TWO instances of the
crate into each host: main() started one instance's RSS sampler while
ix_bench::peak_rss_bytes() read the other's never-started one — always
None — and the resulting null was dropped by `ix bench bmf`'s
numeric-fields filter. Net effect: every zisk upload silently lost
peak-rss (parent and per-shard rows alike) since the pin diverged.
Align both hosts on the root rev and re-lock; cargo tree confirms a
single shared instance, so the sampler the host starts is the one the
row emission reads.
* bench: zisk rows report constants and shards
constants = the named constants certified over the checked closure —
the pre-shard input set, the same universe the aiur rows count via
closureFrom. The cheap paths emit the cover size; the shard-plan path
emits `needed` (targets this run answers for), computed before shard
partitioning and store-reuse filtering, so neither sharding overhead
nor covered-shard skips distort it. Anon-work dedup shrinks the WORK
item count, never this number; sharding's extra work stays visible in
cycles/execute-time where it belongs.
shards was already emitted on shard-plan rows; a non-sharded execute
now reports 1 (a single leaf IS one shard) instead of omitting the
field and rendering n/a in the compare table.
bench-main pins constants 0/0 on the zkvm testbeds like the other
cells: it is deterministic, and a drop means lost coverage, not a win.
* bench: compare-table and !benchmark upgrades
- aiur prove cells report throughput (constants/prove-time was already
uploaded and thresholded; the registry column list just omitted it —
every other cell follows the time/throughput/peak-rss convention).
- zisk compare tables gain constants and shards columns, next to cycles.
- The per-constant phase drill-downs are now opt-in via BENCH_PHASES=1
(a passthrough config key): the spans are noisy and dynamically
named, so the default comment stays at the headline measures.
- KEY=VALUE config parses inline on the command line too, whitespace-
separated — the single-line form for bench-pr.yml's manual
workflow_dispatch, whose input box cannot hold newlines. Inline keys
are strict (an unknown key rejects, like a typo'd backend); config
lines stay lenient since comment prose contains `=`.
* bench: `ix bench plots` — registry-driven bencher dashboard sync
One plot per (testbed, measure) bench-main tracks, one line per
benchmark row the cell uploads, plus the cross-kernel input-constants
overlay (aiur and zisk report the same pre-shard closure count, so the
paired lines must coincide — separation is a coverage-drift tripwire).
Titles, dashboard ordering, redundancy skips, and canonical measure
units live here as typed data; the spec derives from the registry +
Vectors.csv, so nothing is hand-listed.
Idempotent, keyed by title: matching plots are kept (index
re-asserted), stale ones deleted and recreated (the plot PATCH endpoint
only takes index/title/window), hand-pinned ones untouched. The sync
also asserts measure units — bencher auto-creates measures with
placeholder units on first upload, leaving plots unitless.
All bencher.dev traffic goes through the bencher CLI; --dry-run
previews with no key. bencher-plots.yml dispatches it manually (like
bencher-thresholds-reset) off the freshest bench-bins cache: run it
after a registry change has merged AND bench-main has built it — the
registry is compiled into the binary, and a new constant only gets its
plot line once its first rows upload.
* fix(ci): bench-pr Mathlib env — mathlib lives in the Benchmarks/Compile subpackage
BENCH_ENVS=Mathlib died at 'Get Mathlib Cache' with 'unknown executable
cache': use-mathlib-cache runs `lake exe cache get`, and mathlib is a
dependency of the Benchmarks/Compile subpackage, not the root workspace
lean-action was pointed at. bench-main had this right; bench-pr now
mirrors it:
- compile job: provision from Benchmarks/Compile (same toolchain as
root) and `lake build Compile<env>` before the measured compile;
- benchmark cells: no mathlib cache at all — the .ixe comes from the
compile job, and the lazy Mathlib fallback fails loudly rather than
fetching oleans it still couldn't build;
- base side: the build action stays on the base root (it builds ix);
a separate step fetches/builds base mathlib oleans in the subpackage
when a Mathlib cell must re-run the base.
* ci: bench-pr cells fail on a compile-cache miss instead of recompiling
The benchmark cells carried two lazy fallbacks for artifacts the
compile job publishes in the same run: a missing compile row made the
compile cell re-measure the compile in-cell, and a missing `.ixe` made
`ix bench run` recompile the env fresh. Neither could ever work for
the Mathlib env (its oleans live only in the compile job's subpackage
provisioning), so the fallbacks meant InitStd and Mathlib failed
differently for the same infrastructure problem.
Both restores are now fail-on-cache-miss and the run step always
passes `--ixe`: the artifacts were published moments earlier, so a
miss is an infrastructure failure and every env fails the same way,
loudly, at the restore step. The in-cell "Save PR .ixe" step goes with
the fallback that produced it.
* bench: throughput means constants per second on every backend
The zkVM hosts uploaded cycles/second under the same `throughput` slug
every other cell used for constants/second, so the shared measure had
no honest unit (and the dashboard showed a generic "per second"). The
hosts now report constants/second like everyone else — cheap zisk rows
over the certified cover, shard-plan rows over the pre-shard `needed`
set, sp1 over its checked count (its stdout already printed this
number; the row disagreed) — via one shared `ix_bench::throughput`
calculator. A zkVM's cycle rate stays derivable from its `cycles` and
`execute-time` fields.
The bencher measure's canonical units become "constants / second".
NB: the first post-merge zisk upload drops throughput by orders of
magnitude (meaning change, not a regression) — reset the
zisk-check-execute baseline (!bencher-thresholds-reset) right after,
or the 10% lower bound alerts.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bencher-thresholds-reset:allbencher baseline reset queued on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@samuelburnham@arthurpaulino@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ci: Standardize benchmarks and input constants - #467

Merged
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks
Jul 9, 2026
Merged

ci: Standardize benchmarks and input constants#467
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks

Conversation

@samuelburnham

@samuelburnhamsamuelburnham commented Jul 2, 2026

Copy link
Copy Markdown
Member

CI benchmarking:

  • ix bench Lean CLI for comprehensive local and CI benchmarks of ix compilation and typechecking over multiple backends, against a curated set of constants. Provides comparative runs against local history, or current main (fetches cached bencher.dev results), and formats them in a Markdown table.
  • Updates bench-pr.yml to use this framework and print the Markdown table as a PR comment (see example comments below).
  • Updates bench-main.yml to fully bench all backends and upload them to bencher.dev, except for RISC-V proving for now due to GPU requirements. SP1 is also left as a TODO.
  • Now tracks per-phase span measurements from tracing-texray as first-class benchmark metrics, and uploads them to bencher.dev for regression testing and also direct PR comparison in the comment table with a collapsible drop-down view (not fully tested).
  • Adds a RAM watchdog via systemd-run cgroups to prevent an OOM constant from killing the runner and failing the workflow.
  • Moves the benchmark binaries onto AVX-512-compatible runner after testing that the Warpbuild 32 vCPU runner (AMD EPYC 9R45 in all my tests) has full AVX-512 support. This should provide a one-time speedup that more accurately tracks production performance.

Usage

Local benchmarks:

# Compare local runs
ix bench run --backend aiur --env InitStd --mode execute --consts Nat.add_comm --ixe initstd.ixe
ix bench compare --backend aiur --env InitStd --mode execute --consts Nat.add_comm
# Compare against main
ix bench fetch-main --sha $(git rev-parse origin/main) \
--backend aiur --mode execute --consts Nat.add_comm --out main.json
ix bench compare --backend aiur --env InitStd --mode execute \
--main main.json --pr .lake/benches/aiur-InitStd-execute.json

PR comparative benchmarks against main:

!benchmark [aiur] [zisk] [sp1] [ooc] [compile] | all [execute]
# Optional env vars
BENCH_ENVS=InitStd,Mathlib
BENCH_FULL=1 # the env's full curated set (56 InitStd / 10 Mathlib consts) instead of the default primary subset (17 InitStd / 2 Mathlib)
BENCH_SHARD=1 # restrict to the multi-shard target constants
RUST_LOG=info

Successful runs:

Merge after argumentcomputer/tracing-texray#3

Note

Before merge:

  • Bencher console: rename aiur-typecheck-x64-32x → aiur-check-prove-x64-32x, zisk-check-x64-32x → zisk-check-execute-x64-32x; archive stale shard-cycles:N measures.
  • Delete the old threshold Git tags for aiur as the names have been updated

@samuelburnham
samuelburnhamforce-pushed the sb/ci-benchmarks branch 7 times, most recently from 07264b9 to f1ff88aCompareJuly 3, 2026 20:39
Comment thread.github/workflows/bench-pr.yml Fixed
Comment thread.github/workflows/bench-pr.yml Fixed
@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b56201f

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

No result tables were produced — see the workflow logs.

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 70d60b8

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%file-size (main)file-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.222 sn/an/a24.99Kn/an/a306.41 MiBn/an/a105492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqOOM6.86Kn/aOOM264.7 msn/aOOM1.16 GiBn/a
String.splitOOM6.71Kn/aOOM264.0 msn/aOOM971.84 MiBn/a
InitStdn/a6.08Kn/an/a14.644 sn/an/a1.48 GiBn/a
List.mergeSortOOM5.56Kn/aOOM261.5 msn/aOOM802.59 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendOOM5.09Kn/aOOM529.6 msn/aOOM998.39 MiBn/a
Char.ofOrdinal_le_of_leOOM3.44Kn/aOOM773.9 msn/aOOM980.05 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqOOM2.38Kn/aOOM764.8 msn/aOOM841.74 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqOOM2.37Kn/aOOM764.8 msn/aOOM977.59 MiBn/a
Vector.appendOOM1.96Kn/aOOM254.4 msn/aOOM665.40 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqOOM1.79Kn/aOOM1.015 sn/aOOM853.80 MiBn/a
Nat.gcd_commOOM1.53Kn/aOOM254.2 msn/aOOM640.46 MiBn/a
Array.extract_appendOOM1.52Kn/aOOM1.017 sn/aOOM1.04 GiBn/a
Vector.extract_append._proof_2OOM1.29Kn/aOOM1.012 sn/aOOM916.29 MiBn/a
String.appendOOM1.21Kn/aOOM253.1 msn/aOOM1.01 GiBn/a
Int.gcdOOM823.880n/aOOM252.5 msn/aOOM616.14 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualOOM821.770n/aOOM6.895 sn/aOOM1.73 GiBn/a
Nat.sub_le_of_le_addOOM673.120n/aOOM252.6 msn/aOOM568.05 MiBn/a
Nat.add_commOOM166.670n/aOOM252.0 msn/aOOM457.39 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 431ae38

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a3.955 sn/an/a26.67Kn/an/a306.41 MiBn/an/a105492n/an/a10.67 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.87Kn/an/a264.4 msn/an/a1.19 GiBn/a
String.splitn/a6.72Kn/an/a263.8 msn/an/a1.07 GiBn/a
InitStdn/a6.41Kn/an/a13.881 sn/an/a1.47 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.7 msn/an/a858.98 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.10Kn/an/a528.9 msn/an/a1.01 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a774.0 msn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.5 msn/an/a880.31 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.6 msn/an/a815.45 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.6 msn/an/a979.52 MiBn/a
Vector.appendn/a1.95Kn/an/a254.8 msn/an/a667.94 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a254.9 msn/an/a681.33 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.01 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.07 GiBn/a
String.appendn/a1.21Kn/an/a252.8 msn/an/a965.88 MiBn/a
Int.gcdn/a824.190n/an/a252.4 msn/an/a619.82 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a822.230n/an/a6.891 sn/an/a1.72 GiBn/a
Nat.sub_le_of_le_addn/a673.260n/an/a252.5 msn/an/a564.67 MiBn/a
Nat.add_commn/a166.640n/an/a252.0 msn/an/a451.35 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 7d3388b

backends: ooc=execute compile=execute · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a4.352 sn/an/a24.24Kn/an/a306.41 MiBn/an/a105,492n/an/a10.59 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.15 GiBn/a
String.splitn/a6.71Kn/an/a263.9 msn/an/a1.05 GiBn/a
InitStdn/a6.41Kn/an/a13.882 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a838.87 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.5 msn/an/a982.43 MiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.9 msn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.7 msn/an/a917.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.8 msn/an/a812.00 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.01 GiBn/a
Vector.appendn/a1.96Kn/an/a254.3 msn/an/a659.75 MiBn/a
Nat.gcd_commn/a1.54Kn/an/a253.9 msn/an/a643.67 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a920.13 MiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a978.00 MiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.02 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a853.640n/an/a6.637 sn/an/a1.80 GiBn/a
Int.gcdn/a824.010n/an/a252.4 msn/an/a612.75 MiBn/a
Nat.sub_le_of_le_addn/a673.230n/an/a252.5 msn/an/a568.57 MiBn/a
Nat.add_commn/a166.670n/an/a252.0 msn/an/a467.85 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 1103162

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a4.301 sn/an/a24.53Kn/an/a306.41 MiBn/an/a105,492n/an/a10.61 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.33 GiBn/a
String.splitn/a6.71Kn/an/a264.3 msn/an/a1.12 GiBn/a
InitStdn/a6.30Kn/an/a14.129 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a931.07 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.7 msn/an/a1.02 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.7 msn/an/a887.48 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a765.2 msn/an/a841.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.08 GiBn/a
Vector.appendn/a1.96Kn/an/a254.4 msn/an/a669.67 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a1.79Kn/an/a1.015 sn/an/a914.25 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a255.3 msn/an/a657.64 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.16 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.11 GiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.08 GiBn/a
Int.gcdn/a823.880n/an/a252.5 msn/an/a607.91 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a821.940n/an/a6.893 sn/an/a1.64 GiBn/a
Nat.sub_le_of_le_addn/a673.360n/an/a252.5 msn/an/a547.86 MiBn/a
Nat.add_commn/a166.540n/an/a252.2 msn/an/a435.36 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b82aed8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.947 sn/an/a26.73Kn/an/a11.24 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.412 sn/an/a8.55Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.404 sn/an/a884.740n/an/a1.91 GiBn/a
Array.extract_appendn/a1.017 sn/an/a1.52Kn/an/a1.25 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.5 msn/an/a3.43Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.09 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.15 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.6 msn/an/a5.07Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a264.7 msn/an/a6.70Kn/an/a1.19 GiBn/a
List.mergeSortn/a262.3 msn/an/a5.54Kn/an/a998.22 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a765.08 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a702.54 MiBn/a
Nat.sub_le_of_le_addn/a253.2 msn/an/a671.490n/an/a601.42 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.01 GiBn/a
Int.gcdn/a252.5 msn/an/a823.710n/an/a636.20 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.730n/an/a484.27 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 930ebb8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.355 sn/an/a24.22Kn/an/a11.14 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.409 sn/an/a8.55Kn/an/a2.03 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.98 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.23 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.20 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.2 msn/an/a5.08Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.8 msn/an/a6.81Kn/an/a1.46 GiBn/a
String.splitn/a265.0 msn/an/a6.69Kn/an/a1.31 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1013.36 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a891.58 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a745.38 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.13 GiBn/a
Int.gcdn/a252.5 msn/an/a823.670n/an/a762.65 MiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.360n/an/a651.23 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.570n/an/a508.57 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs d69aaee

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.231 sn/an/a24.93Kn/an/a11.03 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.159 sn/an/a8.76Kn/an/a2.09 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.090n/an/a2.04 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.10 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a939.29 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.4 msn/an/a2.38Kn/an/a1014.35 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.4 msn/an/a2.37Kn/an/a1.25 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.15 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.51 GiBn/a
String.splitn/a265.1 msn/an/a6.69Kn/an/a1.25 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1008.04 MiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a775.05 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a730.16 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.24 GiBn/a
Nat.sub_le_of_le_addn/a252.7 msn/an/a672.780n/an/a616.39 MiBn/a
Int.gcdn/a252.5 msn/an/a823.830n/an/a666.57 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a499.68 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!bencher-thresholds-reset all

@github-actionsgithub-actionsBot added the bencher-thresholds-reset:all bencher baseline reset queued on merge label Jul 8, 2026
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset queued for: all — will anchor to the merge commit when this PR merges.

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 8595ee8

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.258 sn/an/a24.78Kn/an/a11.27 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.158 sn/an/a8.76Kn/an/a2.04 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.140n/an/a2.01 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a988.55 MiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.32 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.29 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.24 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.9 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.3 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a265.4 msn/an/a6.68Kn/an/a1.26 GiBn/a
List.mergeSortn/a261.9 msn/an/a5.55Kn/an/a1004.43 MiBn/a
Nat.gcd_commn/a254.8 msn/an/a1.53Kn/an/a813.46 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a740.42 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.08 GiBn/a
Nat.add_commn/a252.6 msn/an/a166.290n/an/a503.77 MiBn/a
Int.gcdn/a252.5 msn/an/a823.900n/an/a707.26 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.440n/an/a634.98 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 94e942d

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.050 sn/an/a26.05Kn/an/a11.11 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.426 sn/an/a8.54Kn/an/a2.00 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.149 sn/an/a921.510n/an/a1.97 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.13 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a991.18 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.22 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.0 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.37 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.28 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a990.69 MiBn/a
Nat.gcd_commn/a255.1 msn/an/a1.53Kn/an/a776.26 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a681.59 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.220n/an/a604.52 MiBn/a
Int.gcdn/a252.5 msn/an/a823.790n/an/a672.67 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.760n/an/a477.46 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5fa582b

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.993 sn/an/a26.42Kn/an/a11.05 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.677 sn/an/a8.34Kn/an/a2.11 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.148 sn/an/a921.570n/an/a1.86 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.12 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.25 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.17 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.38 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1.03 GiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a855.45 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a715.77 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.6 msn/an/a673.030n/an/a612.18 MiBn/a
Int.gcdn/a252.5 msn/an/a823.860n/an/a724.20 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.550n/an/a479.64 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 3c3d090

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.039 sn/an/a26.12Kn/an/a11.25 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.174 sn/an/a8.75Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.99 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.21 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.30 GiBn/a
Char.ofOrdinal_le_of_len/a775.2 msn/an/a3.43Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.08 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.3 msn/an/a5.08Kn/an/a1.14 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.4 msn/an/a6.82Kn/an/a1.30 GiBn/a
String.splitn/a265.2 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1012.01 MiBn/a
Nat.gcd_commn/a254.9 msn/an/a1.53Kn/an/a783.17 MiBn/a
Vector.appendn/a254.4 msn/an/a1.96Kn/an/a736.90 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a956.42 MiBn/a
Int.gcdn/a252.4 msn/an/a824.030n/an/a669.97 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.580n/an/a605.84 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a482.89 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 8, 2026 21:46
arthurpaulino
arthurpaulino previously approved these changes Jul 9, 2026
Lowering the witness cap below Zisk's built-in default (10) was measured to
have a negligible effect on host RAM and prove time for the kernel typecheck
workload, so the CLI override (which defaulted to 5) is removed and the prover
uses EmbeddedOpts::default(). Drop the now-stale flag mentions and per-RAM
tuning guidance from the README, the cost-model doc, and the shard.rs model
comments.
Rebased onto main (post #411 + #459) and integrated with the renamed
bench-main.yml and reworked bencher-track interface.
- Benchmarks/Vectors.csv: single shared source of truth (71 library constants
from Init/Std/Mathlib/Lean). Consumed by Aiur (bench-typecheck --manifest),
the zkVM hosts, and shell.
- bench-pr.yml: `!benchmark [aiur] [zisk] [sp1|all] [execute|prove]` over the
curated set, posting a main-vs-PR table; main results cached by base SHA.
Hardened: comment body from env (no injection), allowlisted env parsing.
- .github/scripts/{bench.py,run.sh}: parse/manifest/compare/comment, and the
compile-.ixe + backend driver (cycles/execute-time/throughput/peak-rss, plus
shards/max-shard-cycles for sharded runs).
- .github/actions/install-{sp1,zisk}: shared zkVM toolchain + deps install,
used by bench-pr.yml, bench-main.yml, and riscv-bench.yml.
- bench-main.yml: add zkvm-execute (Zisk/SP1 cycle counts + time/RAM) and
native-check (native parallel `ix check --anon` throughput) jobs, using the
new bencher-track workload/thresholds interface.
- bench-typecheck: add --constant / --skip-deps (align with the zkVM hosts;
--skip-deps replaces --subject-only) and --execute-only (fast execute path).
issue_comment workflows only run from the default branch, so the `!benchmark`
path can't be exercised on a PR branch. Add a pull_request trigger (base/head
from the PR payload; empty comment → parser defaults) to test pre-merge.
Revert before merge — delete the `pull_request:` trigger; the dual base/head
resolution and `|| pull_request.number` fallbacks are harmless to keep.
Revert the cgroup mode (and the earlier RLIMIT_DATA layer): back to the
plain tree-RSS sampler, sudo-free and identical everywhere. The burst
problem is handled by cadence instead of a kernel cap: sampling drops
from ~1s to 0.2s once the tree is within 20 GB of the ceiling (100 GB
at the default 120), and the post-TERM grace re-checks every 0.2s,
KILLing immediately while the tree is still at the ceiling. Worst-case
overshoot shrinks from GB-per-second x seconds to x ~0.4s.
ix bench run still hard-fails when the watchdog script is missing — an
unenforced ceiling is not a benchmark run.
The flat 120 was a leftover from the RLIMIT_DATA era (a VA cap needed
fixed slack above RSS); for the sampler it protects nothing on machines
with less RAM and leaves ~3 GB of headroom on the 123 GiB runner. Back
to MemTotal minus 12 GiB (runner: 111; 64 GiB workstation: 52), which
the adaptive fast-cadence zone sits under wherever the run happens.
Same lesson aiur taught: shared measure names (peak-rss, throughput)
mean that mode's phase, so a future zisk/sp1 prove mode needs its own
testbed — and an unsuffixed zisk-check silently meaning "execute only"
is the asymmetry we just cleaned up for aiur. Renaming now rides the
merge's existing bencher migration (console rename + reset-all) instead
of paying a second cycle later.
The zkvm job derives testbed/workload from the cell's mode, so a prove
cell would land on zisk-check-prove-x64-32x with no workflow edits.
The per-cell .ixe cache only helped re-runs: on a fresh commit every
same-env cell missed the cold cache simultaneously and paid its own ix
compile in parallel. A prepare job (matrix over ci parse's new
prep-envs output — envs consumed by non-compile cells) now compiles
each .ixe once and publishes it under the key the cells already
restore, so cells start warm. Skipped for compile-only requests, whose
cells compile fresh by design; a prepare failure stops the cells (they
would just re-fail the same compile lazily).
Two more runner deaths, two measured causes:
1. aiur prove crossed the ceiling by 13 GB inside one 0.2s sample —
first-touch of pre-reserved prover buffers grows RSS at memory
bandwidth, which no cadence outruns. Headroom widens to 24 GiB (the
~123 GiB runner's ceiling drops 111 → 99) so the worst measured
overshoot plus OS/agent fits, and the sampler now TERMs on a
one-sample linear projection (level + last delta), buying back one
sample of reaction time — verified live: the kill fires before the
ceiling is crossed on a steep ramp.
2. zisk died at a nominal 0.4 GB over: the ASM services' locked shared
segments are under-attributed by per-process RSS. /dev/shm usage now
counts into the tree total.
…tion
Everything hairy in the sampler (two ps/awk tree walks, the /dev/shm
add-on, adaptive cadence, trajectory projection, conditional grace)
existed to reconstruct a number the kernel already publishes:
/proc/meminfo MemAvailable, its own estimate of what can be allocated
without thrashing. It natively accounts for everything the tree
consumes (RSS, locked shm, page tables) plus everything else on the
host, and correctly ignores reclaimable page cache.
The watchdog now kills the tree when MemAvailable < MemTotal - ceiling,
at a fixed 0.25s cadence (a meminfo read is ~free, so no adaptive zone)
with a plain TERM -> 2s -> KILL (rows are flushed continuously; the
grace was only ever for destructors). The floor never drops below 4 GiB
so an oversized ceiling still protects the host, and a machine without
/proc/meminfo is refused loudly. ~40 lines shorter, and strictly harder
to fool than the tree-RSS sum it replaces.
…ottery
A 50-run log sweep showed the ubuntu-latest build hosts hand out 4 CPU
models, baking AVX-512 into the -Ctarget-cpu=native binaries on only
~18% of builds — main's history randomly flipped Plonky3 codepaths
between pushes, and main-vs-PR comparisons crossed ISAs ~30% of the
time. The warp fleet is CPU-uniform (AMD EPYC 9R45 / Intel, all
AVX-512), so building there makes the ISA deterministic AND faster.
Every job that runs the binaries moves with the build (a non-AVX-512
GitHub host would SIGILL): bench-main's plan, bench-pr's build (parse)
and assemble (report). setup/comment/thresholds-reset run no ix and
stay on ubuntu-latest. The Log build CPU step stays, as the check that
a regression wasn't a fleet change.
The cache-hit and cache-miss branches each carried their own
lean-action step (build vs provision-only); a computed build flag
collapses them — miss builds, hit provisions the toolchain the
restored binaries need.
The 24 GiB headroom killed the Mathlib compile 3 GB from completion
(machine-wide usage ~99.6 GB vs the 99 ceiling): that headroom is sized
for the aiur prover's memory-bandwidth bursts (~13 GB between samples),
while ix compile grows build-paced at a few GB/s and legitimately peaks
near 100 GB. One number can't serve both on a 123 GB machine, so the
headroom moves into the registry per backend: 24 GiB default (provers),
12 for compile (runner ceiling 111, ~11 GB above the measured Mathlib
peak, floor still 4x its worst per-sample growth).
With the MemAvailable watchdog, the per-backend headroom machinery
reduces to one number: 110 sits above the largest legitimate workload
(Mathlib ix compile, ~100 GB) and leaves a ~13 GB free floor on the
~123 GiB runner; the script's 4 GiB minimum floor keeps smaller
machines protected when the default exceeds their RAM. Deletes the
headroomGb registry field and the /proc/meminfo parsing in Lean.
Derived again (a flat 110 protects nothing on smaller machines and
tracks nothing when the runner class changes): MemTotal - 15 puts the
~123 GiB runner at ~108, above Mathlib ix compile's ~100 GB peak, with
the 15 GB as the MemAvailable kill floor. Same rule for every backend.
The serialized env size wiggles slightly run-to-run, so the 0/0 pin
alerts on noise. A 1% band still catches real serialization-format
regressions (~32 MB on Mathlib) while tolerating the wiggle. constants
stays pinned — the count is deterministic. That the .ixe is not
byte-reproducible at all is worth its own investigation for a
content-addressed store; noted in the threshold comment.
Replaces the avx512f present/absent binary with the full avx2/avx512*
flag list from cpuinfo (or 'absent'), so a regression can be traced to
exactly which extensions the build host offered.
plan (ci matrix) and assemble (bench report) never execute the Rust
objects where the warp build's AVX-512 lives — Lean code is compiled by
leanc at baseline ISA, and Rust has no life-before-main initializers.
Each job's comment records the assumption: move back to warp if ix
startup or these subcommands ever touch the FFI. The build/prepare/
benchmark/compile jobs keep warp (they compile with target-cpu=native
or execute the prover FFI).
Validated on both ubuntu-latest and warp runners (ix-cpu-info's
cgroup-memcap.yml): systemd-run --user --scope -p MemoryMax=<G>
-p MemorySwapMax=0 hard-caps the tool's cgroup; the kernel OOM-kills at
the ceiling with SIGKILL (exit 137, the orchestrator's OOM signal). No
sampler cadence to race, no tree to sum, no burst arithmetic — the
cgroup charges the whole tree's resident memory and cached allocator
reservations don't count.
The script shrinks to an exec: a passwordless-sudo enable-linger boots
the user manager on CI (no-op locally where a session provides one),
XDG_RUNTIME_DIR is defaulted, and systemd-run replaces the process. No
fallback: without a user bus it fails loudly (exit 1 -> the cell
aborts).
bench-main runs on pushes to main only again; bench-pr is
issue_comment-only — the pull_request trigger, its fixed test command,
the head-ref gate, and the || fallbacks in concurrency/SHA-resolution/
comment-target all go with it. The OOM enforcement and both workflows
were verified end to end from this branch before the revert.
The zisk shard-plan run for the heavy bitblast block exposed the hole:
a plain systemd scope doesn't set memory.oom.group, so at the cap the
kernel killed only the biggest process — Zisk's ASM MT service — and
the surviving host converted the memory kill into a clean exit 1, which
the orchestrator (correctly) treats as a deterministic failure and
aborts the cell instead of recording the oom row this expected-OOM
constant should produce.
The wrapper now writes memory.oom.group=1 on the scope's cgroup (user-
delegated, no sudo) before exec'ing the tool: breach -> the whole tree
dies with SIGKILL -> exit 137 -> oom row, same semantics the sampler
era had. Failure to set it exits 2 rather than running with
single-victim kill semantics.
One-off runs no longer need a names file: --consts takes the same
comma-separated grammar as the tools, unioned with --names-file via
ConstsFile.gather (the machinery every other consumer already uses).
…lace name files
- ix bench run/shard take --ixe <path> (must exist, used as-is; no flag
= compile fresh) instead of the magic reuse-if-present flag. The
workflows pass the cache-restored path explicitly; bench-pr guards
with [ -f ] so a missed cache still compiles rather than failing.
- ix bench run drops --names-file: --consts (comma-separated, the
tools' grammar) is the one selection override. bench-pr's targeted
base run builds the list with paste -sd, from fetch-main's
missing-out file.
- fetch-main gains --consts alongside the workflow-facing --names file
(unioned), so the local compare-vs-main flow needs no temp files.
…ompile
The prepare job compiled the .ixe for the prover cells while a
compile-backend cell compiled the same env again for measurement. The
renamed compile job (prepare was ambiguous) now runs for every
requested env and serves both purposes: it publishes the .ixe the
prover cells restore, and its measured row is published too
(bench-pr-row-<sha>-<env>) for the compile cell to reuse as its PR side
— same runner class, same binaries, same command. A row-cache miss just
means the compile cell compiles and measures itself, as before.
ci parse's prep-envs output simplifies to envs (all requested envs).
The rss-sampler/json-sink additions this branch relied on landed
upstream in argumentcomputer/tracing-texray; pin the merged commit
465bbca in place of the pre-merge fork rev.
@samuelburnham
samuelburnham merged commit 49945d1 into mainJul 9, 2026
17 of 18 checks passed
@samuelburnham
samuelburnham deleted the sb/ci-benchmarks branch July 9, 2026 18:10
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset to 49945d1 for: aiur-check-execute aiur-check-prove ix-compile ooc-check sp1-check-execute zisk-check-execute

samuelburnham added a commit that referenced this pull request Jul 10, 2026
* bench: curate Vectors.csv by measured workload distinctness
Local aiur prove runs plus per-constant closure profiles (targets,
ingress bytes, fft-cost) showed a third of the cheap tier measuring
the same thing:
- drop the base-cost floor duplicates (3-9 constant closures, <13 kB,
prove within noise of each other): Acc.rec, Trans.mk, Sum.elim,
Prod.map, Option.bind, Array.toList — Eq.rec stays as the recursor
representative, Except.bind for monadic bind, WellFounded.fix for
recursion combinators;
- drop Nat.toDigits (strictly inside Nat.repr's closure), Array.filter
and Array.foldlM (within 1.5x of Array.map, which stays), Int.add
(scale twin of primary Nat.add_comm; Int is covered by emod/gcd);
- drop the Int8/Int16/Int32 instRxcHasSize_eq triplets (byte-identical
siblings of the kept Int64) and the trivials Nat, HEq, HEq.rec,
Nat.add;
- add Std.HashMap as HEAVY: 1,982-constant closure, 2.28 MB ingress,
84.6 s / 49 GiB / 18.4B FFTs proved locally — 6-40x every cheap
constant on every axis.
The prove-feasible full set is now 20 constants spanning recursors,
WF recursion, monadic bind, List/Array, Nat/Int/BitVec/USize
arithmetic, decidability, bytes/strings, hashing, and (via the heavy
tier) big structures.
* fix(bench): align tracing-texray pins with the root workspace
The zisk and sp1 hosts pinned tracing-texray at an older rev than the
root workspace (bumped in #467), so cargo linked TWO instances of the
crate into each host: main() started one instance's RSS sampler while
ix_bench::peak_rss_bytes() read the other's never-started one — always
None — and the resulting null was dropped by `ix bench bmf`'s
numeric-fields filter. Net effect: every zisk upload silently lost
peak-rss (parent and per-shard rows alike) since the pin diverged.
Align both hosts on the root rev and re-lock; cargo tree confirms a
single shared instance, so the sampler the host starts is the one the
row emission reads.
* bench: zisk rows report constants and shards
constants = the named constants certified over the checked closure —
the pre-shard input set, the same universe the aiur rows count via
closureFrom. The cheap paths emit the cover size; the shard-plan path
emits `needed` (targets this run answers for), computed before shard
partitioning and store-reuse filtering, so neither sharding overhead
nor covered-shard skips distort it. Anon-work dedup shrinks the WORK
item count, never this number; sharding's extra work stays visible in
cycles/execute-time where it belongs.
shards was already emitted on shard-plan rows; a non-sharded execute
now reports 1 (a single leaf IS one shard) instead of omitting the
field and rendering n/a in the compare table.
bench-main pins constants 0/0 on the zkvm testbeds like the other
cells: it is deterministic, and a drop means lost coverage, not a win.
* bench: compare-table and !benchmark upgrades
- aiur prove cells report throughput (constants/prove-time was already
uploaded and thresholded; the registry column list just omitted it —
every other cell follows the time/throughput/peak-rss convention).
- zisk compare tables gain constants and shards columns, next to cycles.
- The per-constant phase drill-downs are now opt-in via BENCH_PHASES=1
(a passthrough config key): the spans are noisy and dynamically
named, so the default comment stays at the headline measures.
- KEY=VALUE config parses inline on the command line too, whitespace-
separated — the single-line form for bench-pr.yml's manual
workflow_dispatch, whose input box cannot hold newlines. Inline keys
are strict (an unknown key rejects, like a typo'd backend); config
lines stay lenient since comment prose contains `=`.
* bench: `ix bench plots` — registry-driven bencher dashboard sync
One plot per (testbed, measure) bench-main tracks, one line per
benchmark row the cell uploads, plus the cross-kernel input-constants
overlay (aiur and zisk report the same pre-shard closure count, so the
paired lines must coincide — separation is a coverage-drift tripwire).
Titles, dashboard ordering, redundancy skips, and canonical measure
units live here as typed data; the spec derives from the registry +
Vectors.csv, so nothing is hand-listed.
Idempotent, keyed by title: matching plots are kept (index
re-asserted), stale ones deleted and recreated (the plot PATCH endpoint
only takes index/title/window), hand-pinned ones untouched. The sync
also asserts measure units — bencher auto-creates measures with
placeholder units on first upload, leaving plots unitless.
All bencher.dev traffic goes through the bencher CLI; --dry-run
previews with no key. bencher-plots.yml dispatches it manually (like
bencher-thresholds-reset) off the freshest bench-bins cache: run it
after a registry change has merged AND bench-main has built it — the
registry is compiled into the binary, and a new constant only gets its
plot line once its first rows upload.
* fix(ci): bench-pr Mathlib env — mathlib lives in the Benchmarks/Compile subpackage
BENCH_ENVS=Mathlib died at 'Get Mathlib Cache' with 'unknown executable
cache': use-mathlib-cache runs `lake exe cache get`, and mathlib is a
dependency of the Benchmarks/Compile subpackage, not the root workspace
lean-action was pointed at. bench-main had this right; bench-pr now
mirrors it:
- compile job: provision from Benchmarks/Compile (same toolchain as
root) and `lake build Compile<env>` before the measured compile;
- benchmark cells: no mathlib cache at all — the .ixe comes from the
compile job, and the lazy Mathlib fallback fails loudly rather than
fetching oleans it still couldn't build;
- base side: the build action stays on the base root (it builds ix);
a separate step fetches/builds base mathlib oleans in the subpackage
when a Mathlib cell must re-run the base.
* ci: bench-pr cells fail on a compile-cache miss instead of recompiling
The benchmark cells carried two lazy fallbacks for artifacts the
compile job publishes in the same run: a missing compile row made the
compile cell re-measure the compile in-cell, and a missing `.ixe` made
`ix bench run` recompile the env fresh. Neither could ever work for
the Mathlib env (its oleans live only in the compile job's subpackage
provisioning), so the fallbacks meant InitStd and Mathlib failed
differently for the same infrastructure problem.
Both restores are now fail-on-cache-miss and the run step always
passes `--ixe`: the artifacts were published moments earlier, so a
miss is an infrastructure failure and every env fails the same way,
loudly, at the restore step. The in-cell "Save PR .ixe" step goes with
the fallback that produced it.
* bench: throughput means constants per second on every backend
The zkVM hosts uploaded cycles/second under the same `throughput` slug
every other cell used for constants/second, so the shared measure had
no honest unit (and the dashboard showed a generic "per second"). The
hosts now report constants/second like everyone else — cheap zisk rows
over the certified cover, shard-plan rows over the pre-shard `needed`
set, sp1 over its checked count (its stdout already printed this
number; the row disagreed) — via one shared `ix_bench::throughput`
calculator. A zkVM's cycle rate stays derivable from its `cycles` and
`execute-time` fields.
The bencher measure's canonical units become "constants / second".
NB: the first post-merge zisk upload drops throughput by orders of
magnitude (meaning change, not a regression) — reset the
zisk-check-execute baseline (!bencher-thresholds-reset) right after,
or the 10% lower bound alerts.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bencher-thresholds-reset:allbencher baseline reset queued on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@samuelburnham@arthurpaulino@github-advanced-security
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ci: Standardize benchmarks and input constants - #467

Merged
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks
Jul 9, 2026
Merged

ci: Standardize benchmarks and input constants#467
samuelburnham merged 100 commits into
mainfrom
sb/ci-benchmarks

Conversation

@samuelburnham

@samuelburnhamsamuelburnham commented Jul 2, 2026

Copy link
Copy Markdown
Member

CI benchmarking:

  • ix bench Lean CLI for comprehensive local and CI benchmarks of ix compilation and typechecking over multiple backends, against a curated set of constants. Provides comparative runs against local history, or current main (fetches cached bencher.dev results), and formats them in a Markdown table.
  • Updates bench-pr.yml to use this framework and print the Markdown table as a PR comment (see example comments below).
  • Updates bench-main.yml to fully bench all backends and upload them to bencher.dev, except for RISC-V proving for now due to GPU requirements. SP1 is also left as a TODO.
  • Now tracks per-phase span measurements from tracing-texray as first-class benchmark metrics, and uploads them to bencher.dev for regression testing and also direct PR comparison in the comment table with a collapsible drop-down view (not fully tested).
  • Adds a RAM watchdog via systemd-run cgroups to prevent an OOM constant from killing the runner and failing the workflow.
  • Moves the benchmark binaries onto AVX-512-compatible runner after testing that the Warpbuild 32 vCPU runner (AMD EPYC 9R45 in all my tests) has full AVX-512 support. This should provide a one-time speedup that more accurately tracks production performance.

Usage

Local benchmarks:

# Compare local runs
ix bench run --backend aiur --env InitStd --mode execute --consts Nat.add_comm --ixe initstd.ixe
ix bench compare --backend aiur --env InitStd --mode execute --consts Nat.add_comm
# Compare against main
ix bench fetch-main --sha $(git rev-parse origin/main) \
--backend aiur --mode execute --consts Nat.add_comm --out main.json
ix bench compare --backend aiur --env InitStd --mode execute \
--main main.json --pr .lake/benches/aiur-InitStd-execute.json

PR comparative benchmarks against main:

!benchmark [aiur] [zisk] [sp1] [ooc] [compile] | all [execute]
# Optional env vars
BENCH_ENVS=InitStd,Mathlib
BENCH_FULL=1 # the env's full curated set (56 InitStd / 10 Mathlib consts) instead of the default primary subset (17 InitStd / 2 Mathlib)
BENCH_SHARD=1 # restrict to the multi-shard target constants
RUST_LOG=info

Successful runs:

Merge after argumentcomputer/tracing-texray#3

Note

Before merge:

  • Bencher console: rename aiur-typecheck-x64-32x → aiur-check-prove-x64-32x, zisk-check-x64-32x → zisk-check-execute-x64-32x; archive stale shard-cycles:N measures.
  • Delete the old threshold Git tags for aiur as the names have been updated

@samuelburnham
samuelburnhamforce-pushed the sb/ci-benchmarks branch 7 times, most recently from 07264b9 to f1ff88aCompareJuly 3, 2026 20:39
Comment thread.github/workflows/bench-pr.yml Fixed
Comment thread.github/workflows/bench-pr.yml Fixed
@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b56201f

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

No result tables were produced — see the workflow logs.

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 70d60b8

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%file-size (main)file-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.222 sn/an/a24.99Kn/an/a306.41 MiBn/an/a105492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqOOM6.86Kn/aOOM264.7 msn/aOOM1.16 GiBn/a
String.splitOOM6.71Kn/aOOM264.0 msn/aOOM971.84 MiBn/a
InitStdn/a6.08Kn/an/a14.644 sn/an/a1.48 GiBn/a
List.mergeSortOOM5.56Kn/aOOM261.5 msn/aOOM802.59 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendOOM5.09Kn/aOOM529.6 msn/aOOM998.39 MiBn/a
Char.ofOrdinal_le_of_leOOM3.44Kn/aOOM773.9 msn/aOOM980.05 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqOOM2.38Kn/aOOM764.8 msn/aOOM841.74 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqOOM2.37Kn/aOOM764.8 msn/aOOM977.59 MiBn/a
Vector.appendOOM1.96Kn/aOOM254.4 msn/aOOM665.40 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqOOM1.79Kn/aOOM1.015 sn/aOOM853.80 MiBn/a
Nat.gcd_commOOM1.53Kn/aOOM254.2 msn/aOOM640.46 MiBn/a
Array.extract_appendOOM1.52Kn/aOOM1.017 sn/aOOM1.04 GiBn/a
Vector.extract_append._proof_2OOM1.29Kn/aOOM1.012 sn/aOOM916.29 MiBn/a
String.appendOOM1.21Kn/aOOM253.1 msn/aOOM1.01 GiBn/a
Int.gcdOOM823.880n/aOOM252.5 msn/aOOM616.14 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualOOM821.770n/aOOM6.895 sn/aOOM1.73 GiBn/a
Nat.sub_le_of_le_addOOM673.120n/aOOM252.6 msn/aOOM568.05 MiBn/a
Nat.add_commOOM166.670n/aOOM252.0 msn/aOOM457.39 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 431ae38

backends: ooc=execute compile=compile · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · compile — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a3.955 sn/an/a26.67Kn/an/a306.41 MiBn/an/a105492n/an/a10.67 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.87Kn/an/a264.4 msn/an/a1.19 GiBn/a
String.splitn/a6.72Kn/an/a263.8 msn/an/a1.07 GiBn/a
InitStdn/a6.41Kn/an/a13.881 sn/an/a1.47 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.7 msn/an/a858.98 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.10Kn/an/a528.9 msn/an/a1.01 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a774.0 msn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.5 msn/an/a880.31 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.6 msn/an/a815.45 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.6 msn/an/a979.52 MiBn/a
Vector.appendn/a1.95Kn/an/a254.8 msn/an/a667.94 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a254.9 msn/an/a681.33 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.01 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.07 GiBn/a
String.appendn/a1.21Kn/an/a252.8 msn/an/a965.88 MiBn/a
Int.gcdn/a824.190n/an/a252.4 msn/an/a619.82 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a822.230n/an/a6.891 sn/an/a1.72 GiBn/a
Nat.sub_le_of_le_addn/a673.260n/an/a252.5 msn/an/a564.67 MiBn/a
Nat.add_commn/a166.640n/an/a252.0 msn/an/a451.35 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 7d3388b

backends: ooc=execute compile=execute · envs: initStd · set: primary · tier: auto · shard: 0

compile · initStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
InitStdn/a4.352 sn/an/a24.24Kn/an/a306.41 MiBn/an/a105,492n/an/a10.59 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · initStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-rss (main)peak-rss (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.15 GiBn/a
String.splitn/a6.71Kn/an/a263.9 msn/an/a1.05 GiBn/a
InitStdn/a6.41Kn/an/a13.882 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a838.87 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.5 msn/an/a982.43 MiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.9 msn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a2.38Kn/an/a764.7 msn/an/a917.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a764.8 msn/an/a812.00 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.01 GiBn/a
Vector.appendn/a1.96Kn/an/a254.3 msn/an/a659.75 MiBn/a
Nat.gcd_commn/a1.54Kn/an/a253.9 msn/an/a643.67 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a920.13 MiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a978.00 MiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.02 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a853.640n/an/a6.637 sn/an/a1.80 GiBn/a
Int.gcdn/a824.010n/an/a252.4 msn/an/a612.75 MiBn/a
Nat.sub_le_of_le_addn/a673.230n/an/a252.5 msn/an/a568.57 MiBn/a
Nat.add_commn/a166.670n/an/a252.0 msn/an/a467.85 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 1103162

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a4.301 sn/an/a24.53Kn/an/a306.41 MiBn/an/a105,492n/an/a10.61 GiBn/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantthroughput (main)throughput (PR)Δ%check-time (main)check-time (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a6.86Kn/an/a264.6 msn/an/a1.33 GiBn/a
String.splitn/a6.71Kn/an/a264.3 msn/an/a1.12 GiBn/a
InitStdn/a6.30Kn/an/a14.129 sn/an/a1.50 GiBn/a
List.mergeSortn/a5.56Kn/an/a261.4 msn/an/a931.07 MiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a5.09Kn/an/a529.7 msn/an/a1.02 GiBn/a
Char.ofOrdinal_le_of_len/a3.44Kn/an/a773.7 msn/an/a887.48 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a2.38Kn/an/a765.2 msn/an/a841.39 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a2.37Kn/an/a764.7 msn/an/a1.08 GiBn/a
Vector.appendn/a1.96Kn/an/a254.4 msn/an/a669.67 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a1.79Kn/an/a1.015 sn/an/a914.25 MiBn/a
Nat.gcd_commn/a1.53Kn/an/a255.3 msn/an/a657.64 MiBn/a
Array.extract_appendn/a1.52Kn/an/a1.017 sn/an/a1.16 GiBn/a
Vector.extract_append._proof_2n/a1.29Kn/an/a1.012 sn/an/a1.11 GiBn/a
String.appendn/a1.21Kn/an/a253.0 msn/an/a1.08 GiBn/a
Int.gcdn/a823.880n/an/a252.5 msn/an/a607.91 MiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a821.940n/an/a6.893 sn/an/a1.64 GiBn/a
Nat.sub_le_of_le_addn/a673.360n/an/a252.5 msn/an/a547.86 MiBn/a
Nat.add_commn/a166.540n/an/a252.2 msn/an/a435.36 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs b82aed8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.947 sn/an/a26.73Kn/an/a11.24 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.412 sn/an/a8.55Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.404 sn/an/a884.740n/an/a1.91 GiBn/a
Array.extract_appendn/a1.017 sn/an/a1.52Kn/an/a1.25 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.5 msn/an/a3.43Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.09 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.15 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.6 msn/an/a5.07Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a264.7 msn/an/a6.70Kn/an/a1.19 GiBn/a
List.mergeSortn/a262.3 msn/an/a5.54Kn/an/a998.22 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a765.08 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a702.54 MiBn/a
Nat.sub_le_of_le_addn/a253.2 msn/an/a671.490n/an/a601.42 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.01 GiBn/a
Int.gcdn/a252.5 msn/an/a823.710n/an/a636.20 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.730n/an/a484.27 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 930ebb8

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.355 sn/an/a24.22Kn/an/a11.14 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.409 sn/an/a8.55Kn/an/a2.03 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.98 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.23 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.36 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.10 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.20 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.2 msn/an/a5.08Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.8 msn/an/a6.81Kn/an/a1.46 GiBn/a
String.splitn/a265.0 msn/an/a6.69Kn/an/a1.31 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1013.36 MiBn/a
Nat.gcd_commn/a255.0 msn/an/a1.53Kn/an/a891.58 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a745.38 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.13 GiBn/a
Int.gcdn/a252.5 msn/an/a823.670n/an/a762.65 MiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.360n/an/a651.23 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.570n/an/a508.57 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs d69aaee

backends: ooc=execute compile=execute · envs: InitStd · set: primary · shard: 0

compile · InitStd · execute — main from: bencher

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.231 sn/an/a24.93Kn/an/a11.03 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd · execute — main from: ran

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.159 sn/an/a8.76Kn/an/a2.09 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.090n/an/a2.04 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.10 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a939.29 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.4 msn/an/a2.38Kn/an/a1014.35 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.4 msn/an/a2.37Kn/an/a1.25 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.15 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.5 msn/an/a6.82Kn/an/a1.51 GiBn/a
String.splitn/a265.1 msn/an/a6.69Kn/an/a1.25 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a1008.04 MiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a775.05 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a730.16 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.24 GiBn/a
Nat.sub_le_of_le_addn/a252.7 msn/an/a672.780n/an/a616.39 MiBn/a
Int.gcdn/a252.5 msn/an/a823.830n/an/a666.57 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a499.68 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham

Copy link
Copy Markdown
MemberAuthor

!bencher-thresholds-reset all

@github-actionsgithub-actionsBot added the bencher-thresholds-reset:all bencher baseline reset queued on merge label Jul 8, 2026
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset queued for: all — will anchor to the merge commit when this PR merges.

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 8595ee8

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.258 sn/an/a24.78Kn/an/a11.27 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.158 sn/an/a8.76Kn/an/a2.04 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.140n/an/a2.01 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a988.55 MiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.32 GiBn/a
Char.ofOrdinal_le_of_len/a775.3 msn/an/a3.43Kn/an/a1.29 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.05 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.16 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.24 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.9 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.3 msn/an/a6.82Kn/an/a1.38 GiBn/a
String.splitn/a265.4 msn/an/a6.68Kn/an/a1.26 GiBn/a
List.mergeSortn/a261.9 msn/an/a5.55Kn/an/a1004.43 MiBn/a
Nat.gcd_commn/a254.8 msn/an/a1.53Kn/an/a813.46 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a740.42 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.08 GiBn/a
Nat.add_commn/a252.6 msn/an/a166.290n/an/a503.77 MiBn/a
Int.gcdn/a252.5 msn/an/a823.900n/an/a707.26 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.440n/an/a634.98 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 94e942d

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.050 sn/an/a26.05Kn/an/a11.11 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.426 sn/an/a8.54Kn/an/a2.00 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.149 sn/an/a921.510n/an/a1.97 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.13 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.33 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.7 msn/an/a2.37Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a991.18 MiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.22 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.0 msn/an/a5.08Kn/an/a1.20 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.37 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.28 GiBn/a
List.mergeSortn/a262.1 msn/an/a5.55Kn/an/a990.69 MiBn/a
Nat.gcd_commn/a255.1 msn/an/a1.53Kn/an/a776.26 MiBn/a
Vector.appendn/a254.6 msn/an/a1.96Kn/an/a681.59 MiBn/a
String.appendn/a253.0 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.5 msn/an/a673.220n/an/a604.52 MiBn/a
Int.gcdn/a252.5 msn/an/a823.790n/an/a672.67 MiBn/a
Nat.add_commn/a251.9 msn/an/a166.760n/an/a477.46 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 5fa582b

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a3.993 sn/an/a26.42Kn/an/a11.05 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.677 sn/an/a8.34Kn/an/a2.11 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.148 sn/an/a921.570n/an/a1.86 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.12 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.25 GiBn/a
Char.ofOrdinal_le_of_len/a775.1 msn/an/a3.43Kn/an/a1.12 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.18 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a530.7 msn/an/a5.08Kn/an/a1.17 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.6 msn/an/a6.81Kn/an/a1.38 GiBn/a
String.splitn/a265.1 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1.03 GiBn/a
Nat.gcd_commn/a254.7 msn/an/a1.53Kn/an/a855.45 MiBn/a
Vector.appendn/a254.5 msn/an/a1.96Kn/an/a715.77 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a1.04 GiBn/a
Nat.sub_le_of_le_addn/a252.6 msn/an/a673.030n/an/a612.18 MiBn/a
Int.gcdn/a252.5 msn/an/a823.860n/an/a724.20 MiBn/a
Nat.add_commn/a252.2 msn/an/a166.550n/an/a479.64 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@argument-ci-bot

Copy link
Copy Markdown
Contributor

!benchmark — main vs 3c3d090

backends: ooc compile · envs: InitStd · set: primary · shard: 0

compile · InitStd — main from: bencher @ e8dbdb4

constantcompile-time (main)compile-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%env-size (main)env-size (PR)Δ%constants (main)constants (PR)Δ%
InitStdn/a4.039 sn/an/a26.12Kn/an/a11.25 GiBn/an/a306.43 MiBn/an/a105,492n/a

1 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

ooc · InitStd — main from: base run @ e8dbdb4 (not on bencher)

constantcheck-time (main)check-time (PR)Δ%throughput (main)throughput (PR)Δ%peak-ram (main)peak-ram (PR)Δ%
InitStdn/a10.174 sn/an/a8.75Kn/an/a2.05 GiBn/a
Std.Tactic.BVDecide.BVExpr.bitblast.goCache_Inv_of_Inv._mutualn/a6.151 sn/an/a921.220n/an/a1.99 GiBn/a
Array.extract_appendn/a1.018 sn/an/a1.52Kn/an/a1.21 GiBn/a
Vector.extract_append._proof_2n/a1.013 sn/an/a1.29Kn/an/a1.30 GiBn/a
Char.ofOrdinal_le_of_len/a775.2 msn/an/a3.43Kn/an/a1.06 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int16.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.08 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int32.instRxcHasSize_eqn/a765.6 msn/an/a2.37Kn/an/a1.19 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eqn/a765.5 msn/an/a2.37Kn/an/a1.12 GiBn/a
ByteArray.utf8DecodeChar?_utf8EncodeChar_appendn/a531.3 msn/an/a5.08Kn/an/a1.14 GiBn/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int8.instRxcHasSize_eqn/a266.4 msn/an/a6.82Kn/an/a1.30 GiBn/a
String.splitn/a265.2 msn/an/a6.68Kn/an/a1.29 GiBn/a
List.mergeSortn/a262.0 msn/an/a5.55Kn/an/a1012.01 MiBn/a
Nat.gcd_commn/a254.9 msn/an/a1.53Kn/an/a783.17 MiBn/a
Vector.appendn/a254.4 msn/an/a1.96Kn/an/a736.90 MiBn/a
String.appendn/a252.9 msn/an/a1.21Kn/an/a956.42 MiBn/a
Int.gcdn/a252.4 msn/an/a824.030n/an/a669.97 MiBn/a
Nat.sub_le_of_le_addn/a252.4 msn/an/a673.580n/an/a605.84 MiBn/a
Nat.add_commn/a252.0 msn/an/a166.690n/an/a482.89 MiBn/a

18 constants · 0 regressed · 0 improved (|Δ| > 3.0% on any metric).

⚠️ no main-side results (base run failed — see the workflow logs).

Workflow logs

@samuelburnham
samuelburnham marked this pull request as ready for review July 8, 2026 21:46
arthurpaulino
arthurpaulino previously approved these changes Jul 9, 2026
Lowering the witness cap below Zisk's built-in default (10) was measured to
have a negligible effect on host RAM and prove time for the kernel typecheck
workload, so the CLI override (which defaulted to 5) is removed and the prover
uses EmbeddedOpts::default(). Drop the now-stale flag mentions and per-RAM
tuning guidance from the README, the cost-model doc, and the shard.rs model
comments.
Rebased onto main (post #411 + #459) and integrated with the renamed
bench-main.yml and reworked bencher-track interface.
- Benchmarks/Vectors.csv: single shared source of truth (71 library constants
from Init/Std/Mathlib/Lean). Consumed by Aiur (bench-typecheck --manifest),
the zkVM hosts, and shell.
- bench-pr.yml: `!benchmark [aiur] [zisk] [sp1|all] [execute|prove]` over the
curated set, posting a main-vs-PR table; main results cached by base SHA.
Hardened: comment body from env (no injection), allowlisted env parsing.
- .github/scripts/{bench.py,run.sh}: parse/manifest/compare/comment, and the
compile-.ixe + backend driver (cycles/execute-time/throughput/peak-rss, plus
shards/max-shard-cycles for sharded runs).
- .github/actions/install-{sp1,zisk}: shared zkVM toolchain + deps install,
used by bench-pr.yml, bench-main.yml, and riscv-bench.yml.
- bench-main.yml: add zkvm-execute (Zisk/SP1 cycle counts + time/RAM) and
native-check (native parallel `ix check --anon` throughput) jobs, using the
new bencher-track workload/thresholds interface.
- bench-typecheck: add --constant / --skip-deps (align with the zkVM hosts;
--skip-deps replaces --subject-only) and --execute-only (fast execute path).
issue_comment workflows only run from the default branch, so the `!benchmark`
path can't be exercised on a PR branch. Add a pull_request trigger (base/head
from the PR payload; empty comment → parser defaults) to test pre-merge.
Revert before merge — delete the `pull_request:` trigger; the dual base/head
resolution and `|| pull_request.number` fallbacks are harmless to keep.
Revert the cgroup mode (and the earlier RLIMIT_DATA layer): back to the
plain tree-RSS sampler, sudo-free and identical everywhere. The burst
problem is handled by cadence instead of a kernel cap: sampling drops
from ~1s to 0.2s once the tree is within 20 GB of the ceiling (100 GB
at the default 120), and the post-TERM grace re-checks every 0.2s,
KILLing immediately while the tree is still at the ceiling. Worst-case
overshoot shrinks from GB-per-second x seconds to x ~0.4s.
ix bench run still hard-fails when the watchdog script is missing — an
unenforced ceiling is not a benchmark run.
The flat 120 was a leftover from the RLIMIT_DATA era (a VA cap needed
fixed slack above RSS); for the sampler it protects nothing on machines
with less RAM and leaves ~3 GB of headroom on the 123 GiB runner. Back
to MemTotal minus 12 GiB (runner: 111; 64 GiB workstation: 52), which
the adaptive fast-cadence zone sits under wherever the run happens.
Same lesson aiur taught: shared measure names (peak-rss, throughput)
mean that mode's phase, so a future zisk/sp1 prove mode needs its own
testbed — and an unsuffixed zisk-check silently meaning "execute only"
is the asymmetry we just cleaned up for aiur. Renaming now rides the
merge's existing bencher migration (console rename + reset-all) instead
of paying a second cycle later.
The zkvm job derives testbed/workload from the cell's mode, so a prove
cell would land on zisk-check-prove-x64-32x with no workflow edits.
The per-cell .ixe cache only helped re-runs: on a fresh commit every
same-env cell missed the cold cache simultaneously and paid its own ix
compile in parallel. A prepare job (matrix over ci parse's new
prep-envs output — envs consumed by non-compile cells) now compiles
each .ixe once and publishes it under the key the cells already
restore, so cells start warm. Skipped for compile-only requests, whose
cells compile fresh by design; a prepare failure stops the cells (they
would just re-fail the same compile lazily).
Two more runner deaths, two measured causes:
1. aiur prove crossed the ceiling by 13 GB inside one 0.2s sample —
first-touch of pre-reserved prover buffers grows RSS at memory
bandwidth, which no cadence outruns. Headroom widens to 24 GiB (the
~123 GiB runner's ceiling drops 111 → 99) so the worst measured
overshoot plus OS/agent fits, and the sampler now TERMs on a
one-sample linear projection (level + last delta), buying back one
sample of reaction time — verified live: the kill fires before the
ceiling is crossed on a steep ramp.
2. zisk died at a nominal 0.4 GB over: the ASM services' locked shared
segments are under-attributed by per-process RSS. /dev/shm usage now
counts into the tree total.
…tion
Everything hairy in the sampler (two ps/awk tree walks, the /dev/shm
add-on, adaptive cadence, trajectory projection, conditional grace)
existed to reconstruct a number the kernel already publishes:
/proc/meminfo MemAvailable, its own estimate of what can be allocated
without thrashing. It natively accounts for everything the tree
consumes (RSS, locked shm, page tables) plus everything else on the
host, and correctly ignores reclaimable page cache.
The watchdog now kills the tree when MemAvailable < MemTotal - ceiling,
at a fixed 0.25s cadence (a meminfo read is ~free, so no adaptive zone)
with a plain TERM -> 2s -> KILL (rows are flushed continuously; the
grace was only ever for destructors). The floor never drops below 4 GiB
so an oversized ceiling still protects the host, and a machine without
/proc/meminfo is refused loudly. ~40 lines shorter, and strictly harder
to fool than the tree-RSS sum it replaces.
…ottery
A 50-run log sweep showed the ubuntu-latest build hosts hand out 4 CPU
models, baking AVX-512 into the -Ctarget-cpu=native binaries on only
~18% of builds — main's history randomly flipped Plonky3 codepaths
between pushes, and main-vs-PR comparisons crossed ISAs ~30% of the
time. The warp fleet is CPU-uniform (AMD EPYC 9R45 / Intel, all
AVX-512), so building there makes the ISA deterministic AND faster.
Every job that runs the binaries moves with the build (a non-AVX-512
GitHub host would SIGILL): bench-main's plan, bench-pr's build (parse)
and assemble (report). setup/comment/thresholds-reset run no ix and
stay on ubuntu-latest. The Log build CPU step stays, as the check that
a regression wasn't a fleet change.
The cache-hit and cache-miss branches each carried their own
lean-action step (build vs provision-only); a computed build flag
collapses them — miss builds, hit provisions the toolchain the
restored binaries need.
The 24 GiB headroom killed the Mathlib compile 3 GB from completion
(machine-wide usage ~99.6 GB vs the 99 ceiling): that headroom is sized
for the aiur prover's memory-bandwidth bursts (~13 GB between samples),
while ix compile grows build-paced at a few GB/s and legitimately peaks
near 100 GB. One number can't serve both on a 123 GB machine, so the
headroom moves into the registry per backend: 24 GiB default (provers),
12 for compile (runner ceiling 111, ~11 GB above the measured Mathlib
peak, floor still 4x its worst per-sample growth).
With the MemAvailable watchdog, the per-backend headroom machinery
reduces to one number: 110 sits above the largest legitimate workload
(Mathlib ix compile, ~100 GB) and leaves a ~13 GB free floor on the
~123 GiB runner; the script's 4 GiB minimum floor keeps smaller
machines protected when the default exceeds their RAM. Deletes the
headroomGb registry field and the /proc/meminfo parsing in Lean.
Derived again (a flat 110 protects nothing on smaller machines and
tracks nothing when the runner class changes): MemTotal - 15 puts the
~123 GiB runner at ~108, above Mathlib ix compile's ~100 GB peak, with
the 15 GB as the MemAvailable kill floor. Same rule for every backend.
The serialized env size wiggles slightly run-to-run, so the 0/0 pin
alerts on noise. A 1% band still catches real serialization-format
regressions (~32 MB on Mathlib) while tolerating the wiggle. constants
stays pinned — the count is deterministic. That the .ixe is not
byte-reproducible at all is worth its own investigation for a
content-addressed store; noted in the threshold comment.
Replaces the avx512f present/absent binary with the full avx2/avx512*
flag list from cpuinfo (or 'absent'), so a regression can be traced to
exactly which extensions the build host offered.
plan (ci matrix) and assemble (bench report) never execute the Rust
objects where the warp build's AVX-512 lives — Lean code is compiled by
leanc at baseline ISA, and Rust has no life-before-main initializers.
Each job's comment records the assumption: move back to warp if ix
startup or these subcommands ever touch the FFI. The build/prepare/
benchmark/compile jobs keep warp (they compile with target-cpu=native
or execute the prover FFI).
Validated on both ubuntu-latest and warp runners (ix-cpu-info's
cgroup-memcap.yml): systemd-run --user --scope -p MemoryMax=<G>
-p MemorySwapMax=0 hard-caps the tool's cgroup; the kernel OOM-kills at
the ceiling with SIGKILL (exit 137, the orchestrator's OOM signal). No
sampler cadence to race, no tree to sum, no burst arithmetic — the
cgroup charges the whole tree's resident memory and cached allocator
reservations don't count.
The script shrinks to an exec: a passwordless-sudo enable-linger boots
the user manager on CI (no-op locally where a session provides one),
XDG_RUNTIME_DIR is defaulted, and systemd-run replaces the process. No
fallback: without a user bus it fails loudly (exit 1 -> the cell
aborts).
bench-main runs on pushes to main only again; bench-pr is
issue_comment-only — the pull_request trigger, its fixed test command,
the head-ref gate, and the || fallbacks in concurrency/SHA-resolution/
comment-target all go with it. The OOM enforcement and both workflows
were verified end to end from this branch before the revert.
The zisk shard-plan run for the heavy bitblast block exposed the hole:
a plain systemd scope doesn't set memory.oom.group, so at the cap the
kernel killed only the biggest process — Zisk's ASM MT service — and
the surviving host converted the memory kill into a clean exit 1, which
the orchestrator (correctly) treats as a deterministic failure and
aborts the cell instead of recording the oom row this expected-OOM
constant should produce.
The wrapper now writes memory.oom.group=1 on the scope's cgroup (user-
delegated, no sudo) before exec'ing the tool: breach -> the whole tree
dies with SIGKILL -> exit 137 -> oom row, same semantics the sampler
era had. Failure to set it exits 2 rather than running with
single-victim kill semantics.
One-off runs no longer need a names file: --consts takes the same
comma-separated grammar as the tools, unioned with --names-file via
ConstsFile.gather (the machinery every other consumer already uses).
…lace name files
- ix bench run/shard take --ixe <path> (must exist, used as-is; no flag
= compile fresh) instead of the magic reuse-if-present flag. The
workflows pass the cache-restored path explicitly; bench-pr guards
with [ -f ] so a missed cache still compiles rather than failing.
- ix bench run drops --names-file: --consts (comma-separated, the
tools' grammar) is the one selection override. bench-pr's targeted
base run builds the list with paste -sd, from fetch-main's
missing-out file.
- fetch-main gains --consts alongside the workflow-facing --names file
(unioned), so the local compare-vs-main flow needs no temp files.
…ompile
The prepare job compiled the .ixe for the prover cells while a
compile-backend cell compiled the same env again for measurement. The
renamed compile job (prepare was ambiguous) now runs for every
requested env and serves both purposes: it publishes the .ixe the
prover cells restore, and its measured row is published too
(bench-pr-row-<sha>-<env>) for the compile cell to reuse as its PR side
— same runner class, same binaries, same command. A row-cache miss just
means the compile cell compiles and measures itself, as before.
ci parse's prep-envs output simplifies to envs (all requested envs).
The rss-sampler/json-sink additions this branch relied on landed
upstream in argumentcomputer/tracing-texray; pin the merged commit
465bbca in place of the pre-merge fork rev.
@samuelburnham
samuelburnham merged commit 49945d1 into mainJul 9, 2026
17 of 18 checks passed
@samuelburnham
samuelburnham deleted the sb/ci-benchmarks branch July 9, 2026 18:10
@github-actions

Copy link
Copy Markdown

♻️ Baseline reset to 49945d1 for: aiur-check-execute aiur-check-prove ix-compile ooc-check sp1-check-execute zisk-check-execute

samuelburnham added a commit that referenced this pull request Jul 10, 2026
* bench: curate Vectors.csv by measured workload distinctness
Local aiur prove runs plus per-constant closure profiles (targets,
ingress bytes, fft-cost) showed a third of the cheap tier measuring
the same thing:
- drop the base-cost floor duplicates (3-9 constant closures, <13 kB,
prove within noise of each other): Acc.rec, Trans.mk, Sum.elim,
Prod.map, Option.bind, Array.toList — Eq.rec stays as the recursor
representative, Except.bind for monadic bind, WellFounded.fix for
recursion combinators;
- drop Nat.toDigits (strictly inside Nat.repr's closure), Array.filter
and Array.foldlM (within 1.5x of Array.map, which stays), Int.add
(scale twin of primary Nat.add_comm; Int is covered by emod/gcd);
- drop the Int8/Int16/Int32 instRxcHasSize_eq triplets (byte-identical
siblings of the kept Int64) and the trivials Nat, HEq, HEq.rec,
Nat.add;
- add Std.HashMap as HEAVY: 1,982-constant closure, 2.28 MB ingress,
84.6 s / 49 GiB / 18.4B FFTs proved locally — 6-40x every cheap
constant on every axis.
The prove-feasible full set is now 20 constants spanning recursors,
WF recursion, monadic bind, List/Array, Nat/Int/BitVec/USize
arithmetic, decidability, bytes/strings, hashing, and (via the heavy
tier) big structures.
* fix(bench): align tracing-texray pins with the root workspace
The zisk and sp1 hosts pinned tracing-texray at an older rev than the
root workspace (bumped in #467), so cargo linked TWO instances of the
crate into each host: main() started one instance's RSS sampler while
ix_bench::peak_rss_bytes() read the other's never-started one — always
None — and the resulting null was dropped by `ix bench bmf`'s
numeric-fields filter. Net effect: every zisk upload silently lost
peak-rss (parent and per-shard rows alike) since the pin diverged.
Align both hosts on the root rev and re-lock; cargo tree confirms a
single shared instance, so the sampler the host starts is the one the
row emission reads.
* bench: zisk rows report constants and shards
constants = the named constants certified over the checked closure —
the pre-shard input set, the same universe the aiur rows count via
closureFrom. The cheap paths emit the cover size; the shard-plan path
emits `needed` (targets this run answers for), computed before shard
partitioning and store-reuse filtering, so neither sharding overhead
nor covered-shard skips distort it. Anon-work dedup shrinks the WORK
item count, never this number; sharding's extra work stays visible in
cycles/execute-time where it belongs.
shards was already emitted on shard-plan rows; a non-sharded execute
now reports 1 (a single leaf IS one shard) instead of omitting the
field and rendering n/a in the compare table.
bench-main pins constants 0/0 on the zkvm testbeds like the other
cells: it is deterministic, and a drop means lost coverage, not a win.
* bench: compare-table and !benchmark upgrades
- aiur prove cells report throughput (constants/prove-time was already
uploaded and thresholded; the registry column list just omitted it —
every other cell follows the time/throughput/peak-rss convention).
- zisk compare tables gain constants and shards columns, next to cycles.
- The per-constant phase drill-downs are now opt-in via BENCH_PHASES=1
(a passthrough config key): the spans are noisy and dynamically
named, so the default comment stays at the headline measures.
- KEY=VALUE config parses inline on the command line too, whitespace-
separated — the single-line form for bench-pr.yml's manual
workflow_dispatch, whose input box cannot hold newlines. Inline keys
are strict (an unknown key rejects, like a typo'd backend); config
lines stay lenient since comment prose contains `=`.
* bench: `ix bench plots` — registry-driven bencher dashboard sync
One plot per (testbed, measure) bench-main tracks, one line per
benchmark row the cell uploads, plus the cross-kernel input-constants
overlay (aiur and zisk report the same pre-shard closure count, so the
paired lines must coincide — separation is a coverage-drift tripwire).
Titles, dashboard ordering, redundancy skips, and canonical measure
units live here as typed data; the spec derives from the registry +
Vectors.csv, so nothing is hand-listed.
Idempotent, keyed by title: matching plots are kept (index
re-asserted), stale ones deleted and recreated (the plot PATCH endpoint
only takes index/title/window), hand-pinned ones untouched. The sync
also asserts measure units — bencher auto-creates measures with
placeholder units on first upload, leaving plots unitless.
All bencher.dev traffic goes through the bencher CLI; --dry-run
previews with no key. bencher-plots.yml dispatches it manually (like
bencher-thresholds-reset) off the freshest bench-bins cache: run it
after a registry change has merged AND bench-main has built it — the
registry is compiled into the binary, and a new constant only gets its
plot line once its first rows upload.
* fix(ci): bench-pr Mathlib env — mathlib lives in the Benchmarks/Compile subpackage
BENCH_ENVS=Mathlib died at 'Get Mathlib Cache' with 'unknown executable
cache': use-mathlib-cache runs `lake exe cache get`, and mathlib is a
dependency of the Benchmarks/Compile subpackage, not the root workspace
lean-action was pointed at. bench-main had this right; bench-pr now
mirrors it:
- compile job: provision from Benchmarks/Compile (same toolchain as
root) and `lake build Compile<env>` before the measured compile;
- benchmark cells: no mathlib cache at all — the .ixe comes from the
compile job, and the lazy Mathlib fallback fails loudly rather than
fetching oleans it still couldn't build;
- base side: the build action stays on the base root (it builds ix);
a separate step fetches/builds base mathlib oleans in the subpackage
when a Mathlib cell must re-run the base.
* ci: bench-pr cells fail on a compile-cache miss instead of recompiling
The benchmark cells carried two lazy fallbacks for artifacts the
compile job publishes in the same run: a missing compile row made the
compile cell re-measure the compile in-cell, and a missing `.ixe` made
`ix bench run` recompile the env fresh. Neither could ever work for
the Mathlib env (its oleans live only in the compile job's subpackage
provisioning), so the fallbacks meant InitStd and Mathlib failed
differently for the same infrastructure problem.
Both restores are now fail-on-cache-miss and the run step always
passes `--ixe`: the artifacts were published moments earlier, so a
miss is an infrastructure failure and every env fails the same way,
loudly, at the restore step. The in-cell "Save PR .ixe" step goes with
the fallback that produced it.
* bench: throughput means constants per second on every backend
The zkVM hosts uploaded cycles/second under the same `throughput` slug
every other cell used for constants/second, so the shared measure had
no honest unit (and the dashboard showed a generic "per second"). The
hosts now report constants/second like everyone else — cheap zisk rows
over the certified cover, shard-plan rows over the pre-shard `needed`
set, sp1 over its checked count (its stdout already printed this
number; the row disagreed) — via one shared `ix_bench::throughput`
calculator. A zkVM's cycle rate stays derivable from its `cycles` and
`execute-time` fields.
The bencher measure's canonical units become "constants / second".
NB: the first post-merge zisk upload drops throughput by orders of
magnitude (meaning change, not a regression) — reset the
zisk-check-execute baseline (!bencher-thresholds-reset) right after,
or the 10% lower bound alerts.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bencher-thresholds-reset:allbencher baseline reset queued on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@samuelburnham@arthurpaulino@github-advanced-security