perf(references): не вызывать MDOType.fromValue для идентификаторов без свойства#4181
Conversation
…ез свойства 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 и т.п. с непустым именем объекта.
|
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)
📝 WalkthroughWalkthroughIn ChangesMdoRefBuilder control flow fix
Estimated code review effort🎯 1 (Trivial) | ⏱️ ~3 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 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 |
|



Описание
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-ребилдов:MDOType.fromValue(inclusive)MdoRefBuilder.getMdoRefself-timeCF.findCommonModule(inclusive)Остаточные 0.59%
fromValue— легитимные случаиСправочники.Xи т.п. с непустым именем объекта. Сдвиг wall-clock небольшой (весь ребилд доминируют лексинг+парсинг), надёжный сигнал — доля self-time в JFR.Чеклист
Общие
ReferenceIndexFillerTest/ReferenceIndexTest/ReferenceIndexReferenceFinderTest)🤖 Generated with Claude Code
Generated by Claude Code
Summary by CodeRabbit