Files
cherrypick/benchmark_di/REPORT.ru.md

64 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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 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._