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
1 change: 1 addition & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
- [Обработчики событий](ОбработчикиСобытий.md)
- [Статистика](Статистика.md)
- [Сортировка отчета](СортировкаОтчета.md)
- [Экспорт результатов](ЭкспортРезультатов.md)
- [Аннотации](../src/BenchmarkOneScript/annotations/Классы)

## Примеры
Expand Down
2 changes: 2 additions & 0 deletions docs/ОбработчикиСобытий.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
Для изоляции логики подготовки и завершения от измеряемого кода в тестах производительности предусмотрен механизм обработчиков событий.
Используйте специальные аннотации, чтобы определить методы, которые будут выполняться в разных фазах жизненного цикла бенчмарков:

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

#### &ПередВсеми
Аннотация `&ПередВсеми` помечает метод, который выполняется **один раз** перед запуском всех бенчмарков.
Этот метод предназначен для глобальной подготовки данных, инициализации ресурсов (например, подключение к базе, загрузка файлов) или настройки окружения.
Expand Down
87 changes: 87 additions & 0 deletions docs/ЭкспортРезультатов.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Экспорт результатов

**BenchmarkOneScript** позволяет сохранить результаты выполнения бенчмарков в различных форматах. По умолчанию файлы с результатами генерируются в каталоге _./BenchmarkArtifacts_ относительно текущей рабочей директории.

### Настройка каталога артефактов

Каталог для сохранения результатов можно изменить двумя способами:

1. Через аннотацию в коде бенчмарка:

```bsl
&КаталогАртефактов("path/to/artifacts")
```

2. Программно с использованием API конфигурации:

```bsl
Конфигурация.УстановитьКаталогАртефактов("path/to/artifacts")
```

### Аннотации экспортеров

```bsl
&ЭкспортMarkdown
&ЭкспортJson
&ЭкспортXml
&ЭкспортHtml
Процедура ПриСозданииОбъекта()
```

### API

```bsl
// Добавление экспортера (например, для JSON)
Конфигурация.ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Json);
// ЭкспортерыРезультатовБенчмарков.Xml
// ЭкспортерыРезультатовБенчмарков.Html
// ЭкспортерыРезультатовБенчмарков.Markdown

// Получение списка экспортеров
Экспортеры = Конфигурация.Экспортеры();

// Сброс всех экспортеров
Конфигурация.УдалитьЭкспортеры();
```

### Пример

```bsl
&ЭкспортMarkdown
&ЭкспортJson
&ЭкспортXml
&ЭкспортHtml
&КаталогАртефактов("./АртефкатыЗапускаБенчмарков")
Процедура ПриСозданииОбъекта()
КонецПроцедуры

&Бенчмарк
Процедура Бенчмарк() Экспорт
Приостановить(100);
КонецПроцедуры
```

### Вывод

```
BenchmarkOneScript v0.3.1, 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 | Op/s |
|----------|---------:|---------:|---------:|------:|
| Бенчмарк | 100.7 ms | 30.38 us | 117.7 us | 9.934 |

// Легенда
Mean : Арифметическое среднее всех измерений
StdErr : Стандартная ошибка всех измерений
StdDev : Стандартное отклонение всех измерений
Op/s : Операций в секунду
1 ms : 1 Миллисекунда
1 us : 1 Микросекунда

// Артефакты
C:\myapp\АртефкатыЗапускаБенчмарков\ИмяКласса-report.html
C:\myapp\АртефкатыЗапускаБенчмарков\ИмяКласса-report.json
C:\myapp\АртефкатыЗапускаБенчмарков\ИмяКласса-report.md
C:\myapp\АртефкатыЗапускаБенчмарков\ИмяКласса-report.xml
```
2 changes: 2 additions & 0 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@
.ЗависитОт("coloratos", "0.3.0")
.ЗависитОт("fluent", "0.6.1")
.ЗависитОт("lambdas", "0.3.2")
.ЗависитОт("xml-parser", "0.1.1")
.ЗависитОт("logos", "1.7.1")
.ЗависитОт("fs", "1.2.0")
.РазработкаЗависитОт("1testrunner")
.РазработкаЗависитОт("coverage")
.РазработкаЗависитОт("1commands")
Expand Down
15 changes: 15 additions & 0 deletions samples/api/ЭкспортРезультатовПример.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#Использовать benchmark
#Использовать "../benchmarks"

Тип = Тип("БенчмаркБазовый");

Конфигурация = Новый КонфигурацияБенчмарков(Тип);

// Переопределяем каталог артефактов
Конфигурация.УстановитьКаталогАртефактов(".\Артефакты");

// Добавляем экспортеров
Конфигурация.ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Html);
Конфигурация.ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Json);

Бенчмаркинг.Запустить(Тип, Конфигурация);
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
&ЭкспортMarkdown
&ЭкспортJson
&ЭкспортXml
&ЭкспортHtml
Процедура ПриСозданииОбъекта()
КонецПроцедуры

&Бенчмарк
Процедура Бенчмарк() Экспорт
Приостановить(100);
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Аннотация задает каталог для сохранения результатов бенчмарков.
//
// - Применяется только к методу ПриСозданииОбъекта
// - Путь может быть абсолютным или относительным
//
// Пример:
// &КаталогАртефактов("path/to/artifacts")
// Процедура ПриСозданииОбъекта()
// // ...
// КонецПроцедуры
&Аннотация("КаталогАртефактов")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Автоматически генерирует отчет о результатах бенчмарков в формате HTML (.html).
//
// Применяется только к методу ПриСозданииОбъекта.
//
// Пример:
// &ЭкспортHtml
// Процедура ПриСозданииОбъекта()
// // ...
// КонецПроцедуры
&Аннотация("ЭкспортHtml")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Автоматически генерирует отчет о результатах бенчмарков в формате JSON (.json).
//
// Применяется только к методу ПриСозданииОбъекта.
//
// Пример:
// &ЭкспортJson
// Процедура ПриСозданииОбъекта()
// // ...
// КонецПроцедуры
&Аннотация("ЭкспортJson")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Автоматически генерирует отчет о результатах бенчмарков в формате Markdown (.md).
//
// Применяется только к методу ПриСозданииОбъекта.
//
// Пример:
// &ЭкспортMarkdown
// Процедура ПриСозданииОбъекта()
// // ...
// КонецПроцедуры
&Аннотация("ЭкспортMarkdown")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Автоматически генерирует отчет о результатах бенчмарков в формате XML (.xml).
//
// Применяется только к методу ПриСозданииОбъекта.
//
// Пример:
// &ЭкспортXml
// Процедура ПриСозданииОбъекта()
// // ...
// КонецПроцедуры
&Аннотация("ЭкспортXml")
Процедура ПриСозданииОбъекта()
КонецПроцедуры
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
#Использовать asserts
#Использовать coloratos
#Использовать logos
#Использовать fs

Перем _ОбъектБенчмарков; // Экземпляр класса бенчмарков
Перем _Конфигурация; // КонфигурацияБенчмарков
Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков
Перем _СтатистикаСборщикаМусора; // СтатистикаСборщикаМусора
Перем _Хронометр; // Хронометр
Перем _Лог;
Перем _Лог; // Лог

// Запускатель бенчмарков
//
Expand All @@ -30,6 +32,7 @@
//
// Возвращаемое значение:
// Структура:
// * ИмяКласса - Строка - Имя класса
// * ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков
// * Конфигурация - КонфигурацияБенчмарков
// * СредаОкружения - СредаОкруженияБенчмарков
Expand Down Expand Up @@ -61,6 +64,7 @@
Результат = ЗапуститьВсеБенчмарки();

ВывестиРезультатыБенчмарков(Результат);
ЭкспортироватьРезультаты(Результат);

Возврат Результат;

Expand Down Expand Up @@ -571,6 +575,7 @@
Отчет = ПостроительОтчета.Сформировать();

Результат = Новый Структура();
Результат.Вставить("ИмяКласса", Строка(ТипЗнч(_ОбъектБенчмарков)));
Результат.Вставить("ДескрипторыБенчмарков", _ДескрипторыБенчмарков);
Результат.Вставить("Конфигурация", _Конфигурация);
Результат.Вставить("СредаОкружения", Новый СредаОкруженияБенчмарков());
Expand All @@ -581,6 +586,30 @@

КонецФункции

Процедура ЭкспортироватьРезультаты(РезультатыЗапусков)

КаталогАртефактов = _Конфигурация.КаталогАртефактов();
Если Не ЗначениеЗаполнено(КаталогАртефактов) Тогда
Возврат;
КонецЕсли;

ФС.ОбеспечитьПустойКаталог(КаталогАртефактов);

Для Каждого Экспортер Из _Конфигурация.Экспортеры() Цикл
Экспортер.Записать(РезультатыЗапусков);
КонецЦикла;

Артефакты = НайтиФайлы(КаталогАртефактов, "*");
Если Артефакты.Количество() Тогда
ЦветнойВывод.ВывестиСтроку(Символы.ПС + "// Артефакты", "Малиновый");
КонецЕсли;

Для Каждого Артефакт Из Артефакты Цикл
ЦветнойВывод.ВывестиСтроку(Артефакт.ПолноеИмя, "ТемноЖелтый");
КонецЦикла;

КонецПроцедуры

Процедура ВывестиЗаголовокБенчмарка(ДескрипторБенчмарка, Параметры)

Текст = СтрШаблон(Символы.ПС + "// Бенчмарк: %1.%2", ДескрипторБенчмарка.ТипОбъекта(), ДескрипторБенчмарка.Метод());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
Перем _Параметры; // Массив из ПараметрБенчмарка
Перем _Обработчики; // Соответствие
Перем _Колонки; // Массив из Строка - см. КолонкиОтчетаБенчмарков
Перем _КаталогАртефактов; // Строка
Перем _Экспортеры; // Массив из Объект

// Конфигурация бенчмарков
//
Expand All @@ -24,10 +26,12 @@
КоличествоПрогревочныхИтераций = 6;
МинимальноеВремяИтерации = 100;
МинимальноеКоличествоВызововЗаИтерацию = 4;
КаталогАртефактов = ".\BenchmarkArtifacts";

_Параметры = Новый Массив();
_Обработчики = Новый Соответствие();
_Колонки = Новый Массив();
_Экспортеры = Новый Массив();
_ТребуетсяМониторингПамяти = Ложь;

УстановитьСтратегию(СтратегииЗапускаБенчмарка.ПропускнаяСпособность);
Expand All @@ -36,6 +40,7 @@
УстановитьКоличествоПрогревочныхИтераций(КоличествоПрогревочныхИтераций);
УстановитьМинимальноеВремяИтерации(МинимальноеВремяИтерации);
УстановитьМинимальноеКоличествоВызововЗаИтерацию(МинимальноеКоличествоВызововЗаИтерацию);
УстановитьКаталогАртефактов(КаталогАртефактов);

Если Не Источник = Неопределено Тогда
ИзвлекательКонфигурацииБенчмарков.Извлечь(Источник, ЭтотОбъект);
Expand Down Expand Up @@ -512,6 +517,55 @@
Возврат Новый Массив(Новый ФиксированныйМассив(_Колонки));
КонецФункции

// Каталог артефактов
//
// Возвращаемое значение:
// Строка
Функция КаталогАртефактов() Экспорт
Возврат _КаталогАртефактов;
КонецФункции

// Устанавливает каталог артефактов
//
// Параметры:
// КаталогАртефактов - Строка
//
// Возвращаемое значение:
// ЭтотОбъект
Функция УстановитьКаталогАртефактов(КаталогАртефактов) Экспорт
_КаталогАртефактов = КаталогАртефактов;
Возврат ЭтотОбъект;
КонецФункции

// Экспортеры
//
// Возвращаемое значение:
// Массив из см. ЭкспортерыРезультатовБенчмарков
Функция Экспортеры() Экспорт
Возврат Новый Массив(Новый ФиксированныйМассив(_Экспортеры));
КонецФункции

// Добавляет экспортер
//
// Параметры:
// Экспортер - см. ЭкспортерыРезультатовБенчмарков
//
// Возвращаемое значение:
// ЭтотОбъект
Функция ДобавитьЭкспортер(Экспортер) Экспорт
_Экспортеры.Добавить(Экспортер);
Возврат ЭтотОбъект;
КонецФункции

// Сброс всех экспортеров
//
// Возвращаемое значение:
// ЭтотОбъект
Функция УдалитьЭкспортеры() Экспорт
_Экспортеры.Очистить();
Возврат ЭтотОбъект;
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции
Expand Down
Loading
Loading