perf(references): индекс объявлений символов по строке для O(1) резолва#4252
Conversation
SourceDefinedSymbolDeclarationReferenceFinder искал «символ, чьё имя стоит в позиции» линейным сканом symbolTree.getChildrenFlat() (метод + КАЖДАЯ переменная + регион) с containsPosition на каждом — O(N) на вызов. Finder дёргается на каждый findReference, промахнувшийся мимо ReferenceIndex, т.е. на резолве платформенных членов при инференсе; по JFN UnknownMember скан в Ranges.containsPosition — 46.7% self. Добавлен ленивый индекс на SymbolTree: symbolsBySelectionLine — Map<строка selectionRange, List<Symbol>>, разводящий несколько объявлений на одной строке по колонкам через тот же Ranges.containsPosition. Порядок в бакете — как в getChildrenFlat() (pre-order DFS), чтобы сохранить tie-break findFirst прежнего скана; списки trimToSize. Метод findSymbolByNamePosition даёт O(1)-lookup по строке; finder делегирует в него. Инвалидация не нужна: SymbolTree пересоздаётся по контенту документа. Замер (UnknownMember по SSL УправлениеДоступомСлужебный, ~48k строк; чистый A/B в одной JVM, переключается только finder; поверх уже влитого node-кэша): линейный скан 24012 -> line-индекс 21747 мс (×1.10, −9.4%), срабатываний неизменно (6540). Ускоряет любой findReference с промахом индекса (hover/definition/инференс), не только UnknownMember. Поведение сохранено — тесты finder/definition/references/rename/hover/инференс зелёные. Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_01BSiRGLm633B4EmvG3vkk4V
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthrough
ChangesSelection-range symbol lookup
Estimated code review effort: 3 (Moderate) | ~20 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Test Results 3 594 files 3 594 suites 1h 42m 15s ⏱️ Results for commit 97dec10. ♻️ This comment has been updated with latest results. |
|
…ectionRange По ревью-предложению мейнтейнера: имя отражает, что поиск идёт по selectionRange символа. Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_01BSiRGLm633B4EmvG3vkk4V



Описание
SourceDefinedSymbolDeclarationReferenceFinder(finder в цепочкеReferenceResolver) искал символ по позиции курсора линейным обходом дерева символов, сопоставляяselectionRangeкаждого символа с позицией.Что стало: в
SymbolTreeдобавлен ленивый вторичный индексsymbolsBySelectionLine(Map<Integer строка → List<SourceDefinedSymbol>>,@Getter(lazy=true)), проиндексированный по всем строкам, которые перекрываетselectionRangeсимвола (сtrimToSize()по бакетам), и методfindSymbolByNamePosition(Position)— O(1)-lookup по строке с разведением по колонкам черезRanges.containsPosition. Finder делегирует в него.Зачем
По CPU-профилю на большом реальном модуле
SourceDefinedSymbolDeclarationReferenceFinderзанимал заметную долю резолва (линейный обход дерева символов на каждыйfindReference). Line-индекс устраняет обход.Замеры
Нагрузка —
UnknownMemberпо общему модулюУправлениеДоступомСлужебныйиз SSL (~48k строк); чистый A/B в одной JVM:UnknownMember): ×1.10 (−9.4%); в профиле доляSourceDefinedSymbolDeclarationReferenceFinderпадает 46.7% → 0.1% — сам finder практически исчезает из горячего пути, общий эффект ограничен тем, что доминантой на этом срезе оставался другой finder (снят отдельным PR серии — индекс вхождений по строке).Связанные задачи
Closes
Чеклист
Общие
develop)SymbolTreeTest: парити с прежним обходом, несколько объявлений на одной строке разводятся по колонкам, ленивое построение)gradlew precommit) — прогнаны затронутые тесты references/definition/rename; полныйprecommitза мейнтейнерамиДополнительно
Часть серии независимых перф-правок, снятых по цепочке CPU-профилей одной диагностики на большом файле. Другие PR серии: резолв членов по терминалу, мемоизация инференса выражений, индекс вхождений по строке.
🤖 Generated with Claude Code
https://claude.ai/code/session_01BSiRGLm633B4EmvG3vkk4V
Generated by Claude Code
Summary by CodeRabbit
Improvements
Tests