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>
This commit is contained in:
Aaron Tomb 2024-10-23 01:20:15 -07:00 committed by GitHub
parent c1143d9432
commit 45b1b367ca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 465 additions and 0 deletions

459
tests/bench/big_do.lean Normal file
View file

@ -0,0 +1,459 @@
/-!
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

View file

@ -362,3 +362,9 @@
run_config:
<<: *time
cmd: lean bv_decide_inequality.lean
- attributes:
description: big_do
tags: [fast]
run_config:
<<: *time
cmd: lean big_do.lean