Files
cherrypick/benchmark_cherrypick/README.ru.md

106 lines
5.5 KiB
Markdown
Raw 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.

# benchmark_cherrypick
Бенчмарки производительности и возможностей DI-контейнера cherrypick (core).
## Сценарии
- **RegisterAndResolve**: базовая регистрация и разрешение зависимости.
- **ChainSingleton** (A->B->C, singleton): длинная цепочка зависимостей, все как singleton.
- **ChainFactory** (A->B->C, factory): цепочка зависимостей через factory (новый объект на каждый запрос).
- **NamedResolve** (by name): разрешение зависимости по имени среди нескольких реализаций.
- **AsyncChain** (A->B->C, async): асинхронная цепочка зависимостей.
- **ScopeOverride** (child overrides parent): перекрытие зависимости в дочернем scope относительно родителя.
## Возможности
- **Унифицированная структура бенчмарков**
- **Гибкая параметризация CLI (chainCount, nestingDepth, repeats, warmup, сценарий, формат)**
- **Автоматический матричный запуск для наборов параметров**
- **Статистика: среднее, медиана, stddev, min, max для каждого сценария**
- **Память: memory_diff_kb (итоговая разница), delta_peak_kb (максимальный рост), peak_rss_kb (абсолютный пик)**
- **Вывод в таблицу, CSV или JSON**
- **Прогревочные запуски до замера времени для стабильности**
## Как запустить
1. Установить зависимости:
```shell
dart pub get
```
2. Запустить все бенчмарки (по умолчанию: одни значения, repeat=5, warmup=2):
```shell
dart run bin/main.dart
```
### Пользовательские параметры
- Матричный прогон (csv, 7 повторов, 3 прогрева):
```shell
dart run bin/main.dart --benchmark=chain_singleton --chainCount=10,100 --nestingDepth=5,10 --repeat=7 --warmup=3 --format=csv
```
- Только сценарий с именованным разрешением:
```shell
dart run bin/main.dart --benchmark=named --repeat=3 --warmup=1
```
- Посмотреть все флаги CLI:
```shell
dart run bin/main.dart --help
```
#### Опции CLI
- `--benchmark` (`-b`) — Сценарий:
`register`, `chain_singleton`, `chain_factory`, `named`, `override`, `async_chain`, `all` (по умолчанию all)
- `--chainCount` (`-c`) — Длины цепочек через запятую. Напр: `10,100`
- `--nestingDepth` (`-d`) — Глубины цепочек через запятую. Напр: `5,10`
- `--repeat` (`-r`) — Сколько раз мерить каждую конфигурацию (`по умолчанию: 5`)
- `--warmup` (`-w`) — Сколько прогревочных запусков до замера времени (`по умолчанию: 2`)
- `--format` (`-f`) — Вывод: `pretty`, `csv`, `json` (по умолчанию pretty)
- `--help` (`-h`) — Показать справку
#### Пример вывода (`--format=csv`)
```
benchmark,chainCount,nestingDepth,mean_us,median_us,stddev_us,min_us,max_us,trials,timings_us,memory_diff_kb,delta_peak_kb,peak_rss_kb
ChainSingleton,10,5,2450000,2440000,78000,2290000,2580000,5,"2440000;2460000;2450000;2580000;2290000",-64,0,200064
```
---
## Как добавить свой бенчмарк
1. Создайте Dart-файл с классом, унаследованным от `BenchmarkBase` или `AsyncBenchmarkBase`.
2. Используйте миксин `BenchmarkWithScope` для управления Scope (если нужно).
3. Добавьте ваш бенчмарк в bin/main.dart для запуска через CLI.
---
## Пример для контрибуторов
```dart
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();
}
```
---
| Benchmark | Chain Count | Depth | Mean (us) | Median | Stddev | Min | Max | N | ΔRSS(KB) | ΔPeak(KB) | PeakRSS(KB) |
|---|---|---|---|---|---|---|---|---|---|---|---|
| RegisterSingleton | 10 | 5 | 24 | 45 | 22 | 2 | 45 | 2 | 0 | 0 | 199232 |
| ChainSingleton | 10 | 5 | 41 | 45 | 4 | 37 | 45 | 2 | 0 | 0 | 199296 |
| ChainFactory | 10 | 5 | 43 | 50 | 8 | 35 | 50 | 2 | 0 | 0 | 199296 |
| AsyncChain | 10 | 5 | 49 | 50 | 2 | 47 | 50 | 2 | 0 | 0 | 199344 |
| Named | 10 | 5 | 1 | 1 | 0 | 1 | 1 | 2 | 0 | 0 | 199344 |
| Override | 10 | 5 | 2 | 2 | 1 | 1 | 2 | 2 | 0 | 0 | 199360 |
---
## Лицензия
MIT