Lean Kernel Arena / perf/app-lam

Test "perf/app-lam"

Expected: 👍 accept · Size: 1.2 MB · Lines: 28.6 k · lean4export: 3.1.0 · Lean: 4.29.1 · Timeout: 1.7 m · 📄 Declaration · 🔗 Source

A synthetically generated term with n levels of alternating applications and lambdas, with DAG sharing.

At each level, a constant is applied to two identical lambda arguments. The export format records these as a single shared expression (DAG). Each lambda body grows with the nesting depth, referencing all enclosing binders.

This tests two aspects of checker performance:

Infer cache: Since both arguments at each level are the same expression, a checker without an infer cache re-infers the type of each shared subterm, doubling work at every level — O(2ⁿ) total.

Substitution cost: Even with a cache, type-inferring each lambda requires substituting into its body (size O(n)) at each of the n levels, giving O(n²) total. Whether this cost arises depends on the checker's binder representation.

Checker Result ⏱️ 🧠
mathgraph 👍 966 ms (÷5.0) 299.3 MB (÷4.8)
sokonanoda 👍 966 ms (÷5.0) 301.3 MB (÷4.7)
nanoclo 👍 13 ms (÷384) 85.6 MB (÷17)
con-ron 👍 12.2 s (×2.5) 4.7 GB (×3.4)
lazylean 👍 2.4 s (÷2.1) 77.6 MB (÷18)
nanoda 👍 4.3 s (-11%) 2.1 GB (+48%)
nanobruijn 👍 33 ms (÷149) 36.8 MB (÷39)
con-leche 👍 12.4 s (×2.5) 2.7 GB (+91%)
eink0rn 👍 54 ms (÷90) 62.6 MB (÷23)
ind-models 👍 4.9 s (+2%) 1.4 GB (+3%)
official 👍 4.9 s (0%) 1.4 GB (0%)
lean4lean 👍 4.9 s (+1%) 1.4 GB (+2%)
tenet 👍 5.8 s (+18%) 1.7 GB (+20%)
nanoclo-fortran 👍 53 ms (÷91) 35.2 MB (÷41)
lean4cobol ⌛ 0 ms 0 B
evmlean 🚫 305 ms 106.6 MB
mini 💥 34.8 s 78.2 MB
overfull 💥 1.8 m 50.1 MB
kiota 👍 160 ms (÷30) 261.5 MB (÷5.5)
canonical-min 🚫 474 ms 1.1 GB
rpylean 👍 220 ms (÷22) 117.8 MB (÷12)
vow-lean-kernel 💥 1.2 m 19.6 MB
official-v4.28.0 👍 5.3 s (+10%) 1.4 GB (+1%)
still-nanoda 👍 3.9 s (-20%) 2.1 GB (+48%)
nyaya 💥 4.5 s 716.4 MB
parse-only 👍 96 ms (÷51) 73.6 MB (÷19)