Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,19 @@
</div>
</br>

Библиотека для измерения производительности кода на OneScript, вдохновлённая [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet/), с поддержкой параметризации, мониторинга памяти и гибкой настройки тестов.
Библиотека для измерения и анализа производительности кода на OneScript, вдохновлённая [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet/). Позволяет сравнивать реализации алгоритмов и версии OneScript, выявлять различия в производительности и оценивать достоверность результатов.

## Возможности

- **Гибкая настройка:** конфигурация тестов через аннотации, программный код и CLI.
- **Параметризованные тесты:** запуск одних и тех же тестов с разными входными данными.
- **Мониторинг памяти:** отслеживание аллокации памяти во время выполнения.
- **Мультиверсионное сравнение:** запуск бенчмарков на указанных версиях исполняющей среды OneScript с консолидацией результатов.
- **Метрики:** время выполнения (среднее, минимум, максимум), стандартное отклонение и ошибка, операций в секунду (Op/s), квартили и произвольные процентили.
- **Экспорт результатов:** сохранение результатов выполнения бенчмарков в Markdown, JSON, HTML.
- **Гибкая настройка:** аннотации, программный API, CLI и JSON-конфигурация.
- **Параметризация:** выполнение бенчмарков с различными наборами входных данных.
- **Мониторинг памяти:** измерение выделяемой памяти на операцию.
- **Сравнение версий OneScript:** запуск бенчмарков в разных исполняющих средах с объединением результатов.
- **Подробная статистика:** время выполнения, пропускная способность, стандартное отклонение, квартили, процентили и доверительные интервалы.
- **Адаптивные измерения:** автоматическое завершение замеров при достижении заданной точности.
- **Анализ результатов:** обнаружение выбросов, статистическое сравнение с эталоном и диагностика качества измерений.
- **Контроль производительности:** программная проверка метрик и допустимых порогов.
- **Экспорт отчётов:** Markdown, JSON и HTML.

## Быстрый старт

Expand Down
4 changes: 2 additions & 2 deletions docs/CLI.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ benchos run [OPTIONS] [FILE]

| Опция | Описание | По умолчанию | Пример |
| --- | --- | --- | --- |
| `--iterationCount` | Количество измерительных итераций | `15` | `--iterationCount 10` |
| `--iterationCount` | Точное количество временных измерительных итераций | `0` | `--iterationCount 10` |
| `--maxRelativeError` | Включает адаптивные итерации и задаёт целевую относительную погрешность | `0.1`* | `--maxRelativeError 0.1` |
| `--minAdaptiveIterationCount` | Включает адаптивные итерации и задаёт минимальное количество измерений | `15`* | `--minAdaptiveIterationCount 15` |
| `--maxAdaptiveIterationCount` | Включает адаптивные итерации и задаёт максимальное количество измерений | `100`* | `--maxAdaptiveIterationCount 100` |
Expand Down Expand Up @@ -64,7 +64,7 @@ benchos run [OPTIONS] [FILE]
- Опции `--throughput` и `--coldstart` взаимно исключают друг друга.
- Значение `--invocationCount 0` включает автоматический расчёт количества вызовов за итерацию.
- Опции `--warmupCount`, `--invocationCount`, `--iterationTime` игнорируются при стратегии `--coldstart`.
- Любая из опций адаптивных итераций включает адаптивный режим; в нём ограничение задаёт `--maxAdaptiveIterationCount`, а не `--iterationCount`.
- При `--iterationCount` число временных измерений фиксировано; без него адаптивный режим действует по умолчанию, а его ограничение задаёт `--maxAdaptiveIterationCount`.
- Любая из опций статистического сравнения включает его.
- Опция `-e` / `--exporters` заменяет экспортеры из `--settings` и аннотаций бенчмарка.
- Повторяйте `-p` / `--param`, чтобы передать несколько общих параметров.
Expand Down
26 changes: 22 additions & 4 deletions docs/api/КонфигурацияБенчмарков.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
| Свойство | Значение |
| -- | -- |
| Стратегия | `СтратегииЗапускаБенчмарка.ПропускнаяСпособность()` |
| КоличествоИтераций | `15` |
| КоличествоИтераций | `0` - определяется адаптивным режимом |
| КоличествоВызововЗаИтерацию | `0` - рассчитывать автоматически |
| КоличествоПрогревочныхИтераций | `6` |
| МинимальноеВремяИтерации | `100` мс |
Expand All @@ -32,6 +32,7 @@

[УстановитьКоличествоИтераций](#установитьколичествоитераций) </br>
[КоличествоИтераций](#количествоитераций) </br>
[ИспользуютсяАдаптивныеИтерации](#используютсяадаптивныеитерации) </br>
[УстановитьКоличествоВызововЗаИтерацию](#установитьколичествовызововзаитерацию) </br>
[КоличествоВызововЗаИтерацию](#количествовызововзаитерацию) </br>
[УстановитьКоличествоПрогревочныхИтераций](#установитьколичествопрогревочныхитераций) </br>
Expand Down Expand Up @@ -89,15 +90,15 @@

| Имя | Тип | Описание |
| -- | -- | -- |
| КоличествоИтераций | Число | Количество измерительных итераций. |
| КоличествоИтераций | Число | Точное число временных измерительных итераций; `0` возвращает адаптивный режим. |

**Возвращаемое значение:**

Тип: [КонфигурацияБенчмарков](КонфигурацияБенчмарков.md).

**Описание:**

Устанавливает число измерительных итераций.
Устанавливает точное число временных измерительных итераций. Значение `0` возвращает адаптивный режим.

## КоличествоИтераций

Expand All @@ -113,7 +114,24 @@

**Описание:**

Возвращает число измерительных итераций.
Возвращает заданное число временных измерительных итераций. Значение `0`
означает, что число итераций определяет адаптивный режим.

## ИспользуютсяАдаптивныеИтерации

**Синтаксис:**

```bsl
ИспользуютсяАдаптивныеИтерации()
```

**Возвращаемое значение:**

Тип: Булево.

**Описание:**

Возвращает `Истина`, если `КоличествоИтераций` равно `0` и для временных измерений применяется адаптивный режим.

## УстановитьКоличествоВызововЗаИтерацию

Expand Down
9 changes: 0 additions & 9 deletions docs/Аннотации.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,6 @@

```bsl
&СтратегияПропускнаяСпособность
&КоличествоИтераций(15)
&КоличествоПрогревочныхИтераций(6)
&МинимальноеВремяИтерации(200)
&АдаптивныеИтерации(
Expand All @@ -203,14 +202,6 @@
КонецПроцедуры
```

Примечания:

- `&КоличествоПрогревочныхИтераций`, `&КоличествоВызововЗаИтерацию`,
`&МинимальноеВремяИтерации` и
`&МинимальноеКоличествоВызововЗаИтерацию` игнорируются в `ХолодныйЗапуск`.
- Если `&КоличествоВызововЗаИтерацию(0)`, число вызовов рассчитывается автоматически.
- У `&АдаптивныеИтерации` и `&СтатистическоеСравнение` параметры задаются по именам; их можно не указывать, чтобы использовать значения по умолчанию.

Подробнее: [Стратегии запуска](СтратегииЗапуска.md), [Управление итерациями и вызовами](УправлениеИтерациямиИВызовами.md).

### Отчет и экспорт
Expand Down
2 changes: 1 addition & 1 deletion docs/МониторингПамяти.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Мониторинг памяти

Включает дополнительный этап измерения аллокаций памяти. При его использовании в отчёте появляется колонка `Allocated` - объём памяти, выделяемый на одну операцию. Полезно для выявления избыточных аллокаций и сравнения алгоритмов по потреблению памяти.
Включает дополнительный этап измерения аллокаций памяти. При его использовании в отчёте появляется колонка `Allocated` - объём памяти, выделяемый на одну операцию. Полезно для выявления избыточных аллокаций и сравнения алгоритмов по потреблению памяти. Для каждого кейса после временных измерений выполняется ровно одна итерация памяти.

## Конфигурирование

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Количество итераций

Контролирует количество измерительных итераций для основных этапов (измерение и память).
Задаёт точное число временных измерительных итераций. Если количество не задано, используется адаптивный режим.

### Аннотация

Expand All @@ -27,11 +27,11 @@ benchos run --iterationCount 25 [FILE]

## Адаптивные итерации

По умолчанию количество измерений фиксировано. Чтобы завершать этап измерения после достижения заданной погрешности, включите адаптивный режим одним из способов ниже.
Адаптивный режим включен по умолчанию. Пока `КоличествоИтераций` не задано, число временных измерений определяется по целевой погрешности. Положительное значение `КоличествоИтераций` задаёт их точное число и имеет приоритет над адаптивным режимом; `УстановитьКоличествоИтераций(0)` возвращает адаптивный режим.

### Аннотация

`&АдаптивныеИтерации` применяется к `ПриСозданииОбъекта`, включает адаптивный режим и принимает необязательные именованные параметры: `МаксимальнаяОтносительнаяПогрешность`, `МинимальноеКоличествоИтераций` и `МаксимальноеКоличествоИтераций`.
`&АдаптивныеИтерации` применяется к `ПриСозданииОбъекта` и задаёт необязательные параметры адаптивного режима: `МаксимальнаяОтносительнаяПогрешность`, `МинимальноеКоличествоИтераций` и `МаксимальноеКоличествоИтераций`.

```bsl
&АдаптивныеИтерации(
Expand All @@ -49,17 +49,16 @@ benchos run --iterationCount 25 [FILE]

```bsl
Конфигурация
.ВключитьАдаптивныеИтерации()
.УстановитьЦелевуюОтносительнуюПогрешность(0.1) // не более 10%: погрешность среднего / среднее при доверительной вероятности 99,9%
.УстановитьМаксимальноеКоличествоАдаптивныхИтераций(100) // не выполнять более 100 измерений
.УстановитьМинимальноеКоличествоАдаптивныхИтераций(15); // выполнить не менее 15 измерений
```

Если цель не достигнута к максимуму, запуск завершается и отчёт получает предупреждение. В фиксированном режиме это же значение служит ориентиром предупреждения о высокой относительной погрешности. Адаптивный режим применяется только к измерениям времени; фиксированный `КоличествоИтераций` остаётся режимом по умолчанию.
Если цель не достигнута к максимуму, запуск завершается и отчёт получает предупреждение. В фиксированном режиме это же значение служит ориентиром предупреждения о высокой относительной погрешности.

### CLI

В CLI передача любой из опций адаптивного режима включает его:
В CLI эти опции задают параметры адаптивного режима:

```bash
benchos run --maxRelativeError 0.1 --minAdaptiveIterationCount 15 --maxAdaptiveIterationCount 100 [FILE]
Expand All @@ -79,8 +78,8 @@ benchos run --maxRelativeError 0.1 --minAdaptiveIterationCount 15 --maxAdaptiveI

### Когда выбирать режим

- Фиксированное число итераций выбирайте для воспроизводимого бюджета измерений.
- Адаптивные итерации - когда важнее завершить замеры после достижения целевой погрешности.
- Укажите количество итераций для воспроизводимого бюджета временных измерений.
- Адаптивные итерации выбирайте, когда допустим переменный бюджет измерений и важнее завершить замеры после достижения целевой погрешности; этот режим включен по умолчанию.
- Статистическое сравнение включайте при наличии эталона и не менее `15` измерений в каждой выборке.

### Доверительный интервал и погрешность
Expand Down
9 changes: 6 additions & 3 deletions docs/ФорматНастроекЗапуска.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,7 @@ benchos run --settings settings.json ./benchmarks

| Поле | JSON-тип | По умолчанию | Допустимые значения и смысл |
| --- | --- | --- | --- |
| `IterationCount` | Число | `15` | Больше `0`. |
| `AdaptiveIterations` | Булево | `false` | Включает остановку измерений по целевой погрешности. |
| `IterationCount` | Число | `0` | `0` включает адаптивное определение числа временных измерений; положительное целое задаёт их точное число. |
| `MaxRelativeError` | Число | `0.1` | Цель адаптивного режима: `Error / Mean`, больше `0`. |
| `MinAdaptiveIterationCount` | Число | `15` | Минимум измерений до проверки погрешности, не меньше `2`; при статистическом сравнении - не меньше `15`. |
| `MaxAdaptiveIterationCount` | Число | `100` | Максимум измерений в адаптивном режиме, не меньше минимума. |
Expand Down Expand Up @@ -140,7 +139,11 @@ benchos run --settings settings.json ./benchmarks
3. Аннотации класса бенчмарка.
4. Значения по умолчанию.

Значение из `--settings` переопределяет аннотацию, только если отличается от библиотечного значения по умолчанию. Поэтому `"IterationCount": 15` не переопределяет `&КоличествоИтераций(10)`. Чтобы переопределить аннотацию через `--settings`, задайте значение, отличное от значения по умолчанию.
### Особые случаи

Для отдельных типов настроек действуют уточнения к этому порядку.

Значение из `--settings` переопределяет аннотацию, только если отличается от библиотечного значения по умолчанию. Исключение — положительное `IterationCount`: его присутствие в JSON значимо. Поэтому `"IterationCount": 15` переопределяет `&КоличествоИтераций(10)`, а `"IterationCount": 0` не переопределяет его.

Для коллекций правило применяется к каждой отдельно: изменённый непустой массив `Parameters`, `ParameterSources`, `Handlers`, `Columns`, `Exporters` или `RuntimeVersions` из `--settings` полностью заменяет одноимённую коллекцию, полученную из аннотаций. Явное `[]` совпадает с библиотечным значением по умолчанию, не считается изменением и потому не очищает коллекцию из аннотаций.

Expand Down
Loading
Loading