2025-08-19 10:29:53 +03:00
|
|
|
|
# Comparative DI Benchmark Report: cherrypick vs get_it vs riverpod vs kiwi
|
|
|
|
|
|
|
|
|
|
|
|
## Benchmark Parameters
|
|
|
|
|
|
|
|
|
|
|
|
- chainCount = 100
|
|
|
|
|
|
- nestingDepth = 100
|
|
|
|
|
|
- repeat = 5
|
|
|
|
|
|
- warmup = 2
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-07 16:46:53 +03:00
|
|
|
|
## Benchmark Scenarios
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-07 16:46:53 +03:00
|
|
|
|
1. **RegisterSingleton** — Registers and resolves a singleton. Baseline DI speed.
|
|
|
|
|
|
2. **ChainSingleton** — A dependency chain A → B → ... → N (singleton). Deep singleton chain resolution.
|
|
|
|
|
|
3. **ChainFactory** — All chain elements are factories. Stateless creation chain.
|
|
|
|
|
|
4. **AsyncChain** — Async chain (async factory). Performance on async graphs.
|
|
|
|
|
|
5. **Named** — Registers two bindings with names, resolves by name. Named lookup test.
|
|
|
|
|
|
6. **Override** — Registers a chain/alias in a child scope. Tests scope overrides.
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-07 16:46:53 +03:00
|
|
|
|
---
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-19 10:29:53 +03:00
|
|
|
|
## Comparative Table: chainCount=100, nestingDepth=100, repeat=5, warmup=2 (Mean time, µs)
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-19 10:29:53 +03:00
|
|
|
|
| Scenario | cherrypick | get_it | riverpod | kiwi |
|
|
|
|
|
|
|------------------|------------|--------|----------|------|
|
|
|
|
|
|
| chainSingleton | 47.6 | 13.0 | 389.6 | 46.8 |
|
|
|
|
|
|
| chainFactory | 93.6 | 68.4 | 678.4 | 40.8 |
|
|
|
|
|
|
| register | 67.4 | 10.2 | 242.2 | 56.2 |
|
|
|
|
|
|
| named | 14.2 | 10.6 | 10.4 | 8.2 |
|
|
|
|
|
|
| override | 42.2 | 11.2 | 302.8 | 44.6 |
|
|
|
|
|
|
| chainAsync | 519.4 | 38.0 | 886.6 | – |
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2025-08-08 15:00:55 +03:00
|
|
|
|
## Analysis
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-19 10:29:53 +03:00
|
|
|
|
- **get_it** and **kiwi** are the fastest in most sync scenarios; cherrypick is solid, riverpod is much slower for deep chains.
|
|
|
|
|
|
- **Async scenarios**: Only cherrypick, get_it and riverpod are supported; get_it is much faster. Kiwi does not support async.
|
|
|
|
|
|
- **Named** lookups are fast in all DI.
|
|
|
|
|
|
- **Riverpod** loses on deeply nested/async chains.
|
|
|
|
|
|
- **Memory/peak usage** varies, but mean_us is the main comparison (see raw results for memory).
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-07 16:46:53 +03:00
|
|
|
|
### Recommendations
|
2025-08-19 10:29:53 +03:00
|
|
|
|
- Use **get_it** or **kiwi** for maximum sync performance and simplicity.
|
|
|
|
|
|
- Use **cherrypick** for robust, scalable and testable setups — with a small latency cost.
|
|
|
|
|
|
- Use **riverpod** only for Flutter apps where integration is paramount and chains are simple.
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-07 16:46:53 +03:00
|
|
|
|
---
|
2025-08-07 12:11:16 +03:00
|
|
|
|
|
2025-08-19 10:29:53 +03:00
|
|
|
|
_Last updated: August 19, 2025._
|
|
|
|
|
|
_Please see scenario source for details._
|