Files
cherrypick/benchmark_di/REPORT.ru.md

4.6 KiB
Raw Blame History

Сравнительный отчет 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 держится в районе 320340 Мб (большие цепи), на мелких 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.