mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-01-24 05:25:19 +00:00
80 lines
5.6 KiB
Markdown
80 lines
5.6 KiB
Markdown
# Результаты бенчмарка 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.
|