perf(references): компактный индекс поиска вхождения по позиции#4259
Merged
Conversation
Вторичный индекс LocationRepository для findByPosition хранил Map<URI, Map<Integer, Set<SymbolOccurrence>>> с отдельным ConcurrentHashMap-множеством на каждую строку кода с вхождением. На больших проектах это доминирующая статья расхода памяти индекса ссылок: на УПП (~9500 модулей, 2.5M вхождений) — ~1.5M инстансов ConcurrentHashMap, 175 МБ таблиц Node[], ~4.6M boxed Integer; суммарно ~450 МБ. Вместо карты «строка → множество» — ленивый отсортированный по началу диапазона снимок вхождений документа (SymbolOccurrence[]) и бинарный поиск. Диапазоны вхождений непересекающиеся, поэтому единственный кандидат — вхождение с наибольшим началом диапазона, не превосходящим позицию. Снимок сбрасывается при любом изменении вхождений URI и пересобирается при первом следующем поиске; updateLocation больше не раскладывает вхождение по строкам. Замер (analyze УПП, jcmd GC.class_histogram, live): инстансы CHM 1.52M → 14K, узлы CHM 10M → 5.9M, таблицы Node[] 175 → 43 МБ; SARIF-отчёт эквивалентен базовому (идентичные счётчики правил), время анализа не выросло (2:34 → 2:21). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Contributor
📝 WalkthroughWalkthrough
ChangesLocation lookup
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
🚥 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 |
|
Contributor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Суть
Вторичный индекс
LocationRepositoryдляfindByPositionхранилMap<URI, Map<Integer, Set<SymbolOccurrence>>>— отдельное CHM-множество на каждую строку кода с вхождением. На больших проектах это доминирующая статья расхода памяти индекса ссылок.Заменено на ленивый отсортированный по началу диапазона снимок вхождений документа (
SymbolOccurrence[]) + бинарный поиск. Диапазоны вхождений непересекающиеся (инвариант, на который опиралась и старая реализация), поэтому единственный кандидат — вхождение с наибольшим началом диапазона, не превосходящим позицию. Снимок сбрасывается при любом изменении вхождений URI (updateLocation/delete) и пересобирается при первом следующем поиске;updateLocationбольше не раскладывает вхождение по строкам.Замер
analyzeУПП (~9 500 модулей, 2.5 млн вхождений),jcmd GC.class_histogram(live-объекты):ConcurrentHashMapCHM$NodeNode[]Экономия этого PR — примерно −450 МБ на УПП. SARIF-отчёт эквивалентен базовому (идентичные счётчики по всем правилам, размер байт в байт), время анализа не выросло (2:34 → 2:21).
Проверки
./gradlew test: 3 582 теста, 0 упавших (существующиеLocationRepositoryTestпокрывают разводку двух вхождений на одной строке и сверку бинарного поиска с линейным сканом);🤖 Generated with Claude Code
Summary by CodeRabbit
Performance Improvements
Bug Fixes