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
27 changes: 27 additions & 0 deletions benchmarks/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Бенчмарки BenchmarkOneScript

Каталог содержит короткий набор бенчмарков для контроля накладных расходов и масштабируемости самой библиотеки.

## Состав

- [БенчмаркНакладныхРасходов](БенчмаркНакладныхРасходов.os) — нижняя граница измерений на пустом и контролируемом методах.
- [БенчмаркХолодногоЗапуска](БенчмаркХолодногоЗапуска.os) — первый вызов пустого метода в изолированном процессе.
- [БенчмаркГенерацииКейсов](БенчмаркГенерацииКейсов.os) — комбинирование параметров и создание кейсов.
- [БенчмаркПостроенияОтчета](БенчмаркПостроенияОтчета.os) — построение отчёта при росте числа кейсов.
- [БенчмаркРасчетаСтатистики](БенчмаркРасчетаСтатистики.os) — расчёт среднего, квартилей, отклонения и других показателей.
- [БенчмаркОтносительнойСтатистики](БенчмаркОтносительнойСтатистики.os) — расчёт отношений замеров бенчмарка и эталона.
- [БенчмаркСериализацииРезультатов](БенчмаркСериализацииРезультатов.os) — преобразование результатов в JSON и обратно.

## Запуск

Весь набор:

```bash
becnhos run ./benchmarks
```

Отдельный бенчмарк:

```bash
becnhos run ./benchmarks/БенчмаркНакладныхРасходов.os
```
1 change: 1 addition & 0 deletions benchmarks/oscript.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lib.system = ../oscript_modules
68 changes: 68 additions & 0 deletions benchmarks/БенчмаркГенерацииКейсов.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
&Параметры(10, 100, 1000)
Перем КоличествоКомбинаций Экспорт; // Число

Перем ПараметрА Экспорт; // Число
Перем ПараметрБ Экспорт; // Число

Перем _Конфигурация; // КонфигурацияБенчмарков
Перем _Комбинатор; // КомбинаторПараметровБенчмарка
Перем _Генератор; // ГенераторКейсовБенчмарков
Перем _Результат; // Массив

#Область ОбработчикиСобытий

// Создает бенчмарк генерации кейсов.
&КоличествоИтераций(10)
&КоличествоПрогревочныхИтераций(4)
&МониторингПамяти
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Подготавливает синтетическую конфигурацию с заданным количеством комбинаций параметров.
&ПередКаждымКейсом
Процедура ПодготовитьГенерациюКейсов(Контекст) Экспорт

_Конфигурация = Новый КонфигурацияБенчмарков();
ДобавитьЗначенияПараметра(_Конфигурация, "ПараметрА", 10);
ДобавитьЗначенияПараметра(_Конфигурация, "ПараметрБ", КоличествоКомбинаций / 10);

_Комбинатор = Новый КомбинаторПараметровБенчмарка();

ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков();
ДескрипторыБенчмарков.Добавить(
Новый ДескрипторБенчмарка(ТипЗнч(ЭтотОбъект), "СгенерироватьКейсы")
);

_Генератор = Новый ГенераторКейсовБенчмарков(ДескрипторыБенчмарков, _Конфигурация);

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

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

#Область Бенчмарки

// Формирует декартово произведение параметров синтетической конфигурации.
&Бенчмарк
Процедура СкомбинироватьПараметры() Экспорт
_Результат = _Комбинатор.Комбинировать(_Конфигурация.Параметры());
КонецПроцедуры

// Генерирует все кейсы для синтетической конфигурации.
&Бенчмарк
Процедура СгенерироватьКейсы() Экспорт
_Результат = _Генератор.СгенерироватьВсеКейсы();
КонецПроцедуры

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

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

Процедура ДобавитьЗначенияПараметра(Конфигурация, ИмяПараметра, КоличествоЗначений)

Для Значение = 1 По КоличествоЗначений Цикл
Конфигурация.ДобавитьПараметр(ИмяПараметра, Значение);
КонецЦикла;

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

#КонецОбласти
27 changes: 27 additions & 0 deletions benchmarks/БенчмаркНакладныхРасходов.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Перем _Счетчик; // Число

#Область ОбработчикиСобытий

// Создает бенчмарк накладных расходов запуска методов.
&КоличествоИтераций(10)
&КоличествоПрогревочныхИтераций(4)
Процедура ПриСозданииОбъекта()
_Счетчик = 0;
КонецПроцедуры

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

#Область Бенчмарки

// Измеряет накладные расходы вызова пустого метода.
&Бенчмарк
Процедура ПустойМетод() Экспорт
КонецПроцедуры

// Измеряет накладные расходы вызова метода с минимальной операцией.
&Бенчмарк
Процедура КонтрольнаяОперация() Экспорт
_Счетчик = _Счетчик + 1;
КонецПроцедуры

#КонецОбласти
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
&Параметры(15, 50, 100)
Перем КоличествоЗамеров Экспорт; // Число

Перем _ТекущаяСтатистика; // СтатистикаБенчмарка
Перем _ЭталоннаяСтатистика; // СтатистикаБенчмарка
Перем _Результат; // СтатистикаБенчмарка

#Область ОбработчикиСобытий

// Создает бенчмарк расчета относительной статистики.
&КоличествоИтераций(10)
&КоличествоПрогревочныхИтераций(4)
&МониторингПамяти
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Подготавливает два независимых набора положительных замеров одинаковой длины.
&ПередКаждымКейсом
Процедура ПодготовитьСтатистику(Контекст) Экспорт

_ТекущаяСтатистика = СоздатьСтатистику(1.2, 80, 3);
_ЭталоннаяСтатистика = СоздатьСтатистику(1, 64, 1);

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

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

#Область Бенчмарки

// Рассчитывает отношение текущей статистики к эталонной.
&Бенчмарк
Процедура РассчитатьОтносительнуюСтатистику() Экспорт
_Результат = _ТекущаяСтатистика.Разделить(_ЭталоннаяСтатистика);
КонецПроцедуры

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

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

Функция СоздатьСтатистику(МножительВремени, МножительПамяти, Смещение)

ЗамерыВремени = Новый Массив(КоличествоЗамеров);
ЗамерыПамяти = Новый Массив(КоличествоЗамеров);

Для Индекс = 0 По КоличествоЗамеров - 1 Цикл
ЗамерыВремени[Индекс] = (Индекс + 1) * МножительВремени + Смещение;
ЗамерыПамяти[Индекс] = (Индекс + 1) * МножительПамяти + Смещение;
КонецЦикла;

Замеры = Новый Структура(
"ЗамерыВремени, ЗамерыПамяти",
ЗамерыВремени,
ЗамерыПамяти);

Возврат Новый СтатистикаБенчмарка(Замеры);

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

#КонецОбласти
65 changes: 65 additions & 0 deletions benchmarks/БенчмаркПостроенияОтчета.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
&Параметры(10, 100, 1000)
Перем КоличествоКейсов Экспорт; // Число

Перем _РезультатЗапуска; // РезультатЗапускаБенчмарков

#Область ОбработчикиСобытий

// Создает бенчмарк построения отчета.
&КоличествоИтераций(10)
&КоличествоПрогревочныхИтераций(4)
&МониторингПамяти
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Подготавливает синтетический результат запуска с заданным количеством кейсов.
&ПередКаждымКейсом
Процедура ПодготовитьРезультатЗапуска(Контекст) Экспорт

_РезультатЗапуска = Новый РезультатЗапускаБенчмарков();
Дескриптор = Новый ДескрипторБенчмарка(ТипЗнч(ЭтотОбъект), "ПостроитьОтчет");
_РезультатЗапуска.ДескрипторыБенчмарков.Добавить(Дескриптор);

Для Идентификатор = 1 По КоличествоКейсов Цикл
РезультатКейса = Новый РезультатЗапускаКейса();
РезультатКейса.Кейс = Новый КейсБенчмарка(Идентификатор, Дескриптор);
РезультатКейса.Статистика = СоздатьСтатистику();
_РезультатЗапуска.Запуски.Добавить(РезультатКейса);
КонецЦикла;

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

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

#Область Бенчмарки

// Формирует отчет по подготовленным результатам запуска кейсов.
&Бенчмарк
Процедура ПостроитьОтчет() Экспорт
Отчет = Новый ПостроительОтчетаБенчмарков(_РезультатЗапуска).Сформировать();
КонецПроцедуры

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

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

Функция СоздатьСтатистику()

ЗамерыВремени = Новый Массив();
ЗамерыПамяти = Новый Массив();

Для Значение = 1 По 5 Цикл
ЗамерыВремени.Добавить(Значение);
ЗамерыПамяти.Добавить(Значение * 64);
КонецЦикла;

Замеры = Новый Структура(
"ЗамерыВремени, ЗамерыПамяти",
ЗамерыВремени,
ЗамерыПамяти);

Возврат Новый СтатистикаБенчмарка(Замеры);

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

#КонецОбласти
55 changes: 55 additions & 0 deletions benchmarks/БенчмаркРасчетаСтатистики.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
&Параметры(15, 1000, 10000)
Перем КоличествоЗамеров Экспорт; // Число

Перем _Замеры; // Структура

#Область ОбработчикиСобытий

// Создает бенчмарк расчета статистики.
&КоличествоИтераций(10)
&КоличествоПрогревочныхИтераций(4)
&МониторингПамяти
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Подготавливает обратно упорядоченные положительные замеры времени и памяти.
&ПередКаждымКейсом
Процедура ПодготовитьЗамеры(Контекст) Экспорт

_Замеры = СоздатьЗамеры();

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

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

#Область Бенчмарки

// Рассчитывает статистику по подготовленным замерам времени и памяти.
&Бенчмарк
Процедура РассчитатьСтатистику() Экспорт
Результат = Новый СтатистикаБенчмарка(_Замеры);
КонецПроцедуры

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

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

Функция СоздатьЗамеры()

ЗамерыВремени = Новый Массив(КоличествоЗамеров);
ЗамерыПамяти = Новый Массив(КоличествоЗамеров);

Для Индекс = 0 По КоличествоЗамеров - 1 Цикл
Значение = КоличествоЗамеров - Индекс;
ЗамерыВремени[Индекс] = Значение;
ЗамерыПамяти[Индекс] = Значение * 64;
КонецЦикла;

Возврат Новый Структура(
"ЗамерыВремени, ЗамерыПамяти",
ЗамерыВремени,
ЗамерыПамяти);

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

#КонецОбласти
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
&Параметры(1, 100, 1000)
Перем КоличествоКейсов Экспорт; // Число

Перем _РезультатЗапуска; // РезультатЗапускаБенчмарков
Перем _Json; // Строка

#Область ОбработчикиСобытий

// Создает бенчмарк сериализации результатов.
&КоличествоИтераций(1)
&КоличествоПрогревочныхИтераций(0)
&КоличествоВызововЗаИтерацию(1)
&МониторингПамяти
Процедура ПриСозданииОбъекта()
КонецПроцедуры

// Подготавливает синтетический результат запуска с заданным количеством кейсов.
&ПередКаждымКейсом
Процедура ПодготовитьРезультатЗапуска(Контекст) Экспорт

_РезультатЗапуска = Новый РезультатЗапускаБенчмарков();
Дескриптор = Новый ДескрипторБенчмарка(ТипЗнч(ЭтотОбъект), "Сериализовать");
_РезультатЗапуска.ДескрипторыБенчмарков.Добавить(Дескриптор);

Для Идентификатор = 1 По КоличествоКейсов Цикл
РезультатКейса = Новый РезультатЗапускаКейса();
РезультатКейса.Кейс = Новый КейсБенчмарка(Идентификатор, Дескриптор);
РезультатКейса.Статистика = СоздатьСтатистику();
_РезультатЗапуска.Запуски.Добавить(РезультатКейса);
КонецЦикла;

_Json = СериализацияОбъектовБенчмаркинга.ВJson(_РезультатЗапуска);

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

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

#Область Бенчмарки

// Сериализует подготовленный результат запуска в JSON.
&Бенчмарк
Процедура Сериализовать() Экспорт
Json = СериализацияОбъектовБенчмаркинга.ВJson(_РезультатЗапуска);
КонецПроцедуры

// Десериализует подготовленное представление результата запуска из JSON.
&Бенчмарк
Процедура Десериализовать() Экспорт
Результат = СериализацияОбъектовБенчмаркинга.ИзJson(_Json, Тип("РезультатЗапускаБенчмарков"));
КонецПроцедуры

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

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

Функция СоздатьСтатистику()

ЗамерыВремени = Новый Массив();
ЗамерыПамяти = Новый Массив();

Для Значение = 1 По 5 Цикл
ЗамерыВремени.Добавить(Значение);
ЗамерыПамяти.Добавить(Значение * 64);
КонецЦикла;

Замеры = Новый Структура(
"ЗамерыВремени, ЗамерыПамяти",
ЗамерыВремени,
ЗамерыПамяти);

Возврат Новый СтатистикаБенчмарка(Замеры);

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

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