lean4-htt/tests/bench/big_do.lean
Aaron Tomb 45b1b367ca
test: add a benchmark that is slow to elaborate (#5656)
Add an example Lean file that includes an unusually large definition
that takes a long time to elaborate.

It may be that it's difficult to process it more efficiently, but
perhaps someone will discover a way to improve it if it's in the
benchmark suite. Improved performance on this benchmark will likely make
some program analysis and verification tasks within Lean more feasible.

---------

Co-authored-by: Sebastian Ullrich <sebasti@nullri.ch>
2024-10-23 08:20:15 +00:00

459 lines
15 KiB
Text

/-!
This benchmark exercises
* general elaboration, likely from many nested lambdas
* code generation, ditto
-/
set_option maxRecDepth 10000
def addALot (x: Nat) : StateM Nat Nat := do
set x
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
modifyGet (λ y => ((), y + x))
let y <- get
pure y
#eval StateT.run' (addALot 2) 0