mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-01-23 21:13:35 +00:00
benchmark_cherrypick
Benchmarks for the performance and features of the cherrypick (core) DI container.
All scenarios use only the public API (scope, module, binding, scoping, and async).
Scenarios
- RegisterAndResolve: Basic registration and resolution of a dependency.
- ChainSingleton (A->B->C, singleton): Deep dependency chain, all as singletons.
- ChainFactory (A->B->C, factory): Dependency chain with factory bindings (new instance per request).
- NamedResolve (by name): Resolving a named dependency among several implementations.
- AsyncChain (A->B->C, async): Asynchronous dependency chain.
- ScopeOverride (child overrides parent): Overriding a dependency in a child scope over a parent.
Features
- Unified benchmark structure: All test scenarios use a unified base mixin for setup/teardown.
- Flexible CLI parameterization:
Run benchmarks with custom parameters for chain length, depth, scenarios and formats. - Matrix/mass run support:
Easily run benchmarks for all combinations of chainLength and depth in one run. - Machine and human readable output:
Supports pretty-table, CSV, and JSON for downstream analytics or data storage. - Scenario selection:
Run all or only specific benchmarks via CLI.
How to run
- Get dependencies:
dart pub get - Run all benchmarks (with default parameters):
dart run bin/main.dart
Run with custom parameters
-
Mass run in matrix mode (CSV output):
dart run bin/main.dart --benchmark=chain_singleton --chainCount=10,100 --nestingDepth=5,10 --format=csv -
Run only the named resolve scenario:
dart run bin/main.dart --benchmark=named -
See available CLI flags:
dart run bin/main.dart --help
Available CLI options
--benchmark(or-b) — Scenario to run:
register,chain_singleton,chain_factory,named,override,async_chain,all(default)--chainCount(or-c) — Comma-separated chain lengths. E.g.10,100--nestingDepth(or-d) — Comma-separated chain depths. E.g.5,10--format(or-f) — Result output format:pretty(table),csv,json--help(or-h) — Print help
Example output (--format=csv)
benchmark,chainCount,nestingDepth,elapsed_us
ChainSingleton,10,5,2450000
ChainSingleton,10,10,2624000
ChainSingleton,100,5,2506300
ChainSingleton,100,10,2856900
Add your own benchmark
- Create a Dart file with a class inheriting from
BenchmarkBaseorAsyncBenchmarkBase. - Use the
BenchmarkWithScopemixin for automatic Scope management if needed. - Add your benchmark to bin/main.dart for selection via CLI.
Example for contributors
class MyBenchmark extends BenchmarkBase with BenchmarkWithScope {
MyBenchmark() : super('My custom');
@override void setup() => setupScope([MyModule()]);
@override void run() { scope.resolve<MyType>(); }
@override void teardown() => teardownScope();
}
License
MIT