diff --git a/benchmarks/README.md b/benchmarks/README.md new file mode 100644 index 0000000..b637879 --- /dev/null +++ b/benchmarks/README.md @@ -0,0 +1,27 @@ +# Бенчмарки BenchmarkOneScript + +Каталог содержит короткий набор бенчмарков для контроля накладных расходов и масштабируемости самой библиотеки. + +## Состав + +- [БенчмаркНакладныхРасходов](БенчмаркНакладныхРасходов.os) — нижняя граница измерений на пустом и контролируемом методах. +- [БенчмаркХолодногоЗапуска](БенчмаркХолодногоЗапуска.os) — первый вызов пустого метода в изолированном процессе. +- [БенчмаркГенерацииКейсов](БенчмаркГенерацииКейсов.os) — комбинирование параметров и создание кейсов. +- [БенчмаркПостроенияОтчета](БенчмаркПостроенияОтчета.os) — построение отчёта при росте числа кейсов. +- [БенчмаркРасчетаСтатистики](БенчмаркРасчетаСтатистики.os) — расчёт среднего, квартилей, отклонения и других показателей. +- [БенчмаркОтносительнойСтатистики](БенчмаркОтносительнойСтатистики.os) — расчёт отношений замеров бенчмарка и эталона. +- [БенчмаркСериализацииРезультатов](БенчмаркСериализацииРезультатов.os) — преобразование результатов в JSON и обратно. + +## Запуск + +Весь набор: + +```bash +becnhos run ./benchmarks +``` + +Отдельный бенчмарк: + +```bash +becnhos run ./benchmarks/БенчмаркНакладныхРасходов.os +``` diff --git a/benchmarks/oscript.cfg b/benchmarks/oscript.cfg new file mode 100644 index 0000000..c92701b --- /dev/null +++ b/benchmarks/oscript.cfg @@ -0,0 +1 @@ +lib.system = ../oscript_modules diff --git "a/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270\320\232\320\265\320\271\321\201\320\276\320\262.os" "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270\320\232\320\265\320\271\321\201\320\276\320\262.os" new file mode 100644 index 0000000..b879ba1 --- /dev/null +++ "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\320\270\320\232\320\265\320\271\321\201\320\276\320\262.os" @@ -0,0 +1,68 @@ +&Параметры(10, 100, 1000) +Перем КоличествоКомбинаций Экспорт; // Число + +Перем ПараметрА Экспорт; // Число +Перем ПараметрБ Экспорт; // Число + +Перем _Конфигурация; // КонфигурацияБенчмарков +Перем _Комбинатор; // КомбинаторПараметровБенчмарка +Перем _Генератор; // ГенераторКейсовБенчмарков +Перем _Результат; // Массив + +#Область ОбработчикиСобытий + +// Создает бенчмарк генерации кейсов. +&КоличествоИтераций(10) +&КоличествоПрогревочныхИтераций(4) +&МониторингПамяти +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +// Подготавливает синтетическую конфигурацию с заданным количеством комбинаций параметров. +&ПередКаждымКейсом +Процедура ПодготовитьГенерациюКейсов(Контекст) Экспорт + + _Конфигурация = Новый КонфигурацияБенчмарков(); + ДобавитьЗначенияПараметра(_Конфигурация, "ПараметрА", 10); + ДобавитьЗначенияПараметра(_Конфигурация, "ПараметрБ", КоличествоКомбинаций / 10); + + _Комбинатор = Новый КомбинаторПараметровБенчмарка(); + + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(); + ДескрипторыБенчмарков.Добавить( + Новый ДескрипторБенчмарка(ТипЗнч(ЭтотОбъект), "СгенерироватьКейсы") + ); + + _Генератор = Новый ГенераторКейсовБенчмарков(ДескрипторыБенчмарков, _Конфигурация); + +КонецПроцедуры + +#КонецОбласти + +#Область Бенчмарки + +// Формирует декартово произведение параметров синтетической конфигурации. +&Бенчмарк +Процедура СкомбинироватьПараметры() Экспорт + _Результат = _Комбинатор.Комбинировать(_Конфигурация.Параметры()); +КонецПроцедуры + +// Генерирует все кейсы для синтетической конфигурации. +&Бенчмарк +Процедура СгенерироватьКейсы() Экспорт + _Результат = _Генератор.СгенерироватьВсеКейсы(); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ДобавитьЗначенияПараметра(Конфигурация, ИмяПараметра, КоличествоЗначений) + + Для Значение = 1 По КоличествоЗначений Цикл + Конфигурация.ДобавитьПараметр(ИмяПараметра, Значение); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти diff --git "a/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\235\320\260\320\272\320\273\320\260\320\264\320\275\321\213\321\205\320\240\320\260\321\201\321\205\320\276\320\264\320\276\320\262.os" "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\235\320\260\320\272\320\273\320\260\320\264\320\275\321\213\321\205\320\240\320\260\321\201\321\205\320\276\320\264\320\276\320\262.os" new file mode 100644 index 0000000..5e20d12 --- /dev/null +++ "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\235\320\260\320\272\320\273\320\260\320\264\320\275\321\213\321\205\320\240\320\260\321\201\321\205\320\276\320\264\320\276\320\262.os" @@ -0,0 +1,27 @@ +Перем _Счетчик; // Число + +#Область ОбработчикиСобытий + +// Создает бенчмарк накладных расходов запуска методов. +&КоличествоИтераций(10) +&КоличествоПрогревочныхИтераций(4) +Процедура ПриСозданииОбъекта() + _Счетчик = 0; +КонецПроцедуры + +#КонецОбласти + +#Область Бенчмарки + +// Измеряет накладные расходы вызова пустого метода. +&Бенчмарк +Процедура ПустойМетод() Экспорт +КонецПроцедуры + +// Измеряет накладные расходы вызова метода с минимальной операцией. +&Бенчмарк +Процедура КонтрольнаяОперация() Экспорт + _Счетчик = _Счетчик + 1; +КонецПроцедуры + +#КонецОбласти diff --git "a/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\236\321\202\320\275\320\276\321\201\320\270\321\202\320\265\320\273\321\214\320\275\320\276\320\271\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\236\321\202\320\275\320\276\321\201\320\270\321\202\320\265\320\273\321\214\320\275\320\276\320\271\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" new file mode 100644 index 0000000..a52dca7 --- /dev/null +++ "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\236\321\202\320\275\320\276\321\201\320\270\321\202\320\265\320\273\321\214\320\275\320\276\320\271\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" @@ -0,0 +1,59 @@ +&Параметры(15, 50, 100) +Перем КоличествоЗамеров Экспорт; // Число + +Перем _ТекущаяСтатистика; // СтатистикаБенчмарка +Перем _ЭталоннаяСтатистика; // СтатистикаБенчмарка +Перем _Результат; // СтатистикаБенчмарка + +#Область ОбработчикиСобытий + +// Создает бенчмарк расчета относительной статистики. +&КоличествоИтераций(10) +&КоличествоПрогревочныхИтераций(4) +&МониторингПамяти +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +// Подготавливает два независимых набора положительных замеров одинаковой длины. +&ПередКаждымКейсом +Процедура ПодготовитьСтатистику(Контекст) Экспорт + + _ТекущаяСтатистика = СоздатьСтатистику(1.2, 80, 3); + _ЭталоннаяСтатистика = СоздатьСтатистику(1, 64, 1); + +КонецПроцедуры + +#КонецОбласти + +#Область Бенчмарки + +// Рассчитывает отношение текущей статистики к эталонной. +&Бенчмарк +Процедура РассчитатьОтносительнуюСтатистику() Экспорт + _Результат = _ТекущаяСтатистика.Разделить(_ЭталоннаяСтатистика); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьСтатистику(МножительВремени, МножительПамяти, Смещение) + + ЗамерыВремени = Новый Массив(КоличествоЗамеров); + ЗамерыПамяти = Новый Массив(КоличествоЗамеров); + + Для Индекс = 0 По КоличествоЗамеров - 1 Цикл + ЗамерыВремени[Индекс] = (Индекс + 1) * МножительВремени + Смещение; + ЗамерыПамяти[Индекс] = (Индекс + 1) * МножительПамяти + Смещение; + КонецЦикла; + + Замеры = Новый Структура( + "ЗамерыВремени, ЗамерыПамяти", + ЗамерыВремени, + ЗамерыПамяти); + + Возврат Новый СтатистикаБенчмарка(Замеры); + +КонецФункции + +#КонецОбласти diff --git "a/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\237\320\276\321\201\321\202\321\200\320\276\320\265\320\275\320\270\321\217\320\236\321\202\321\207\320\265\321\202\320\260.os" "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\237\320\276\321\201\321\202\321\200\320\276\320\265\320\275\320\270\321\217\320\236\321\202\321\207\320\265\321\202\320\260.os" new file mode 100644 index 0000000..150318c --- /dev/null +++ "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\237\320\276\321\201\321\202\321\200\320\276\320\265\320\275\320\270\321\217\320\236\321\202\321\207\320\265\321\202\320\260.os" @@ -0,0 +1,65 @@ +&Параметры(10, 100, 1000) +Перем КоличествоКейсов Экспорт; // Число + +Перем _РезультатЗапуска; // РезультатЗапускаБенчмарков + +#Область ОбработчикиСобытий + +// Создает бенчмарк построения отчета. +&КоличествоИтераций(10) +&КоличествоПрогревочныхИтераций(4) +&МониторингПамяти +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +// Подготавливает синтетический результат запуска с заданным количеством кейсов. +&ПередКаждымКейсом +Процедура ПодготовитьРезультатЗапуска(Контекст) Экспорт + + _РезультатЗапуска = Новый РезультатЗапускаБенчмарков(); + Дескриптор = Новый ДескрипторБенчмарка(ТипЗнч(ЭтотОбъект), "ПостроитьОтчет"); + _РезультатЗапуска.ДескрипторыБенчмарков.Добавить(Дескриптор); + + Для Идентификатор = 1 По КоличествоКейсов Цикл + РезультатКейса = Новый РезультатЗапускаКейса(); + РезультатКейса.Кейс = Новый КейсБенчмарка(Идентификатор, Дескриптор); + РезультатКейса.Статистика = СоздатьСтатистику(); + _РезультатЗапуска.Запуски.Добавить(РезультатКейса); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область Бенчмарки + +// Формирует отчет по подготовленным результатам запуска кейсов. +&Бенчмарк +Процедура ПостроитьОтчет() Экспорт + Отчет = Новый ПостроительОтчетаБенчмарков(_РезультатЗапуска).Сформировать(); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьСтатистику() + + ЗамерыВремени = Новый Массив(); + ЗамерыПамяти = Новый Массив(); + + Для Значение = 1 По 5 Цикл + ЗамерыВремени.Добавить(Значение); + ЗамерыПамяти.Добавить(Значение * 64); + КонецЦикла; + + Замеры = Новый Структура( + "ЗамерыВремени, ЗамерыПамяти", + ЗамерыВремени, + ЗамерыПамяти); + + Возврат Новый СтатистикаБенчмарка(Замеры); + +КонецФункции + +#КонецОбласти diff --git "a/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\240\320\260\321\201\321\207\320\265\321\202\320\260\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\240\320\260\321\201\321\207\320\265\321\202\320\260\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" new file mode 100644 index 0000000..f87d2b4 --- /dev/null +++ "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\240\320\260\321\201\321\207\320\265\321\202\320\260\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" @@ -0,0 +1,55 @@ +&Параметры(15, 1000, 10000) +Перем КоличествоЗамеров Экспорт; // Число + +Перем _Замеры; // Структура + +#Область ОбработчикиСобытий + +// Создает бенчмарк расчета статистики. +&КоличествоИтераций(10) +&КоличествоПрогревочныхИтераций(4) +&МониторингПамяти +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +// Подготавливает обратно упорядоченные положительные замеры времени и памяти. +&ПередКаждымКейсом +Процедура ПодготовитьЗамеры(Контекст) Экспорт + + _Замеры = СоздатьЗамеры(); + +КонецПроцедуры + +#КонецОбласти + +#Область Бенчмарки + +// Рассчитывает статистику по подготовленным замерам времени и памяти. +&Бенчмарк +Процедура РассчитатьСтатистику() Экспорт + Результат = Новый СтатистикаБенчмарка(_Замеры); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьЗамеры() + + ЗамерыВремени = Новый Массив(КоличествоЗамеров); + ЗамерыПамяти = Новый Массив(КоличествоЗамеров); + + Для Индекс = 0 По КоличествоЗамеров - 1 Цикл + Значение = КоличествоЗамеров - Индекс; + ЗамерыВремени[Индекс] = Значение; + ЗамерыПамяти[Индекс] = Значение * 64; + КонецЦикла; + + Возврат Новый Структура( + "ЗамерыВремени, ЗамерыПамяти", + ЗамерыВремени, + ЗамерыПамяти); + +КонецФункции + +#КонецОбласти diff --git "a/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\320\270\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262.os" "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\320\270\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262.os" new file mode 100644 index 0000000..3895b31 --- /dev/null +++ "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\320\270\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262.os" @@ -0,0 +1,75 @@ +&Параметры(1, 100, 1000) +Перем КоличествоКейсов Экспорт; // Число + +Перем _РезультатЗапуска; // РезультатЗапускаБенчмарков +Перем _Json; // Строка + +#Область ОбработчикиСобытий + +// Создает бенчмарк сериализации результатов. +&КоличествоИтераций(1) +&КоличествоПрогревочныхИтераций(0) +&КоличествоВызововЗаИтерацию(1) +&МониторингПамяти +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +// Подготавливает синтетический результат запуска с заданным количеством кейсов. +&ПередКаждымКейсом +Процедура ПодготовитьРезультатЗапуска(Контекст) Экспорт + + _РезультатЗапуска = Новый РезультатЗапускаБенчмарков(); + Дескриптор = Новый ДескрипторБенчмарка(ТипЗнч(ЭтотОбъект), "Сериализовать"); + _РезультатЗапуска.ДескрипторыБенчмарков.Добавить(Дескриптор); + + Для Идентификатор = 1 По КоличествоКейсов Цикл + РезультатКейса = Новый РезультатЗапускаКейса(); + РезультатКейса.Кейс = Новый КейсБенчмарка(Идентификатор, Дескриптор); + РезультатКейса.Статистика = СоздатьСтатистику(); + _РезультатЗапуска.Запуски.Добавить(РезультатКейса); + КонецЦикла; + + _Json = СериализацияОбъектовБенчмаркинга.ВJson(_РезультатЗапуска); + +КонецПроцедуры + +#КонецОбласти + +#Область Бенчмарки + +// Сериализует подготовленный результат запуска в JSON. +&Бенчмарк +Процедура Сериализовать() Экспорт + Json = СериализацияОбъектовБенчмаркинга.ВJson(_РезультатЗапуска); +КонецПроцедуры + +// Десериализует подготовленное представление результата запуска из JSON. +&Бенчмарк +Процедура Десериализовать() Экспорт + Результат = СериализацияОбъектовБенчмаркинга.ИзJson(_Json, Тип("РезультатЗапускаБенчмарков")); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьСтатистику() + + ЗамерыВремени = Новый Массив(); + ЗамерыПамяти = Новый Массив(); + + Для Значение = 1 По 5 Цикл + ЗамерыВремени.Добавить(Значение); + ЗамерыПамяти.Добавить(Значение * 64); + КонецЦикла; + + Замеры = Новый Структура( + "ЗамерыВремени, ЗамерыПамяти", + ЗамерыВремени, + ЗамерыПамяти); + + Возврат Новый СтатистикаБенчмарка(Замеры); + +КонецФункции + +#КонецОбласти diff --git "a/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\245\320\276\320\273\320\276\320\264\320\275\320\276\320\263\320\276\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\245\320\276\320\273\320\276\320\264\320\275\320\276\320\263\320\276\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" new file mode 100644 index 0000000..a1cde3d --- /dev/null +++ "b/benchmarks/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\245\320\276\320\273\320\276\320\264\320\275\320\276\320\263\320\276\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" @@ -0,0 +1,17 @@ +#Область ОбработчикиСобытий + +// Создает бенчмарк первого вызова пустого метода в изолированном процессе. +&СтратегияХолодныйЗапуск +Процедура ПриСозданииОбъекта() +КонецПроцедуры + +#КонецОбласти + +#Область Бенчмарки + +// Измеряет первый вызов пустого метода в изолированном процессе. +&Бенчмарк +Процедура ПервыйВызовПустогоМетода() Экспорт +КонецПроцедуры + +#КонецОбласти