Параметризация позволяет запускать бенчмарки с различными входными данными для анализа производительности в разных условиях.
Общие параметры применяются ко всем бенчмаркам и задаются через экспортные поля класса. Они создают варианты выполнения всех бенчмарков с разными значениями общих параметров.
&Параметры("MD5", "SHA256")
Перем АлгоритмХеширования Экспорт;
&Бенчмарк
Процедура ХешированиеСтроки() Экспорт
// Использует АлгоритмХеширования
КонецПроцедуры
&Бенчмарк
Процедура ХешированиеФайла() Экспорт
// Также использует АлгоритмХеширования
КонецПроцедурыКаждый бенчмарк будет запущен дважды:
АлгоритмХеширования = "MD5"АлгоритмХеширования = "SHA256"
Параметры бенчмарка задаются индивидуально для каждого метода бенчмарка через его аргументы. Они создают варианты выполнения только конкретного бенчмарка.
&Бенчмарк
&Параметры(100, 1000)
&Параметры(500, 5000)
Процедура ОбработкаМассива(РазмерМассива, КоличествоИтераций) Экспорт
// Логика бенчмарка
КонецПроцедурыБенчмарк будет запущен дважды:
РазмерМассива = 100,КоличествоИтераций = 1000РазмерМассива = 500,КоличествоИтераций = 5000
При использовании обоих видов параметров создаются все возможные комбинации общих параметров и параметров бенчмарка.
&Параметры("MD5", "SHA256")
Перем АлгоритмХеширования Экспорт;
&Бенчмарк
&Параметры(100)
&Параметры(1000)
Процедура ХешированиеСтроки(ДлинаСтроки) Экспорт
// Логика бенчмарка
КонецПроцедурыБенчмарк будет запущен 4 раза:
АлгоритмХеширования = "MD5",ДлинаСтроки = 100АлгоритмХеширования = "MD5",ДлинаСтроки = 1000АлгоритмХеширования = "SHA256",ДлинаСтроки = 100АлгоритмХеширования = "SHA256",ДлинаСтроки = 1000
Параметры можно задавать тремя способами, каждый из которых подходит для разных сценариев:
- Аннотации
&Параметры- для простых случаев с фиксированными значениями - Функции-источники
&ИсточникПараметров- для динамической генерации - API конфигурации - для программного управления параметрами
Простой и наглядный способ для небольшого количества фиксированных значений.
Аннотация размещается непосредственно над объявлением экспортного поля класса.
// Вариант 1 - все значения в одной аннотации
&Параметры("MD5", "SHA256", "SHA512")
Перем АлгоритмХеширования Экспорт;
// Вариант 2 - отдельная аннотация для каждого значения
&Параметры("MD5")
&Параметры("SHA256")
&Параметры("SHA512")
Перем АлгоритмХеширования Экспорт;Оба варианта эквивалентны и создают три варианта запуска всех бенчмарков класса.
Аннотация размещается над методом бенчмарка. Каждая аннотация &Параметры создает один набор параметров.
&Бенчмарк
&Параметры(50, 100)
&Параметры(75, 150)
Процедура Бенчмарк(Парам1, Парам2) Экспорт
// Логика бенчмарка
КонецПроцедурыВажно: Количество значений в аннотации должно соответствовать количеству параметров метода.
Гибкий способ для динамической генерации параметров или получения их из внешних источников.
⚠️ ВАЖНО: Детерминированность функций-источниковФункция-источник ДОЛЖНА возвращать:
- Одинаковые значения при каждом вызове
- Элементы в неизменном порядке
- Постоянное количество элементов
Функция-источник должна возвращать массив или таблицу значений. Каждый элемент коллекции становится отдельным значением общего параметра.
&ИсточникПараметров("ПолучитьАлгоритмыХеширования")
Перем АлгоритмХеширования Экспорт;
// Функция-источник внутри класса бенчмарков
Функция ПолучитьАлгоритмыХеширования() Экспорт
Алгоритмы = Новый Массив();
Алгоритмы.Добавить("MD5");
Алгоритмы.Добавить("SHA256");
Алгоритмы.Добавить("SHA512");
Возврат Алгоритмы;
КонецФункцииИсточник может находиться в другом классе или модуле. Укажите полное имя в формате <ИмяКлассаМодуля>.<ИмяМетода>:
&ИсточникПараметров("КонфигурацияАлгоритмов.ПолучитьПоддерживаемыеАлгоритмы")
Перем АлгоритмХеширования Экспорт;Функция-источник возвращает коллекцию наборов параметров - каждый элемент становится одним набором значений для параметров метода бенчмарка. Формат элементов зависит от количества параметров метода.
&Бенчмарк
&ИсточникПараметров("ПолучитьРазмерыМассивов")
Процедура ОбработкаМассива(РазмерМассива) Экспорт
// Логика бенчмарка
КонецПроцедуры
Функция ПолучитьРазмерыМассивов() Экспорт
Размеры = Новый Массив();
Размеры.Добавить(100);
Размеры.Добавить(1000);
Размеры.Добавить(10000);
Возврат Размеры;
КонецФункцииИмена колонок таблицы значений должны совпадать с именами параметров метода.
&Бенчмарк
&ИсточникПараметров("ПолучитьПараметрыБенчмарка")
Процедура Бенчмарк(Размер, Итерации) Экспорт
// Логика бенчмарка
КонецПроцедуры
Функция ПолучитьПараметрыБенчмарка() Экспорт
Наборы = Новый ТаблицаЗначений();
Наборы.Колонки.Добавить("Размер");
Наборы.Колонки.Добавить("Итерации");
Набор = Наборы.Добавить();
Набор.Размер = 100;
Набор.Итерации = 1000;
Набор = Наборы.Добавить();
Набор.Размер = 500;
Набор.Итерации = 5000;
Возврат Наборы;
КонецФункцииПорядок значений в массиве должен соответствовать порядку параметров метода.
&Бенчмарк
&ИсточникПараметров("ПолучитьПараметрыБенчмарка")
Процедура Бенчмарк(Размер, Итерации) Экспорт
// Логика бенчмарка
КонецПроцедуры
Функция ПолучитьПараметрыБенчмарка() Экспорт
Наборы = Новый Массив();
// Набор 1
Набор = Новый Массив();
Набор.Добавить(50);
Набор.Добавить(100);
Наборы.Добавить(Набор);
// Набор 2
Набор = Новый Массив();
Набор.Добавить(75);
Набор.Добавить(150);
Наборы.Добавить(Набор);
Возврат Наборы;
КонецФункцииКлючи структуры или соответствия сопоставляются с именами параметров метода.
&Бенчмарк
&ИсточникПараметров("ПолучитьПараметрыБенчмарка")
Процедура Бенчмарк(Размер, Итерации) Экспорт
// Логика бенчмарка
КонецПроцедуры
Функция ПолучитьПараметрыБенчмарка() Экспорт
Наборы = Новый Массив();
Наборы.Добавить(Новый Структура("Размер, Итерации", 100, 1000));
Наборы.Добавить(Новый Структура("Размер, Итерации", 500, 5000));
Возврат Наборы;
КонецФункцииПараметры можно задавать программно через объекты КонфигурацияБенчмарков и ДескрипторБенчмарка.
Используйте методы ДобавитьПараметр и ДобавитьИсточникПараметров объекта КонфигурацияБенчмарков.
// Добавление параметров напрямую
Конфигурация
.ДобавитьПараметр("АлгоритмХеширования", "MD5")
.ДобавитьПараметр("АлгоритмХеширования", "SHA256");
// Добавление источника параметров (метод текущего класса)
Конфигурация.ДобавитьИсточникПараметров(
"АлгоритмХеширования",
"ПолучитьАлгоритмыХеширования"
);
// Источник из другого класса/модуля
Конфигурация.ДобавитьИсточникПараметров(
"АлгоритмХеширования",
"КонфигурацияАлгоритмов.ПолучитьПоддерживаемыеАлгоритмы"
);Используйте методы ДобавитьПараметры и ДобавитьИсточникПараметров объекта ДескрипторБенчмарка.
// Добавление одиночного значения (для метода с одним параметром)
Дескриптор.ДобавитьПараметры(100);
Дескриптор.ДобавитьПараметры(500);
// Добавление набора значений (для метода с несколькими параметрами)
НаборПараметров = Новый Массив();
НаборПараметров.Добавить(50);
НаборПараметров.Добавить(100);
Дескриптор.ДобавитьПараметры(НаборПараметров);
// Добавление источника параметров (метод текущего класса)
Дескриптор.ДобавитьИсточникПараметров("ПолучитьПараметрыБенчмарка");
// Источник из другого класса/модуля
Дескриптор.ДобавитьИсточникПараметров("ПараметрыБенчмарков.ПолучитьСтандартныеНаборы");&Параметры(5, 0)
Перем ДобавляемаяЗадержка Экспорт; // Число
&Бенчмарк
&Параметры(100, 10)
&Параметры(100, 20)
&Параметры(200, 10)
&Параметры(200, 20)
Процедура Бенчмарк(Задержка1, Задержка2) Экспорт
Приостановить(Задержка1 + Задержка2 + ДобавляемаяЗадержка);
КонецПроцедуры| Method | ДобавляемаяЗадержка | Задержка1 | Задержка2 | Mean | StdErr | StdDev | Op/s |
|---|---|---|---|---|---|---|---|
| Бенчмарк | 0 | 100 | 10 | 110.9 ms | 20.43 us | 79.13 us | 9.017 |
| Бенчмарк | 0 | 100 | 20 | 120.9 ms | 25.94 us | 100.45 us | 8.273 |
| Бенчмарк | 0 | 200 | 10 | 210.8 ms | 32.87 us | 127.32 us | 4.743 |
| Бенчмарк | 0 | 200 | 20 | 220.9 ms | 21.70 us | 84.04 us | 4.527 |
| Бенчмарк | 5 | 100 | 10 | 115.8 ms | 22.05 us | 85.41 us | 8.632 |
| Бенчмарк | 5 | 100 | 20 | 125.9 ms | 23.00 us | 89.07 us | 7.941 |
| Бенчмарк | 5 | 200 | 10 | 215.9 ms | 17.41 us | 67.43 us | 4.631 |
| Бенчмарк | 5 | 200 | 20 | 225.9 ms | 28.13 us | 108.95 us | 4.427 |
&ИсточникПараметров("ПолучитьМножители")
Перем Множитель Экспорт;
&МониторингПамяти
Процедура ПриСозданииОбъекта()
КонецПроцедуры
&Бенчмарк
&ИсточникПараметров("ПолучитьПараметрыБенчмарка")
Процедура БенчмаркФакториала(Число, ТипАлгоритма) Экспорт
Если ТипАлгоритма = "Итеративный" Тогда
Результат = ФакториалИтеративный(Число) * Множитель;
ИначеЕсли ТипАлгоритма = "Рекурсивный" Тогда
Результат = ФакториалРекурсивный(Число) * Множитель;
КонецЕсли;
КонецПроцедуры
// Итеративный алгоритм вычисления факториала
Функция ФакториалИтеративный(Число)
Результат = 1;
Для Сч = 1 По Число Цикл
Результат = Результат * Сч;
КонецЦикла;
Возврат Результат;
КонецФункции
// Рекурсивный алгоритм вычисления факториала
Функция ФакториалРекурсивный(Число)
Если Число <= 1 Тогда
Возврат 1;
КонецЕсли;
Возврат Число * ФакториалРекурсивный(Число - 1);
КонецФункции
// Источник общих параметров
Функция ПолучитьМножители() Экспорт
Множители = Новый Массив();
Множители.Добавить(1);
Множители.Добавить(100);
Возврат Множители;
КонецФункции
// Источник параметров бенчмарка
Функция ПолучитьПараметрыБенчмарка() Экспорт
Наборы = Новый ТаблицаЗначений();
Наборы.Колонки.Добавить("Число");
Наборы.Колонки.Добавить("ТипАлгоритма");
Набор = Наборы.Добавить();
Набор.Число = 10;
Набор.ТипАлгоритма = "Итеративный";
Набор = Наборы.Добавить();
Набор.Число = 15;
Набор.ТипАлгоритма = "Рекурсивный";
Набор = Наборы.Добавить();
Набор.Число = 20;
Набор.ТипАлгоритма = "Итеративный";
Возврат Наборы;
КонецФункции| Method | Множитель | Число | ТипАлгоритма | Mean | StdErr | StdDev | Op/s | Allocated |
|---|---|---|---|---|---|---|---|---|
| БенчмаркФакториала | 1 | 10 | Итеративный | 6.489 us | 103.42 ns | 400.56 ns | 154,115 | 1.489 KB |
| БенчмаркФакториала | 1 | 15 | Рекурсивный | 11.853 us | 22.26 ns | 86.20 ns | 84,367 | 4.851 KB |
| БенчмаркФакториала | 1 | 20 | Итеративный | 9.746 us | 51.22 ns | 198.37 ns | 102,607 | 2.272 KB |
| БенчмаркФакториала | 100 | 10 | Итеративный | 6.610 us | 142.17 ns | 550.62 ns | 151,295 | 1.489 KB |
| БенчмаркФакториала | 100 | 15 | Рекурсивный | 12.316 us | 198.95 ns | 770.54 ns | 81,192 | 4.850 KB |
| БенчмаркФакториала | 100 | 20 | Итеративный | 9.768 us | 38.11 ns | 147.59 ns | 102,378 | 2.272 KB |