perf(context): объединить обход регионов и переменных в один проход#4176
Conversation
При перестроении дерева символов на каждый keystroke RegionSymbolComputer и VariableSymbolComputer выполняли два отдельных полных обхода AST вглубь. По профилю набора текста на большом модуле (УправлениеДоступомСлужебный, 48k строк) обход визиторами (AbstractParseTreeVisitor.visitChildren) — заметная доля стоимости ребилда. Наборы перекрытых узлов у этих визиторов не пересекаются (директивы #Область/#КонецОбласти против объявлений переменных/параметров/lvalue/циклов), поэтому сбор регионов добавлен поверх обхода переменных в новом RegionVariableSymbolComputer (наследник VariableSymbolComputer) — два полных обхода схлопнуты в один. VariableSymbolComputer остаётся самостоятельным. Замер (JFR, тот же модуль, 204 нажатия): rebuild p50 1237→1120 мс, min 1115→1030 мс (~8%); доля visitChildren 19.4%→15.3%. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HcK3qVwTH91rXtgprGmoWr
|
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 (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthrough
ChangesCombined region and variable symbol computation
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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 |
…omputer
Класс RegionSymbolComputer удалён в этом PR, а его {@link} остался в javadoc
RegionVariableSymbolComputer → Xdoclint:all валил задачу javadoc (reference
not found). Заменено на прозаическое описание.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HcK3qVwTH91rXtgprGmoWr
|



Зачем
Symbol tree открытого документа перестраивается на каждый keystroke. При сборке дерева
RegionSymbolComputerиVariableSymbolComputerвыполняли два отдельных полных обхода AST вглубь (оба спускаются в тела методов). По профилю набора текста на большом модуле (SSL 3.2,УправлениеДоступомСлужебный, 48 399 строк) обход визиторами (AbstractParseTreeVisitor.visitChildren) — заметная доля стоимости ребилда (~20% self-time по JFR), и половина её приходилась на второй, дублирующий обход.Что меняется
Наборы перекрываемых узлов у этих двух визиторов не пересекаются:
#Область/#КонецОбласти(visitRegionStart/visitRegionEnd);lvalue, циклы (visitModuleVarDeclaration/visitSub/visitSubVarDeclaration/visitParam/visitLValue/visitForStatement/visitForEachStatement).Поэтому сбор регионов добавлен поверх обхода переменных в новом
RegionVariableSymbolComputer(наследникVariableSymbolComputer) — оба набора override'ов работают в одномvisitFile, и два полных обхода схлопываются в один.VariableSymbolComputerоставлен самостоятельным (используется отдельно) и не изменён.MethodSymbolComputerне трогается: его обход поверхностный (не спускается в тела методов), и от его результата зависит резолвинг scope переменных — поэтому методы по-прежнему считаются первым, отдельным проходом.RegionSymbolComputerудалён (использовался только вSymbolTreeComputer).Замеры
JFR, тот же модуль
УправлениеДоступомСлужебный(48 399 строк), эмуляция набора текста, 204 нажатия, A/B на одинаковой сборке:visitChildren(self, JFR)≈ 8% быстрее (~100 мс с ~1.2 с), стабильно по min/p50/mean. Выигрыш растёт с размером модуля (полный обход — O(размер файла)).
Проверка
compileJavaзелёный.SymbolTreeComputerTest,DocumentContextTest(в т.ч.testGetRegionsFlatComputesAllLevels— вложенность регионов),VariableSymbolComputerTest,MethodSymbolComputerTest,MethodSymbolComputerConstructorTest.Базируется на
develop, независимо от #4174 и #4175.🤖 Generated with Claude Code
Generated by Claude Code
Summary by CodeRabbit