diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..d5b15ac --- /dev/null +++ b/docs/README.md @@ -0,0 +1,17 @@ +# Документация + +## Темы +- [Быстрый старт](БыстрыйСтарт.md) +- [Запуск бенчмарков](ЗапускБенчмарков.md) +- [Выбор стратегии запуска](ВыборСтратегииЗапуска.md) +- [Параметризация](Параметризация.md) +- [Эталоны](Эталоны.md) +- [Мониторинг памяти](МониторингПамяти.md) +- [Обработчики событий](ОбработчикиСобытий.md) +- [Статистика](Статистика.md) +- [Сортировка отчета](СортировкаОтчета.md) +- [Аннотации](../src/BenchmarkOneScript/annotations/Классы) + +## Примеры +- [Бенчмарки](../samples/benchmarks/Классы) +- [API](../samples/api) diff --git "a/docs/\320\221\321\213\321\201\321\202\321\200\321\213\320\271\320\241\321\202\320\260\321\200\321\202.md" "b/docs/\320\221\321\213\321\201\321\202\321\200\321\213\320\271\320\241\321\202\320\260\321\200\321\202.md" new file mode 100644 index 0000000..eacd050 --- /dev/null +++ "b/docs/\320\221\321\213\321\201\321\202\321\200\321\213\320\271\320\241\321\202\320\260\321\200\321\202.md" @@ -0,0 +1,92 @@ +# Быстрый старт + +## 1. Установка + +```bash +opm install benchmark +``` + +## 2. Создание бенчмарка + +Создайте класс с методами, помеченными аннотацией `&Бенчмарк`, где каждый метод реализует тестируемую логику. +В следующем примере мы сравниваем алгоритмы конкатенации строк через оператор `+` и метод `СтрСоединить`: + +```bsl +// КонкатенацияСтрок.os + +&Параметры(100, 1000) +Перем Количество Экспорт; +Перем Подстрока; + +&МониторингПамяти +Процедура ПриСозданииОбъекта() + Подстрока = "Просто текст"; +КонецПроцедуры + +&Бенчмарк +&Эталон +Процедура ОператорСложения() Экспорт + Текст = ""; + Для НомерПодстроки = 1 По Количество Цикл + Текст = Текст + Подстрока; + КонецЦикла; +КонецПроцедуры + +&Бенчмарк +Процедура МассивПодстрок() Экспорт + МассивПодстрок = Новый Массив(); + Для НомерПодстроки = 1 По Количество Цикл + МассивПодстрок.Добавить(Подстрока); + КонецЦикла; + + Текст = СтрСоединить(МассивПодстрок); +КонецПроцедуры +``` +## 3. Запуск бенчмарков + +Запустите бенчмарки одним из следующих способов: + +**CLI:** + +```bash +benchos run [FILE] +``` + +`FILE` - имя файла класса бенчмарков в текущем каталоге, либо полный путь к нему + +**API:** + +```bsl +#Использовать benchmark +#Использовать "." + +Результат = Бенчмаркинг.Запустить(Тип("КонкатенацияСтрок")); +``` + +## 4. Просмотр результатов + +После завершения тестов в консоли будет отображена подробная сводная таблица, оформленная в формате Markdown: + +``` +BenchmarkOneScript v0.1.0, OneScript v2.0.0.567-rc7-29039316, Microsoft Windows NT 10.0.20348.0 \ +Intel Core i7-8700 CPU 3.20GHz (Max: 3.19GHz) (Coffee Lake), 1 CPU, 12 logical and 6 physical cores + +| Method | Количество | Baseline | Mean | StdErr | StdDev | Median | Ratio | Op/s | Allocated | +|------------------|-----------:|----------|-----------:|-----------:|------------:|-----------:|------:|---------:|------------:| +| МассивПодстрок | 100 | false | 75.44 us | 66.16 ns | 362.4 ns | 74.74 us | 1.624 | 13,256.1 | 17.77 KB | +| ОператорСложения | 100 | true | 46.51 us | 88.31 ns | 483.7 ns | 45.90 us | 1 | 21,499.5 | 126.5 KB | +| МассивПодстрок | 1,000 | false | 686.0 us | 691.6 ns | 3,787.9 ns | 680.1 us | 0.505 | 1,457.8 | 165.4 KB | +| ОператорСложения | 1,000 | true | 1,365.8 us | 4,913.6 ns | 26,912.8 ns | 1,341.6 us | 1 | 732.1 | 11,809.0 KB | + +// Легенда +Количество : Значение параметра 'Количество' +Mean : Арифметическое среднее всех измерений +StdErr : Стандартная ошибка всех измерений +StdDev : Стандартное отклонение всех измерений +Ratio : Среднее коэффициентов отношений ([Mean] / [Baseline Mean]) +Median : Значение, разделяющее упорядоченные измерения на две равные части +Op/s : Операций в секунду +Allocated : Выделяемая память на одну операцию +1 us : 1 Микросекунда +1 ns : 1 Наносекунда +``` diff --git "a/docs/\320\222\321\213\320\261\320\276\321\200\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260.md" "b/docs/\320\222\321\213\320\261\320\276\321\200\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260.md" new file mode 100644 index 0000000..8776412 --- /dev/null +++ "b/docs/\320\222\321\213\320\261\320\276\321\200\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260.md" @@ -0,0 +1,94 @@ +# Выбор стратегии запуска + +## ПропускнаяСпособность + +Стратегия используется по умолчанию. Оптимальна для микробенчмаркинга. +Автоматическии подбирает количество вызовов за итерацию. Выполняет прогревочные итерации для стабилизации результатов. + +### Аннотация + +```bsl +&СтратегияПропускнаяСпособность +Процедура ПриСозданииОбъекта() +``` + +### API + +```bsl +Конфигурация.УстановитьСтратегию(СтратегииЗапускаБенчмарка.ПропускнаяСпособность) +``` + +## ХолодныйЗапуск + +Стратегия для оценки производительности при первом запуске без предварительной оптимизации (Отключает оценочные и прогревочные итерации). + +### Аннотация + +```bsl +&СтратегияХолодныйЗапуск +Процедура ПриСозданииОбъекта() +``` + +### API + +```bsl +Конфигурация.УстановитьСтратегию(СтратегииЗапускаБенчмарка.ХолодныйЗапуск) +``` + +### Пример + +```bsl +Перем ЭтоПервыйВызов; + +&СтратегияХолодныйЗапуск +&КоличествоИтераций(5) +&КолонкаМин +&КолонкаМакс +Процедура ПриСозданииОбъекта() + ЭтоПервыйВызов = Истина; +КонецПроцедуры + +&Бенчмарк +Процедура Бенчмарк() Экспорт + + Если ЭтоПервыйВызов Тогда + ЭтоПервыйВызов = Ложь; + Приостановить(1000); + Иначе + Приостановить(10); + КонецЕсли; + +КонецПроцедуры +``` + +### Вывод + +```md +// Бенчмарк: МойКласс.Бенчмарк + +Измерение 1 : 1 op, 1.001 s, 1.001 s/op +Измерение 2 : 1 op, 10.34 ms, 10.34 ms/op +Измерение 3 : 1 op, 10.48 ms, 10.48 ms/op +Измерение 4 : 1 op, 10.19 ms, 10.19 ms/op +Измерение 5 : 1 op, 10.67 ms, 10.67 ms/op + +// Сводка + +BenchmarkOneScript v0.1.0, OneScript v2.0.0.567-rc7-29039316, Microsoft Windows NT 10.0.20348.0 \ +Intel Core i7-8700 CPU 3.20GHz (Max: 3.19GHz) (Coffee Lake), 1 CPU, 12 logical and 6 physical cores + +| Method | Mean | StdErr | StdDev | Min | Median | Max | Op/s | +|----------|---------:|---------:|---------:|---------:|---------:|--------:|------:| +| Бенчмарк | 208.6 ms | 88.62 ms | 198.2 ms | 10.19 ms | 10.48 ms | 1.001 s | 4.794 | + +// Легенда +Mean : Арифметическое среднее всех измерений +StdErr : Стандартная ошибка всех измерений +StdDev : Стандартное отклонение всех измерений +Min : Минимум +Median : Значение, разделяющее упорядоченные измерения на две равные части +Max : Максимум +Op/s : Операций в секунду +1 ms : 1 Миллисекунда +1 s : 1 Секунда +``` diff --git "a/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" "b/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" new file mode 100644 index 0000000..94e6ff9 --- /dev/null +++ "b/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" @@ -0,0 +1,62 @@ +# Запуск бенчмарков + +## CLI + +```bash +benchos run [FILE] +``` + +`FILE` - имя файла класса бенчмарков в текущем каталоге, либо полный путь к нему + +**Примеры использования:** + +```bash +# Запуск по имени класса (файл МойКласс.os должен существовать в текущей директории) +benchos run МойКласс + +# Запуск по имени файла в текущей директории +benchos run МойКласс.os + +# Запуск по абсолютному пути +benchos run /path/to/МойКласс.os +``` + +## API + +### Базовый сценарий + +```bsl +// Запуск по типу класса бенчмарков +Результат = Бенчмаркинг.Запустить(Тип("МойКласс")); + +// Запуск через экземпляр класса бенчмарков +Результат = Бенчмаркинг.Запустить(Новый МойКласс); +``` + +### Запуск отдельных бенчмарков + +```bsl +ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип("МойКласс")); + +// Запуск конкретного бенчмарка +ДескрипторБенчмарка = ДескрипторыБенчмарков.НайтиПоИмени("МойБенчмарк"); +Результат = Бенчмаркинг.Запустить(ДескрипторБенчмарка); + +// Запуск отфильтрованного списка +ДескрипторыБенчмарков.Фильтровать("Элемент -> Элемент.Категория() = ""Б"""); +Результат = Бенчмаркинг.Запустить(ДескрипторыБенчмарков); +``` + +### Передача конфигурации + +```bsl +// Создание новой конфигурации +Конфигурация = Новый КонфигурацияБенчмарков(); +Конфигурация.УстановитьКоличествоИтераций(10); +Результат = Бенчмаркинг.Запустить(Тип("МойКласс"), Конфигурация); + +// Модификация существующей конфигурации +Конфигурация = Новый КонфигурацияБенчмарков(Тип("МойКласс")); +Конфигурация.УстановитьКоличествоИтераций(10); +Результат = Бенчмаркинг.Запустить(Тип("МойКласс"), Конфигурация); +``` diff --git "a/docs/\320\234\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263\320\237\320\260\320\274\321\217\321\202\320\270.md" "b/docs/\320\234\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263\320\237\320\260\320\274\321\217\321\202\320\270.md" new file mode 100644 index 0000000..6f6dc45 --- /dev/null +++ "b/docs/\320\234\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263\320\237\320\260\320\274\321\217\321\202\320\270.md" @@ -0,0 +1,41 @@ +# Мониторинг памяти + +Для анализа аллокаций предусмотрена аннотация `&МониторингПамяти`. + +### Аннотация + +```bsl +&МониторингПамяти +Процедура ПриСозданииОбъекта() +``` + +### API + +```bsl +Конфигурация.ДобавитьМониторингПамяти(); +``` + +### Пример + +```bsl +&МониторингПамяти +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Бенчмарк +&Параметры(100) +&Параметры(1000) +Процедура Бенчмарк(Количество) Экспорт + Строка = ""; + Для к = 1 По Количество Цикл + Строка = Строка + "Просто текст"; + КонецЦикла; +КонецПроцедуры +``` + +### Вывод + +| Method | Количество | Mean | StdErr | StdDev | Median | Op/s | Allocated | +|----------|-----------:|-----------:|-----------:|------------:|-----------:|---------:|------------:| +| Бенчмарк | 100 | 43.81 us | 97.74 ns | 535.4 ns | 42.87 us | 22,826.5 | 126.9 KB | +| Бенчмарк | 1,000 | 1,298.2 us | 5,433.7 ns | 29,761.8 ns | 1,252.7 us | 770.3 | 11,809.4 KB | diff --git "a/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" "b/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" new file mode 100644 index 0000000..0803907 --- /dev/null +++ "b/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" @@ -0,0 +1,69 @@ +# Обработчики событий + +Для изоляции логики подготовки и завершения от измеряемого кода в тестах производительности предусмотрен механизм обработчиков событий. +Используйте специальные аннотации, чтобы определить методы, которые будут выполняться в разных фазах жизненного цикла бенчмарков: + +#### &ПередВсеми +Аннотация `&ПередВсеми` помечает метод, который выполняется **один раз** перед запуском всех бенчмарков. +Этот метод предназначен для глобальной подготовки данных, инициализации ресурсов (например, подключение к базе, загрузка файлов) или настройки окружения. + +#### &ПослеВсех +Метод с аннотацией `&ПослеВсех` вызывается **после завершения всех бенчмарков**. +Он используется для финализации: освобождения ресурсов (закрытие соединений), записи итоговых отчетов или выполнения других действий. + +#### &ПередКаждым +Аннотация `&ПередКаждым` указывает, что метод должен выполняться **перед каждым запуском бенчмарка**. +Это позволяет подготовить контекст для отдельного теста — например, сбросить состояние объекта, сгенерировать тестовые данные или выполнить предварительные проверки. + +#### &ПослеКаждого +Метод с аннотацией `&ПослеКаждого` вызывается **после каждого выполнения бенчмарка**. +Он используется для постобработки: валидации результатов, сброса временных значений или освобождения ресурсов, которые создавались для конкретного теста. + +### API + +```bsl +// Регистрация обработчика из произвольного объекта через делегат +Конфигурация.ДобавитьОбработчикСобытия( + СобытияБенчмарков.ПередВсеми, + Новый Делегат(Объект, "Инициализация") +); + +// Регистрация обработчика из класса бенчмарка +Конфигурация.ДобавитьОбработчикСобытия + СобытияБенчмарков.ПослеВсех, + "Завершение" +); + +// Удаление всех обработчиков для события +Конфигурация.УдалитьОбработчикиСобытия(СобытияБенчмарков.ПередКаждым); +``` + +### Пример + +```bsl +Перем ДвоичныеДанные; + +&ПередВсеми +Процедура Инициализация(Контекст) Экспорт + ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки("Много данных"); +КонецПроцедуры + +&ПослеВсех +Процедура Завершение(Контекст) Экспорт + ДвоичныеДанные = Неопределено; +КонецПроцедуры + +&Бенчмарк +Процедура SHA256() Экспорт + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256); + ХешированиеДанных.Добавить(ДвоичныеДанные); + ХешСумма = ХешированиеДанных.ХешСумма; +КонецПроцедуры + +&Бенчмарк +Процедура MD5() Экспорт + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); + ХешированиеДанных.Добавить(ДвоичныеДанные); + ХешСумма = ХешированиеДанных.ХешСумма; +КонецПроцедуры +``` diff --git "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" new file mode 100644 index 0000000..85ae3c7 --- /dev/null +++ "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" @@ -0,0 +1,47 @@ +# Параметризация + +С помощью аннотации `&Параметры` можно задать параметры для полей класса и методов бенчмарков. + +### API + +```bsl +// Поле класса +Конфигурация.ДобавитьПараметр("ИмяПоля", 100); +``` + +```bsl +// Параметры метода бенчмарка +Параметры = Новый Массив(); +Параметры.Добавить(100); +Параметры.Добавить(Ложь); +ДескрипторБенчмарка.ДобавитьПараметры(Параметры); +``` + +### Пример + +```bsl +&Параметры(5, 0) +Перем ДобавляемаяЗадержка Экспорт; // Число + +&Бенчмарк +&Параметры(100, 10) +&Параметры(100, 20) +&Параметры(200, 10) +&Параметры(200, 20) +Процедура Бенчмарк(Задержка1, Задержка2) Экспорт + Приостановить(Задержка1 + Задержка2 + ДобавляемаяЗадержка); +КонецПроцедуры +``` + +### Вывод + +| Method | ДобавляемаяЗадержка | Задержка1 | Задержка2 | Mean | StdErr | StdDev | Median | Op/s | +|----------|--------------------:|----------:|----------:|---------:|---------:|---------:|---------:|------:| +| Бенчмарк | 0 | 100 | 10 | 110.9 ms | 5.608 us | 21.72 us | 110.9 ms | 9.018 | +| Бенчмарк | 0 | 100 | 20 | 120.9 ms | 6.286 us | 24.35 us | 120.9 ms | 8.272 | +| Бенчмарк | 0 | 200 | 10 | 210.8 ms | 9.394 us | 36.38 us | 210.8 ms | 4.743 | +| Бенчмарк | 0 | 200 | 20 | 220.9 ms | 5.035 us | 19.50 us | 220.9 ms | 4.526 | +| Бенчмарк | 5 | 100 | 10 | 115.9 ms | 6.362 us | 24.64 us | 115.9 ms | 8.628 | +| Бенчмарк | 5 | 100 | 20 | 126.0 ms | 4.250 us | 16.46 us | 126.0 ms | 7.939 | +| Бенчмарк | 5 | 200 | 10 | 215.9 ms | 8.525 us | 33.02 us | 215.9 ms | 4.632 | +| Бенчмарк | 5 | 200 | 20 | 225.9 ms | 5.786 us | 22.41 us | 225.9 ms | 4.427 | diff --git "a/docs/\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260.md" "b/docs/\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260.md" new file mode 100644 index 0000000..9cba8e0 --- /dev/null +++ "b/docs/\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260.md" @@ -0,0 +1,59 @@ +# Сортировка отчета + +### Аннотации + +```bsl +// Сортировка результатов по убыванию производительности (от лучшего к худшему) +&СортировкаОтБыстрыхКМедленным +Процедура ПриСозданииОбъекта() + +// Сортировка результатов по возрастанию времени выполнения (от худшего к лучшему) +&СортировкаОтМедленныхКБыстрым +Процедура ПриСозданииОбъекта() + +// Сортировка результатов по наименованию метода бенчмарка +&СортировкаПоМетоду +Процедура ПриСозданииОбъекта() +``` + +### API + +```bsl +Конфигурация.УстановитьСортировкуОтчета(СортировкиОтчетаБенчмарков.ПоУмолчанию); +Конфигурация.УстановитьСортировкуОтчета(СортировкиОтчетаБенчмарков.ОтБыстрыхКМедленным); +Конфигурация.УстановитьСортировкуОтчета(СортировкиОтчетаБенчмарков.ОтМедленныхКБыстрым); +Конфигурация.УстановитьСортировкуОтчета(СортировкиОтчетаБенчмарков.ПоМетоду); +``` + +### Пример + +```bsl +&Параметры(1, 2, 3) +Перем Множитель Экспорт; + +&СортировкаОтБыстрыхКМедленным +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +&Бенчмарк +Процедура Медленный() Экспорт + Приостановить(Множитель * 20); +КонецПроцедуры + +&Бенчмарк +Процедура Быстрый() Экспорт + Приостановить(Множитель * 10); +КонецПроцедуры +``` + +### Вывод + +| Method | Множитель | Mean | StdErr | StdDev | Median | Op/s | +|-----------|----------:|---------:|---------:|---------:|---------:|------:| +| Быстрый | 1 | 10.99 ms | 3.825 us | 14.82 us | 10.99 ms | 90.99 | +| Медленный | 1 | 21.00 ms | 15.74 us | 60.97 us | 20.97 ms | 47.61 | +| Быстрый | 2 | 21.03 ms | 24.79 us | 96.00 us | 20.92 ms | 47.54 | +| Быстрый | 3 | 30.92 ms | 6.393 us | 24.76 us | 30.97 ms | 32.35 | +| Медленный | 2 | 40.90 ms | 7.477 us | 28.96 us | 40.95 ms | 24.45 | +| Медленный | 3 | 60.89 ms | 5.775 us | 22.37 us | 60.91 ms | 16.42 | + diff --git "a/docs/\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\260.md" "b/docs/\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\260.md" new file mode 100644 index 0000000..f3aea31 --- /dev/null +++ "b/docs/\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\260.md" @@ -0,0 +1,77 @@ +# Статистика + +Для детального анализа производительности предусмотрено добавление специализированных статистических показателей. + +## Min и Max + +#### Аннотации + +```bsl +&КолонкаМин +&КолонкаМакс +Процедура ПриСозданииОбъекта() +``` + +#### API + +```bsl +Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Мин); +Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Макс); +``` + +### Пример вывода + +| Method | Mean | StdErr | StdDev | Min | Median | Max | Op/s | +|----------|---------:|---------:|---------:|---------:|---------:|--------:|------:| +| Бенчмарк | 208.6 ms | 88.62 ms | 198.2 ms | 10.19 ms | 10.48 ms | 1.001 s | 4.794 | + +## Квартили + +#### Аннотации + +```bsl +&КолонкаНижнийКвартиль +&КолонкаВерхнийКвартиль +Процедура ПриСозданииОбъекта() +``` + +#### API + +```bsl +Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.НижнийКвартиль); +Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.ВерхнийКвартиль); +``` + +### Пример вывода + +| Method | Mean | StdErr | StdDev | Q1 | Median | Q3 | Op/s | +|----------|---------:|---------:|---------:|---------:|---------:|---------:|------:| +| Бенчмарк | 26.55 ms | 1.849 ms | 7.160 ms | 7.625 us | 18.34 ms | 58.42 ms | 37.67 | + +## Процентили + +#### Аннотации + +```bsl +// Процентили по умолчанию +&КолонкаПроцентиль +Процедура ПриСозданииОбъекта() + +// Пользовательские процентили +&КолонкаПроцентиль(10, 40, 60, 80) +Процедура ПриСозданииОбъекта() +``` + +#### API + +```bsl +Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Процентиль); // Процентили по умолчанию +Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Процентиль(10)); // 10-й процентиль +Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Процентиль(40)); // 40-й процентиль +``` + +### Пример вывода + +| Method | Mean | StdErr | StdDev | Median | P0 | P50 | P80 | P85 | P95 | P100 | Op/s | +|----------|---------:|---------:|---------:|---------:|---------:|---------:|---------:|---------:|---------:|---------:|------:| +| Бенчмарк | 27.07 ms | 356.8 us | 1.382 ms | 28.69 ms | 15.30 ms | 28.69 ms | 30.03 ms | 30.49 ms | 33.69 ms | 33.70 ms | 36.94 | diff --git "a/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" "b/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" new file mode 100644 index 0000000..933fbd7 --- /dev/null +++ "b/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" @@ -0,0 +1,87 @@ +# Эталоны + +Для обозначения эталонного метода бенчмарка используйте аннотацию `&Эталон`. +Это позволяет сравнивать производительность других методов с выбранным эталоном. + +### API + +```bsl +// Установка текущего бенчмарка в качестве эталона +ДескрипторБенчмарка.ИспользоватьКакЭталон(); + +// Снятие эталонного статуса с бенчмарка +ДескрипторБенчмарка.ИспользоватьКакЭталон(Ложь); +``` + +### Пример + +```bsl +&Бенчмарк +Процедура Задержка50() Экспорт + Приостановить(50); +КонецПроцедуры + +&Бенчмарк +&Эталон +Процедура Задержка100() Экспорт + Приостановить(100); +КонецПроцедуры + +&Бенчмарк +Процедура Задержка150() Экспорт + Приостановить(150); +КонецПроцедуры +``` + +### Вывод + +В отчете автоматически добавляется колонка `Ratio`, показывающая отношение среднего времени выполнения (Mean) к эталону. + +| Method | Baseline | Mean | StdErr | StdDev | Ratio | Median | Op/s | +|-------------|----------|---------:|---------:|---------:|------:|---------:|------:| +| Задержка100 | true | 100.9 ms | 7.983 us | 30.92 us | 1 | 100.9 ms | 9.911 | +| Задержка150 | false | 150.9 ms | 8.829 us | 34.19 us | 1.495 | 150.9 ms | 6.628 | +| Задержка50 | false | 50.92 ms | 5.239 us | 20.29 us | 0.505 | 50.93 ms | 19.64 | + +## Эталоны по категориям + +Для использования нескольких эталонов в одном классе применяйте категории. Каждая категория может иметь собственный эталон. + +### Пример + +```bsl +&Бенчмарк +&Категория("Быстрый") +&Эталон +Процедура Задержка50() Экспорт + Приостановить(50); +КонецПроцедуры + +&Бенчмарк +&Категория("Быстрый") +Процедура Задержка100() Экспорт + Приостановить(100); +КонецПроцедуры + +&Бенчмарк +&Категория("Медленный") +&Эталон +Процедура Задержка300() Экспорт + Приостановить(300); +КонецПроцедуры + +&Бенчмарк +&Категория("Медленный") +Процедура Задержка350() Экспорт + Приостановить(350); +КонецПроцедуры +``` + +### Вывод + +| Method | Categories | Baseline | Mean | StdErr | StdDev | Ratio | Median | Op/s | +|-------------|------------|----------|---------:|---------:|---------:|------:|---------:|------:| +| Задержка50 | Быстрый | true | 50.90 ms | 6.702 us | 25.96 us | 1 | 50.92 ms | 19.65 | +| Задержка100 | Быстрый | false | 100.9 ms | 7.711 us | 29.86 us | 1.983 | 100.9 ms | 9.910 | +| Задержка300 | Медленный | true | 300.8 ms | 8.119 us | 31.44 us | 1 | 300.8 ms | 3.324 | +| Задержка350 | Медленный | false | 350.9 ms | 5.142 us | 19.91 us | 1.166 | 350.9 ms | 2.850 |