mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-01-23 21:13:35 +00:00
5.6 KiB
5.6 KiB
Результаты бенчмарка DI: cherrypick vs get_it
Параметры запуска бенчмарков
| Параметр | Значение |
|---|---|
| --benchmark | all |
| --chainCount (-c) | 10, 100 |
| --nestingDepth (-d) | 10, 100 |
| --repeat (-r) | 2 |
| --warmup (-w) | 1 (по умолчанию) |
| --format (-f) | markdown |
| --di | cherrypick, get_it |
Описание бенчмарков
(1) RegisterSingleton
Регистрируется и дважды резолвится singleton. Базовый тест скорости DI.
(2) ChainSingleton
Цепочка зависимостей A → B → ... → N (singleton). Тестирует скорость заполнения и разрешения глубоких singleton-цепочек по имени.
(3) ChainFactory
Аналогично ChainSingleton, но каждое звено цепи — factory (новый объект при каждом resolve).
(4) AsyncChain
Асинхронная цепочка (async factory). Важно для сценариев с async DI.
(5) Named
Регистрируются две реализации по имени ('impl1', 'impl2'), разрешается named. Проверка lookup по имени.
(6) Override
Регистрируется цепочка/alias в дочернем scope, резолвится UniversalService без имени там же. Симуляция override и изолированной/тестовой архитектуры.
Сравнительная таблица (Mean (us), ΔRSS(KB)), chainCount=10, nestingDepth=10
| Сценарий | cherrypick Mean (мкс) | cherrypick ΔRSS | get_it Mean (мкс) | get_it ΔRSS |
|---|---|---|---|---|
| RegisterSingleton | 21.0 | 320 | 24.5 | 80 |
| ChainSingleton | 112.5 | -3008 | 2.0 | 304 |
| ChainFactory | 8.0 | 0 | 4.0 | 0 |
| AsyncChain | 36.5 | 0 | 13.5 | 0 |
| Named | 1.5 | 0 | 0.5 | 0 |
| Override | 27.5 | 0 | 0.0 | 0 |
Максимальная нагрузка: chainCount=100, nestingDepth=100
| Сценарий | cherrypick Mean (мкс) | cherrypick ΔRSS | get_it Mean (мкс) | get_it ΔRSS |
|---|---|---|---|---|
| RegisterSingleton | 1.0 | 32 | 1.0 | 0 |
| ChainSingleton | 3884.0 | 0 | 1.5 | 34848 |
| ChainFactory | 4088.0 | 0 | 50.0 | 12528 |
| AsyncChain | 4287.0 | 0 | 17.0 | 63120 |
| Named | 1.0 | 0 | 0.0 | 0 |
| Override | 4767.5 | 0 | 1.5 | 14976 |
Пояснения по сценариям
- RegisterSingleton — базовый тест DI (регистрация и резолвинг singleton). Практически мгновенно у обоих DI.
- ChainSingleton — глубокая singleton-цепочка. get_it вне конкуренции по скорости, cherrypick медленнее из-за более сложной логики поиска именованных зависимостей, но предсказуем.
- ChainFactory — цепочка Factory-объектов. cherrypick заметно медленнее на длинных цепях, get_it почти не увеличивает время.
- AsyncChain — асинхронная цепочка сервисов. get_it существенно быстрее, cherrypick страдает на глубине/ширине.
- Named — разрешение зависимостей по имени. Оба DI почти мгновенны.
- Override — переопределение alias без имени в дочернем scope. get_it (со стековыми scope) почти не теряет времени; cherrypick предсказуемо замедляется на глубине/ширине.
Итог
- get_it выдаёт отличную производительность по всем сценариям, особенно на больших графах; но не поддерживает продвинутую диагностику, проверки циклов, расширенные scope.
- cherrypick — незаменим для работы с корпоративными/тестируемыми архитектурами и наследованием, устойчиво ведёт себя на тысячи зависимостей, но требует учёта роста времени при экстремальных нагрузках.
Рекомендация:
- cherrypick — выбор для серьёзных production-систем и тестирования;
- get_it — лидер для MVP, быстрых демо, прототипов, CLI, games.