Skip to content

perf(references): не вызывать MDOType.fromValue для идентификаторов без свойства#4181

Merged
nixel2007 merged 1 commit into
developfrom
claude/perf-mdoref-early-exit
Jun 21, 2026
Merged

perf(references): не вызывать MDOType.fromValue для идентификаторов без свойства#4181
nixel2007 merged 1 commit into
developfrom
claude/perf-mdoref-early-exit

Conversation

@nixel2007

@nixel2007 nixel2007 commented Jun 21, 2026

Copy link
Copy Markdown
Member

Описание

MdoRefBuilder.getMdoRef(identifier, modifiers) строит ссылку на платформенный объект, только когда есть и тип (MDOType.fromValue(identifier)), и имя объекта (второй «модификатор» после точки). Но mdoName проверялся после fromValue, поэтому для каждого голого идентификатора (чтение локальной переменной и т.п., у которого модификаторов нет) дорогой MDOType.fromValue вызывался впустую и всегда возвращал "".

Считаем mdoName первым и выходим до fromValue, если он пуст. Поведение идентично: там, где mdoName пуст, старый код тоже возвращал "".

getMdoRef дёргается в ReferenceIndexFiller на каждый call-site / комплексный идентификатор при заполнении индекса ссылок, то есть на каждый keystroke-ребилд документа, — поэтому это hot path набора текста.

Замер

JFR sampling, рабочий сценарий набора текста в общем модуле УправлениеДоступомСлужебный (SSL 3.2, 48 399 строк), antlr 0.4.0, baseline vs fix, 8 прогревов + 40 итераций, n=680 keystroke-ребилдов:

метрика baseline fix Δ
MDOType.fromValue (inclusive) 2.34% (6 708) 0.59% (1 679) −75%
MdoRefBuilder.getMdoRef self-time 5.36% (15 391) 3.68% (10 410) −31%
CF.findCommonModule (inclusive) 1.86% 1.97% ≈ шум (не трогали)
rebuild p50 689.2 ms 683.4 ms −5.8 ms
rebuild mean 694.3 ms 688.1 ms −6.2 ms

Остаточные 0.59% fromValue — легитимные случаи Справочники.X и т.п. с непустым именем объекта. Сдвиг wall-clock небольшой (весь ребилд доминируют лексинг+парсинг), надёжный сигнал — доля self-time в JFR.

Чеклист

Общие

  • Отладочные, закомментированные и прочие, не имеющие смысла участки кода удалены
  • Изменения покрыты тестами (рефакторинг без изменения поведения; покрыт существующими ReferenceIndexFillerTest / ReferenceIndexTest / ReferenceIndexReferenceFinderTest)
  • Обязательные действия перед коммитом выполнены

🤖 Generated with Claude Code


Generated by Claude Code

Summary by CodeRabbit

  • Refactor
    • Improved efficiency of metadata object reference resolution by optimizing the control flow to skip unnecessary processing when required name components are missing.

…ез свойства

MdoRefBuilder.getMdoRef(identifier, modifiers) строит ссылку на платформенный
объект только когда есть и тип (MDOType.fromValue(identifier)), и имя объекта
(второй "модификатор" после точки). Но mdoName проверялся ПОСЛЕ fromValue,
поэтому для каждого голого идентификатора (чтение локальной переменной и т.п.,
у которого модификаторов нет) дорогой MDOType.fromValue вызывался впустую и
всегда возвращал "".

Считаем mdoName первым и выходим до fromValue, если он пуст. Поведение
идентично (там, где mdoName пуст, старый код тоже возвращал "").

Замер (JFR sampling, рабочий сценарий набора текста в общем модуле
УправлениеДоступомСлужебный SSL 3.2, 48 399 строк, antlr 0.4.0,
baseline vs fix, 8 прогревов + 40 итераций, n=680 keystroke-ребилдов):

  MDOType.fromValue (inclusive)     2.34% → 0.59%   (−75%)
  MdoRefBuilder.getMdoRef self-time 5.36% → 3.68%   (−31%)
  CF.findCommonModule (inclusive)   1.86% → 1.97%   (без изменений, как и ожидалось)
  rebuild p50                       689.2 → 683.4 ms
  rebuild mean                      694.3 → 688.1 ms

Остаточные 0.59% fromValue — легитимные случаи Справочники.X и т.п. с непустым
именем объекта.
@coderabbitai

coderabbitai Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 35d48bfc-5e94-4178-acff-a1a3340b0be2

📥 Commits

Reviewing files that changed from the base of the PR and between 346bcef and 85f5f39.

📒 Files selected for processing (1)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java

📝 Walkthrough

Walkthrough

In MdoRefBuilder.getMdoRef, the computation of mdoName is moved before the MDOType resolution. When mdoName is empty, the method now returns "" immediately without attempting MDOType.fromValue(...); otherwise the existing MdoReference construction path is unchanged.

Changes

MdoRefBuilder control flow fix

Layer / File(s) Summary
Early-exit on empty mdoName
src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java
mdoName is now computed up-front via getMdoName(modifiers); the method returns "" immediately when it is empty, skipping the MDOType.fromValue(...) call that was previously reached first.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Poem

🐇 A name checked first, before the type,
No longer buried deep in hype.
When empty, bail without delay,
No MDOType lookup today!
The rabbit hops a shorter trail — hooray! 🌿

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main performance optimization: avoiding an expensive MDOType.fromValue() call for identifiers without properties/modifiers, which aligns with the primary change in the changeset.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/perf-mdoref-early-exit

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sonarqubecloud

Copy link
Copy Markdown

@nixel2007
nixel2007 merged commit c9c7a9e into develop Jun 21, 2026
38 of 39 checks passed
@nixel2007
nixel2007 deleted the claude/perf-mdoref-early-exit branch June 21, 2026 18:01
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