Stop traversing whole subtrees to decide if syntax is one line or many#841
Draft
jackfirth wants to merge 1 commit into
Draft
Stop traversing whole subtrees to decide if syntax is one line or many#841jackfirth wants to merge 1 commit into
jackfirth wants to merge 1 commit into
Conversation
`oneline-syntax?` and `multiline-syntax?` were implemented by counting every distinct source line among all the atoms in a syntax object, using a `syntax-search` stream fed through a rebellion transducer pipeline. Neither caller needs an exact count, and both build a lazy stream over the entire subtree even when the second line is found immediately. Counting directly with a recursive traversal that stops at two distinct lines cuts analysis time for `xrepl-lib/xrepl/xrepl.rkt` (1877 lines) from ~78 seconds to ~65 seconds. The traversal deliberately mirrors `syntax-search`'s shape, including its handling of improper lists and its treatment of non-list, non-atom syntax (such as vectors) as having no lines at all. Both implementations were run against every subform of several large source files, plus hand-built edge cases, with identical results on all 28,585 syntax objects. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Resyntax analyzed 1 file in this pull request and found no issues.
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.
oneline-syntax?andmultiline-syntax?counted every distinct source line among all the atoms in a syntax object, streaming the whole subtree through a transducer pipeline. Neither caller needs an exact count, and both build the full stream even when the second line turns up immediately.Counting with a direct traversal that stops at two distinct lines takes analysis of
xrepl-lib/xrepl/xrepl.rkt(1877 lines) from ~71s to ~63s.The new traversal deliberately mirrors
syntax-search's shape, including how it handles improper lists and how it treats non-list, non-atom syntax (vectors, say) as having no lines at all. I ran both implementations over every subform of several large source files plus some hand-built edge cases and got identical answers on all 28,585 syntax objects.raco test -p resyntaxpasses.Found by profiling, in the same vein as #800.
Measurement note: figures are the minimum of 3 runs after a warmup. An earlier version of this description said ~78s → ~65s; that baseline was taken on a thermally throttled machine and overstated the ratio. Repeated runs on identical code vary by up to ~6% here, so treat differences smaller than that as unresolved.