Files
cherrypick/benchmark_di/REPORT.ru.md

5.6 KiB
Raw Blame History

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