lean4-htt/tests/bench
Sebastian Graf 4cd7a85334
test: speed up Sym mvcgen by doing fewer redundant program matches (#12712)
This PR changes the spec lookup procedure in Sym-based mvcgen so that

1. Spec candidates are sorted first before being filtered
2. Instead of filtering the whole set of candidates using
`spec.pattern.match?`, we take the first match with the highest
priority.

The second point means we will do a lot fewer matches when the highest
priority spec matches immediately. In this case, the one match is still
partially redundant with the final application of the backward rule
application. It would be great if could somehow specialize the backward
rule after it has been created. Still, this yields some welcome
speedups. Before and after for each.

```
vcgen_add_sub_cancel:
goal_1000: 865 ms, 1 VCs by grind: 228 ms, kernel: 435 ms
goal_1000: 540 ms, 1 VCs by grind: 229 ms, kernel: 426 ms

vcgen_ping_pong:
goal_1000: 458 ms, 0 VCs, kernel: 431 ms
goal_1000: 454 ms, 0 VCs, kernel: 443 ms (unchanged, because there is only ever one candidate spec)

vcgen_deep_add_sub_cancel:
goal_1000: 986 ms, 1 VCs by grind: 234 ms, kernel: 735 ms
goal_1000: 728 ms, 1 VCs by grind: 231 ms, kernel: 708 ms

vcgen_reader_state:
goal_1000: 746 ms, 1 VCs by sorry: 1 ms, kernel: 803 ms
goal_1000: 525 ms, 1 VCs by sorry: 1 ms, kernel: 840 ms
```
2026-02-27 03:24:34 +00:00
..
build chore: switch to new test/bench suite (#12590) 2026-02-25 13:51:53 +00:00
mergeSort chore: relative lean-toolchains (#12652) 2026-02-25 10:23:35 +00:00
mvcgen test: speed up Sym mvcgen by doing fewer redundant program matches (#12712) 2026-02-27 03:24:34 +00:00
qsort chore: relative lean-toolchains (#12652) 2026-02-25 10:23:35 +00:00
size chore: switch to new test/bench suite (#12590) 2026-02-25 13:51:53 +00:00
sym feat: improves simpArrowTelescope simproc (#12153) 2026-01-25 22:29:38 +00:00
.gitignore chore: switch to new test/bench suite (#12590) 2026-02-25 13:51:53 +00:00
accumulate_profile.py
arith_eval.ml
binarytrees.ghc-6.hs
binarytrees.ocaml-2.ml
binarytrees.st.hs
binarytrees.st.mlton-2.sml
binarytrees.st.sml
binarytrees.st.swift
binarytrees.swift
binarytrees5.ml
binarytrees5_multicore.ml
compile.sh
const_fold.hs
const_fold.ml
const_fold.sml
const_fold.swift
cross.yaml
dag_hassorry_issue.lean chore: re-enable tests (#10923) 2025-10-23 08:38:57 +00:00
dag_hassorry_issue.lean.args
dag_hassorry_issue.lean.expected.out chore: re-enable tests (#10923) 2025-10-23 08:38:57 +00:00
delayed_assign.lean test: delayed assignment performance issue (#12201) 2026-01-28 02:08:39 +00:00
deriv.hs
deriv.ml
deriv.sml
deriv.swift
flake.lock
flake.nix
full-stdlib.exec.yaml feat: separate benchmark for profiling the stdlib per-file 2020-10-29 11:53:03 +01:00
ghc-gc.py
lean-gc.py
Makefile
mlkit-gc.py
ocaml-gc.py
perf.py
qsort.hs
qsort.ml
qsort.sml
qsort.swift
rbmap.hs
rbmap.ml chore(tests/bench): move out from playground/ 2019-05-29 16:33:50 +02:00
rbmap.sml
rbmap.swift
rbmap2.lean
rbmap3.lean
rbmap500k.lean
rbmap_checkpoint.hs
rbmap_checkpoint.ml
rbmap_checkpoint.sml
rbmap_checkpoint.swift
rbmap_checkpoint2.lean
rbmap_checkpoint2.sml
rbmap_checkpoint_cpp_lean3.cpp
rbmap_checkpoint_cpp_std.cpp
rbmap_cpp_lean3.cpp
rbmap_cpp_std.cpp
README.md
report.py
run.sh
speedcenter.yaml
states35.lean
test_single.sh
unionfind_clean.lean

Lean Benchmark Suites

This folder contains multiple small Lean programs for benchmarking used by two separate benchmark suites based on the temci benchmarking tool:

  • The light-weight "Speedcenter" suite benchmarks the current build of Lean. It can be used for quick comparisons on the cmdline and powers the Lean Speedcenter website.
  • The heavy-weight "Cross" suite benchmarks multiple Lean configurations and other functional compilers against each other and generates CSV and HTML reports from that. It was created for the paper "Counting Immutable Beans - Reference Counting Optimized for Purely Functional Programming" (IFL19).

Speedcenter Suite

Requirements:

  • A local Lean build in ../../build/release. Build at least the bin target.
  • temci. Using Nix, open a nix-shell in the project root directory to add a compatible version to your PATH. Alternatively, try pip3 install git+https://github.com/parttimenerd/temci.git.

To execute the suite and save the results in base.yaml, run (in this folder)

temci exec --config speedcenter.yaml --out base.yaml

Other interesting exec flags:

  • use --runs N to modify the default number of 10 runs per benchmark
  • use --included_blocks fast to excluded slow benchmarks like the stdlib benchmark. You can replace fast with any benchmark name or label in speedcenter.exec.yaml.

If you have multiple saved result files, you can compare them with

temci report --config speedcenter.yaml report1.yaml report2.yaml ...

Cross Suite

We recommend using Nix for building/obtaining all Lean variants and used compilers in a reproducible way. After installing Nix, running the benchmarks is as easy as

nix develop
make

This will record 50 runs for each benchmark configuration (this can be changed with runs in cross.yaml), generate results in report_lean.csv and report_cross.csv, and print them to stdout in a tabulated format. It will also generate HTML reports in report/ comparing the time-based benchmarks.

In order to reduce noise in the benchmarking data, you may instead want to try calling make inside a temci shell:

temci short shell --sudo --preset usable --cpuset_active make

Using root powers, this will temporarily configure your machine similarly to the LLVM benchmarking recommendations and move all your other processes to a single CPU core.