# Сравнительный отчет 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._