clj-kondo 2026-07-21

holy moly... I was checking if I had made any perf regressions during the type inference work. this is what 🤖 found...

Root cause found — and it's neither of the things we assumed

fd59d3da pushed extract-bindings::invokeStatic from 7429 → 8685 bytecodes, across HotSpot's 8000-byte HugeMethodLimit. Methods over that limit are silently never JIT-compiled — they run interpreted for the entire lint. The method fell off the JIT cliff, and the added inference work is expensive only because it landed in a method that stopped being compiled.

Proof: with -XX:-DontCompileHugeMethods, the regression vanishes — HEAD 2320ms ≈ parent 2343 ≈ baseline 2318. It also explains why my three earlier fix attempts recovered exactly nothing: none of them shrank the method back under 8000.

The much bigger finding

That flag alone takes a metabase lint from 3828 → 2320ms (−39%), and it does so at baseline too (3657 → 2318). This is long-standing, not new. Five methods are over the limit and running interpreted:

┌──────────────────────┬───────────┬────────────────────────────────────┐
│        method        │ bytecodes │                                    │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ lint_var_usage       │ 35886     │ 4.5× the limit; #1 self-time frame │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ analyze_call         │ 25857     │ #3 self-time frame                 │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ analyze_expression** │ 9323      │ #2 self-time frame                 │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ extract_bindings     │ 8685      │ just over — the regression         │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ analyze_input        │ 8239      │                                    │