perf(references): слить Location в SymbolOccurrence (−~85 МиБ)#4270
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 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 |
|
Расплющивает поля `Location` (uri + координаты диапазона) прямо в запись `SymbolOccurrence` и удаляет класс `Location`. Раньше на каждое вхождение приходилось два объекта — `SymbolOccurrence` и `Location`; обёртка `Location` давала лишний заголовок объекта (16 Б) и прыжок по указателю на каждое из миллионов вхождений. `URI` шарится, поэтому размножается только сама запись. Диапазон/позиция строятся на лету (`SymbolOccurrence.range()`, `startPosition()`); фабрика `SymbolOccurrence.of(type, symbol, uri, range)` скрывает раскладку `Range` в четыре int. Компаратор сравнивает те же поля напрямую (вложенный `Location`-компаратор убран, порядок идентичен). Blast-radius маленький: наш `references.model.Location` конструировался в 3 местах и читался через `.location()` в ~10 точках (не путать с lsp4j `Location`, которого правки не касаются). Ожидаемая экономия на cpm (5.98M вхождений): уходит ~228 МиБ объектов `Location`, `SymbolOccurrence` прибавляет ~96 МиБ → нетто ~-130..145 МиБ (HPROF-shallow). Точная цифра — контрольным дампом. ReferenceIndexTest + LocationRepositoryTest: 33/33 зелёные. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_017AZeyPcsbdUBaLUGWbhrCi
d12f131 to
9e39a42
Compare



Финальный шаг уплотнения reference-индекса поверх #4272 (уже в
develop). База PR —develop.Что и зачем
Раньше на каждое вхождение приходилось два объекта:
URIшарится (~32k экземпляров на 5.98M вхождений), поэтому сам URI — не проблема. Проблема — обёрткаLocation: отдельный заголовок объекта и лишний прыжок по указателю на каждое из 5.98M вхождений.Что сделано
Поля
Locationрасплющены прямо в записьSymbolOccurrence, классreferences.model.Locationудалён:range(),startPosition().SymbolOccurrence.of(type, symbol, uri, range)скрывает раскладкуRangeв 4 int.Location-компаратор убран, порядок сортировки идентичен (от него зависятgetAllBySymbolиArrays.binarySearchвSymbolOccurrenceRepositoryиз perf(references): компактное хранение обращений + пакетная запись (−375 МиБ) #4272).Blast-radius маленький и механический (не путать с lsp4j
org.eclipse.lsp4j.Location, которого правки не касаются): конструирование нашегоLocationбыло в 3 местах (ReferenceIndex), чтение через.location().x()— вLocationRepository,MissingCommonModuleMethodDiagnosticи тестах; всё переведено на плоские поля.Замер на реальном cpm
populateContextпо cpm обеими сборками (единственное отличие — плоская запись против записи с обёрткойLocation), retained heap после серииSystem.gc(), две пары прогонов base/flatten вперемежку:develop(#4272, вхождение +Location)Память: ≈ −85 МиБ реального heap. Абсолютные значения плывут от загрузки машины (раунд 2 шёл под нагрузкой), но контролируемое сравнение — дельта base→flatten внутри раунда — стабильно −76…−96 МиБ. Время построения индекса — без изменений (populate парсинг-bound; разброс времени в прогонах — машинный шум, не эффект правки).
Это меньше исходной оценки −130…145 МиБ, потому что та была HPROF-shallow (ссылки по 8 Б), а реальный heap с compressed oops — 4 Б.
Тестирование
SymbolOccurrenceRepositoryTest(14, тест из #4272 переведён наSymbolOccurrence.of),ReferenceIndexTest(12),LocationRepositoryTest(3) — зелёные, полный compile main+test проходит. Остальное — CI.🤖 Generated with Claude Code
https://claude.ai/code/session_017AZeyPcsbdUBaLUGWbhrCi