perf: fix quadratic scaling in unused variable linter#12843
Closed
perf: fix quadratic scaling in unused variable linter#12843
Conversation
This PR fixes a quadratic performance issue in the unused variable linter that was exposed by a benchmark with many implicit parameters from https://github.com/JacquesCarette/BenchmarkingProofAssistants. The linter previously called `findStack?` once per variable definition, resulting in O(n·m) cost for n unused variables in a syntax tree with m leaves. This is replaced by a single batch traversal (`findStacks`) that collects all syntax stacks at once. Additionally, macro expansion info tree traversal is now skipped entirely when no macro expansions are present. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Collaborator
Author
|
!radar |
|
Benchmark results for f9aeed3 against 333ab1c are in! @nomeata
Small changes (44🟥) Too many entries to display here. View the full report on radar instead. |
Collaborator
Author
|
Overall a mild regression, and the problem this fixes (many unused implicit variables or something) is likely not relevant in practice. Closing until something shows it is. |
Collaborator
|
Reference manual CI status:
|
mathlib-nightly-testing bot
pushed a commit
to leanprover-community/batteries
that referenced
this pull request
Mar 9, 2026
mathlib-nightly-testing bot
pushed a commit
to leanprover-community/mathlib4-nightly-testing
that referenced
this pull request
Mar 9, 2026
|
Mathlib CI status (docs):
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR fixes a quadratic performance issue in the unused variable linter
that was exposed by a benchmark with many implicit parameters from
https://github.com/JacquesCarette/BenchmarkingProofAssistants. The linter
previously called
findStack?once per variable definition, resulting inO(n·m) cost for n unused variables in a syntax tree with m leaves. This is
replaced by a single batch traversal (
findStacks) that collects allsyntax stacks at once. Additionally, macro expansion info tree traversal
is now skipped entirely when no macro expansions are present.
Co-Authored-By: Claude Opus 4.6 noreply@anthropic.com