Skip to content

Latest commit

 

History

History
439 lines (314 loc) · 19.6 KB

File metadata and controls

439 lines (314 loc) · 19.6 KB

Параметризация

Параметризация позволяет запускать бенчмарки с различными входными данными для анализа производительности в разных условиях.

Виды параметров

Общие параметры

Общие параметры применяются ко всем бенчмаркам и задаются через экспортные поля класса. Они создают варианты выполнения всех бенчмарков с разными значениями общих параметров.

Пример

&Параметры("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. Прямое указание через аннотацию &Параметры

Простой и наглядный способ для небольшого количества фиксированных значений.

Общие параметры

Аннотация размещается непосредственно над объявлением экспортного поля класса.

// Вариант 1 - все значения в одной аннотации
&Параметры("MD5", "SHA256", "SHA512")
Перем АлгоритмХеширования Экспорт;

// Вариант 2 - отдельная аннотация для каждого значения
&Параметры("MD5")
&Параметры("SHA256")
&Параметры("SHA512")
Перем АлгоритмХеширования Экспорт;

Оба варианта эквивалентны и создают три варианта запуска всех бенчмарков класса.

Параметры бенчмарка

Аннотация размещается над методом бенчмарка. Каждая аннотация &Параметры создает один набор параметров.

&Бенчмарк
&Параметры(50, 100)
&Параметры(75, 150)
Процедура Бенчмарк(Парам1, Парам2) Экспорт
	// Логика бенчмарка
КонецПроцедуры

Важно: Количество значений в аннотации должно соответствовать количеству параметров метода.

2. Функции-источники данных &ИсточникПараметров

Гибкий способ для динамической генерации параметров или получения их из внешних источников.

⚠️ ВАЖНО: Детерминированность функций-источников

Функция-источник ДОЛЖНА возвращать:

  • Одинаковые значения при каждом вызове
  • Элементы в неизменном порядке
  • Постоянное количество элементов

Общие параметры

Функция-источник должна возвращать массив или таблицу значений. Каждый элемент коллекции становится отдельным значением общего параметра.

&ИсточникПараметров("ПолучитьАлгоритмыХеширования")
Перем АлгоритмХеширования Экспорт;

// Функция-источник внутри класса бенчмарков
Функция ПолучитьАлгоритмыХеширования() Экспорт

	Алгоритмы = Новый Массив();
	Алгоритмы.Добавить("MD5");
	Алгоритмы.Добавить("SHA256");
	Алгоритмы.Добавить("SHA512");

	Возврат Алгоритмы;

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

Источник может находиться в другом классе или модуле. Укажите полное имя в формате <ИмяКлассаМодуля>.<ИмяМетода>:

&ИсточникПараметров("КонфигурацияАлгоритмов.ПолучитьПоддерживаемыеАлгоритмы")
Перем АлгоритмХеширования Экспорт;

Параметры бенчмарка

Функция-источник возвращает коллекцию наборов параметров - каждый элемент становится одним набором значений для параметров метода бенчмарка. Формат элементов зависит от количества параметров метода.

Для метода с одним параметром

&Бенчмарк
&ИсточникПараметров("ПолучитьРазмерыМассивов")
Процедура ОбработкаМассива(РазмерМассива) Экспорт
	// Логика бенчмарка
КонецПроцедуры

Функция ПолучитьРазмерыМассивов() Экспорт

	Размеры = Новый Массив();
	Размеры.Добавить(100);
	Размеры.Добавить(1000);
	Размеры.Добавить(10000);

	Возврат Размеры;

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

Для нескольких параметров - вариант 1: Таблица значений

Имена колонок таблицы значений должны совпадать с именами параметров метода.

&Бенчмарк
&ИсточникПараметров("ПолучитьПараметрыБенчмарка")
Процедура Бенчмарк(Размер, Итерации) Экспорт
	// Логика бенчмарка
КонецПроцедуры

Функция ПолучитьПараметрыБенчмарка() Экспорт

	Наборы = Новый ТаблицаЗначений();
	Наборы.Колонки.Добавить("Размер");
	Наборы.Колонки.Добавить("Итерации");

	Набор = Наборы.Добавить();
	Набор.Размер = 100;
	Набор.Итерации = 1000;

	Набор = Наборы.Добавить();
	Набор.Размер = 500;
	Набор.Итерации = 5000;

	Возврат Наборы;

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

Для нескольких параметров - вариант 2: Массив массивов

Порядок значений в массиве должен соответствовать порядку параметров метода.

&Бенчмарк
&ИсточникПараметров("ПолучитьПараметрыБенчмарка")
Процедура Бенчмарк(Размер, Итерации) Экспорт
	// Логика бенчмарка
КонецПроцедуры

Функция ПолучитьПараметрыБенчмарка() Экспорт

	Наборы = Новый Массив();

	// Набор 1
	Набор = Новый Массив();
	Набор.Добавить(50);
	Набор.Добавить(100);
	Наборы.Добавить(Набор);

	// Набор 2
	Набор = Новый Массив();
	Набор.Добавить(75);
	Набор.Добавить(150);
	Наборы.Добавить(Набор);

	Возврат Наборы;

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

Для нескольких параметров - вариант 3: Массив структур/соответствий

Ключи структуры или соответствия сопоставляются с именами параметров метода.

&Бенчмарк
&ИсточникПараметров("ПолучитьПараметрыБенчмарка")
Процедура Бенчмарк(Размер, Итерации) Экспорт
	// Логика бенчмарка
КонецПроцедуры

Функция ПолучитьПараметрыБенчмарка() Экспорт

	Наборы = Новый Массив();
	Наборы.Добавить(Новый Структура("Размер, Итерации", 100, 1000));
	Наборы.Добавить(Новый Структура("Размер, Итерации", 500, 5000));

	Возврат Наборы;

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

Конфигурирование через API

Параметры можно задавать программно через объекты КонфигурацияБенчмарков и ДескрипторБенчмарка.

Общие параметры

Используйте методы ДобавитьПараметр и ДобавитьИсточникПараметров объекта КонфигурацияБенчмарков.

// Добавление параметров напрямую
Конфигурация
	.ДобавитьПараметр("АлгоритмХеширования", "MD5")
	.ДобавитьПараметр("АлгоритмХеширования", "SHA256");

// Добавление источника параметров (метод текущего класса)
Конфигурация.ДобавитьИсточникПараметров(
	"АлгоритмХеширования",
	"ПолучитьАлгоритмыХеширования"
);

// Источник из другого класса/модуля
Конфигурация.ДобавитьИсточникПараметров(
	"АлгоритмХеширования",
	"КонфигурацияАлгоритмов.ПолучитьПоддерживаемыеАлгоритмы"
);

Параметры бенчмарка

Используйте методы ДобавитьПараметры и ДобавитьИсточникПараметров объекта ДескрипторБенчмарка.

// Добавление одиночного значения (для метода с одним параметром)
Дескриптор.ДобавитьПараметры(100);
Дескриптор.ДобавитьПараметры(500);

// Добавление набора значений (для метода с несколькими параметрами)
НаборПараметров = Новый Массив();
НаборПараметров.Добавить(50);
НаборПараметров.Добавить(100);
Дескриптор.ДобавитьПараметры(НаборПараметров);

// Добавление источника параметров (метод текущего класса)
Дескриптор.ДобавитьИсточникПараметров("ПолучитьПараметрыБенчмарка");

// Источник из другого класса/модуля
Дескриптор.ДобавитьИсточникПараметров("ПараметрыБенчмарков.ПолучитьСтандартныеНаборы");

Примеры

Пример 1: Комбинирование общих параметров и параметров бенчмарка

&Параметры(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

Пример 2: Использование источников параметров

&ИсточникПараметров("ПолучитьМножители")
Перем Множитель Экспорт;

&МониторингПамяти
Процедура ПриСозданииОбъекта()
КонецПроцедуры

&Бенчмарк
&ИсточникПараметров("ПолучитьПараметрыБенчмарка")
Процедура БенчмаркФакториала(Число, ТипАлгоритма) Экспорт

	Если ТипАлгоритма = "Итеративный" Тогда
		Результат = ФакториалИтеративный(Число) * Множитель;
	ИначеЕсли ТипАлгоритма = "Рекурсивный" Тогда
		Результат = ФакториалРекурсивный(Число) * Множитель;
	КонецЕсли;

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

// Итеративный алгоритм вычисления факториала
Функция ФакториалИтеративный(Число)

	Результат = 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