# Сравнительный отчет DI-бенчмарка: cherrypick vs get_it vs riverpod vs kiwi

## Параметры запуска:
- chainCount = 100
- nestingDepth = 100
- repeat = 5
- warmup = 2

## Описание сценариев

1. **RegisterSingleton** — регистрация и получение singleton (базовая скорость DI).
2. **ChainSingleton** — цепочка зависимостей A → B → ... → N (singleton). Глубокий singleton-резолвинг.
3. **ChainFactory** — все элементы цепочки — factory. Stateless построение графа.
4. **AsyncChain** — асинхронная цепочка (async factory). Тест async/await графа.
5. **Named** — регистрация двух биндингов с именами, разрешение по имени.
6. **Override** — регистрация биндинга/цепочки в дочернем scope.

---

## Сравнительная таблица: chainCount=100, nestingDepth=100, repeat=5, warmup=2 (среднее время, мкс)

| Сценарий         | cherrypick | get_it | riverpod | kiwi  | yx_scope |
|------------------|------------|--------|----------|-------|----------|
| chainSingleton   | 20.6       | 14.8   | 275.2    | 47.0  | 82.8     |
| chainFactory     | 90.6       | 71.6   | 357.0    | 46.2  | 79.6     |
| register         | 82.6       | 10.2   | 252.6    | 43.6  | 224.0    |
| named            | 18.4       | 9.4    | 12.2     | 10.2  | 10.8     |
| override         | 170.6      | 11.2   | 301.4    | 51.4  | 146.4    |
| chainAsync       | 493.8      | 34.0   | 5,039.0  |  –    | 87.2     |


## Пиковое потребление памяти (Peak RSS, Кб)

| Сценарий         | cherrypick | get_it | riverpod | kiwi   | yx_scope |
|------------------|------------|--------|----------|--------|----------|
| chainSingleton   | 338,224    | 326,752| 301,856  | 195,520| 320,928  |
| chainFactory     | 339,040    | 335,712| 304,832  | 319,952| 318,688  |
| register         | 333,760    | 334,208| 300,368  | 327,968| 326,736  |
| named            | 241,040    | 229,632| 280,144  | 271,872| 266,352  |
| override         | 356,912    | 331,456| 329,808  | 369,104| 304,416  |
| chainAsync       | 311,616    | 434,592| 301,168  |   –    | 328,912  |

---

## Краткий анализ и рекомендации

- **get_it** — абсолютный лидер по скорости и памяти на всех графах (минимальная задержка, небольшой peak RSS в любых цепочках).
- **kiwi** — минимальное потребление памяти в chainSingleton/Factory, но не для асинхронности.
- **yx_scope** — очень ровная производительность даже на сложных async/sync-цепях, иногда с пиком в памяти на override/register, но задержки всегда минимальны.
- **cherrypick** — стабильнее riverpod, но ощутимо уступает top-3 по латентности на длинных/async-графах; по памяти лучше yx_scope для override/named.
- **riverpod** — непригоден для глубоких/async-графов: память и время растут очень сильно.
- **Пиковое потребление памяти**: большинство DI держится в районе 320–340 Мб (большие цепи), на мелких named/factory — крайне мало.
- **Стабильность**: yx_scope и get_it показывают наименьшие скачки времени; у cherrypick иногда всплески на override/async, у riverpod — на async графе stddev почти равен mean!

### Рекомендации
- Используйте **get_it** (или **kiwi**, если не нужен async) для максимальной производительности и минимального пикового использования памяти.
- **yx_scope** — идеально для production-графов с миксом sync/async.
- **cherrypick** — хорошо для модульных и тестируемых приложений, если не требуется абсолютная “микросекундная” производительность.
- **riverpod** — только если граф плоский или нужно DI только для UI во Flutter.

---

_Обновлено: 20 августа 2025._
