Files
cherrypick/benchmark_di/REPORT.ru.md

80 lines
5.6 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Результаты бенчмарка 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.