Skip to content

Optimize Lrama parser generation performance - #794

Open
ydah wants to merge 5 commits into
ruby:masterfrom
ydah:optimize-lrama-performance
Open

Optimize Lrama parser generation performance#794
ydah wants to merge 5 commits into
ruby:masterfrom
ydah:optimize-lrama-performance

Conversation

@ydah

@ydah ydah commented Jun 18, 2026

Copy link
Copy Markdown
Member

This PR optimize Lrama parser generation performance.

Metric Before After Improvement
wall time 1.01713s 0.68659s 32.50%
parse parse.y 0.10654s 0.03253s 69.47%
compute_look_ahead_sets 0.35790s 0.11970s 66.55%
compute_la 0.20755s 0.01652s 92.04%

@ydah
ydah marked this pull request as ready for review July 5, 2026 08:48
@ydah
ydah requested a lite review from Copilot September 4, 2026 22:09

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The changes are localized performance optimizations with preserved semantics (plus slightly safer handling in a few edge paths) and include appropriate cache invalidation.

Pull request overview

This PR focuses on reducing Lrama parser-generation time by avoiding repeated linear scans and repeated regexp compilation during grammar parsing and lookahead computation.

Changes:

  • Speed up lookahead computation by iterating only existing lookback relations and caching rule lookup by id.
  • Speed up state transitions by caching transitions in a symbol.number -> transition hash and using it for State#transition.
  • Speed up lexing by precompiling frequently used regex patterns and reducing repeated instance-variable access in lex_c_code.
File summaries
File Description
sig/generated/lrama/state.rbs Adds RBS types for the new @transitions_by_symbol_number cache and accessor.
sig/generated/lrama/lexer.rbs Adds RBS constants for the precompiled lexer regex patterns.
lib/lrama/states.rb Optimizes compute_la to avoid scanning all rules and to reduce repeated work per state.
lib/lrama/state.rb Adds a transition lookup cache keyed by symbol number and uses it in State#transition.
lib/lrama/lexer.rb Precompiles regexes for symbol/percent-token scanning and refactors lex_c_code to reduce repeated work.
Review details
  • Files reviewed: 3/5 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants