perf(mdo): LRU-мемоизация findCommonModule#619
Conversation
CF.findCommonModule(name) — тонкая обёртка над getCommonModulesByName().get(name). Карта мемоизируется, но её тип — CaseInsensitiveMap, у которой каждый get() сворачивает регистр ключа-запроса посимвольно (Character.toLowerCase + аллокация строки). В потребителях (заполнитель индекса ссылок bsl-language-server) findCommonModule вызывается на каждый идентификатор исходного кода — десятки тысяч раз на ребилд документа, в основном промахи. Добавлен LookupCachingMap — декоратор read-only карты поверх commons-collections4 (новых зависимостей нет), мемоизирующий результаты get() (включая отрицательные через маркер MISS) в ограниченном по размеру потокобезопасном LRU. computeCommonModulesByName оборачивает карту общих модулей; размер кэша max(2048, 2×count) гарантирует, что положительные попадания не вытесняются. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lsui6HwTYazwFSPSB6Wt5k
|
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 (2)
📝 WalkthroughWalkthroughA new ChangesLRU Lookup Cache for Common Modules
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 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 |
| cf.getCommonModules().forEach(commonModule -> result.put(commonModule.getName(), commonModule)); | ||
| return Collections.unmodifiableMap(result); | ||
| // CaseInsensitiveMap.get сворачивает регистр запроса на каждый вызов, а findCommonModule | ||
| // дёргается десятки тысяч раз (на каждый идентификатор при разрешении ссылок). Оборачиваем в |
|




CF.findCommonModule(name) — тонкая обёртка над
getCommonModulesByName().get(name). Карта мемоизируется, но её тип —
CaseInsensitiveMap, у которой каждый get() сворачивает регистр
ключа-запроса посимвольно (Character.toLowerCase + аллокация строки).
В потребителях (заполнитель индекса ссылок bsl-language-server)
findCommonModule вызывается на каждый идентификатор исходного кода —
десятки тысяч раз на ребилд документа, в основном промахи.
Добавлен LookupCachingMap — декоратор read-only карты поверх
commons-collections4 (новых зависимостей нет), мемоизирующий результаты
get() (включая отрицательные через маркер MISS) в ограниченном по
размеру потокобезопасном LRU. computeCommonModulesByName оборачивает
карту общих модулей; размер кэша max(2048, 2×count) гарантирует, что
положительные попадания не вытесняются.
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01Lsui6HwTYazwFSPSB6Wt5k
Summary by CodeRabbit