Skip to content

Commit bed4f14

Browse files
committed
feat: Добавление указание наименования бенчмарка
- Добавлен параметр Наименование в аннотацию &Бенчмарк - Добавлен API дескриптора Наименование()/УстановитьНаименование()
1 parent 77c7071 commit bed4f14

7 files changed

Lines changed: 153 additions & 22 deletions

samples/benchmarks/examples/БенчмаркСортировок.os

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
// Встроенная сортировка (эталон).
9595
// Сортирует через ТаблицаЗначений.Сортировать(), затем копирует обратно в массив.
9696
// Служит базой для Ratio - все остальные алгоритмы сравниваются с этим.
97-
&Бенчмарк
97+
&Бенчмарк(Наименование = "Встроенная")
9898
&Эталон
9999
&Параметры(1000)
100100
&Параметры(10000)
@@ -112,7 +112,7 @@
112112
// Сортировка пузырьком - O(n²).
113113
// Простейший алгоритм: соседние элементы сравниваются и меняются местами.
114114
// Всегда выполняет n*(n-1)/2 сравнений независимо от входных данных.
115-
&Бенчмарк
115+
&Бенчмарк(Наименование = "Пузырьком O(n²)")
116116
&Параметры(1000)
117117
Процедура СортировкаПузырьком(РазмерМассива) Экспорт
118118

@@ -133,7 +133,7 @@
133133
// Сортировка вставками - O(n²), лучший O(n).
134134
// Каждый элемент сдвигается влево до своей позиции.
135135
// Эффективна на малых и почти отсортированных массивах; используется как базис в гибридных алгоритмах.
136-
&Бенчмарк
136+
&Бенчмарк(Наименование = "Вставками O(n²)")
137137
&Параметры(1000)
138138
Процедура СортировкаВставками(РазмерМассива) Экспорт
139139

@@ -155,7 +155,7 @@
155155

156156
// Бинарная сортировка вставками - O(n²) сдвигов, O(n log n) сравнений.
157157
// Позиция вставки ищется бинарным поиском, но сдвиг элементов остаётся линейным.
158-
&Бенчмарк
158+
&Бенчмарк(Наименование = "Бинарные вставки O(n²)")
159159
&Параметры(1000)
160160
Процедура СортировкаВставкамиБинарная(РазмерМассива) Экспорт
161161

@@ -193,7 +193,7 @@
193193
// Двойная сортировка выбором - O(n²).
194194
// На каждом проходе находит минимум и максимум, сужая границы с двух сторон.
195195
// Вдвое меньше проходов, чем классическая сортировка выбором.
196-
&Бенчмарк
196+
&Бенчмарк(Наименование = "Выбором (двойная) O(n²)")
197197
&Параметры(1000)
198198
Процедура СортировкаВыбором(РазмерМассива) Экспорт
199199

@@ -244,7 +244,7 @@
244244
// Обобщение сортировки вставками с убывающим шагом.
245245
// Последовательность Ciura [1,4,10,23,57,132,301,701] эмпирически оптимальна;
246246
// для массивов >701 элемента шаги продолжаются с множителем ×2.25.
247-
&Бенчмарк
247+
&Бенчмарк(Наименование = "Шелла (Ciura) O(n^1.25)")
248248
&Параметры(1000)
249249
&Параметры(10000)
250250
Процедура СортировкаШелла(РазмерМассива) Экспорт
@@ -302,7 +302,7 @@
302302
// Гибрид быстрой + пирамидальной + вставками.
303303
// Медиана трёх для выбора опорного, лимит глубины 2·log2(n) с переходом на пирамидальную,
304304
// участки < МинимальныйРазмерВставки досортировываются вставками.
305-
&Бенчмарк
305+
&Бенчмарк(Наименование = "Быстрая O(n log n)")
306306
&Параметры(1000)
307307
&Параметры(10000)
308308
Процедура БыстраяСортировка(РазмерМассива) Экспорт
@@ -406,7 +406,7 @@
406406
// Блоки размером МинимальныйРазмерВставки сортируются вставками,
407407
// затем попарно сливаются с удвоением ширины. Единый буфер на все слияния.
408408
// Оптимизация: пропуск слияния, если граница уже упорядочена.
409-
&Бенчмарк
409+
&Бенчмарк(Наименование = "Слиянием O(n log n)")
410410
&Параметры(1000)
411411
&Параметры(10000)
412412
Процедура СортировкаСлиянием(РазмерМассива) Экспорт
@@ -494,7 +494,7 @@
494494
// Пирамидальная сортировка - O(n log n).
495495
// Построение max-heap за O(n), затем n извлечений вершины.
496496
// Просеивание (sift-down) заинлайнено для производительности в интерпретаторе.
497-
&Бенчмарк
497+
&Бенчмарк(Наименование = "Пирамидальная O(n log n)")
498498
&Параметры(1000)
499499
&Параметры(10000)
500500
Процедура ПирамидальнаяСортировка(РазмерМассива) Экспорт
@@ -645,7 +645,7 @@
645645
// Сортировка расчёской - O(n log n) в среднем.
646646
// Улучшение пузырька: шаг сравнения уменьшается с коэффициентом 1.3 до 1.
647647
// Эффективно устраняет «черепах» - мелкие элементы в конце массива.
648-
&Бенчмарк
648+
&Бенчмарк(Наименование = "Расчёской O(n log n)")
649649
&Параметры(1000)
650650
&Параметры(10000)
651651
Процедура СортировкаРасческой(РазмерМассива) Экспорт
@@ -679,7 +679,7 @@
679679
// Сортировка подсчётом - O(n + k), где k = ВерхняяГраница.
680680
// Не основана на сравнениях: считает количество вхождений каждого значения.
681681
// Эффективна при k ≈ n; при k >> n большая часть работы - пустой пробег по счётчикам.
682-
&Бенчмарк
682+
&Бенчмарк(Наименование = "Подсчётом O(n + k)")
683683
&Параметры(1000)
684684
&Параметры(10000)
685685
&Параметры(100000)
@@ -711,7 +711,7 @@
711711
// Поразрядная сортировка (LSD Radix-256) - O(d·(n+b)), где d=2, b=256.
712712
// Два прохода по основанию 256: сначала младшие 8 бит, затем старшие.
713713
// Покрывает значения [0..65535]. Стабильная, не основана на сравнениях.
714-
&Бенчмарк
714+
&Бенчмарк(Наименование = "Поразрядная Radix-256 (LSD) O(d*(n+b))")
715715
&Параметры(1000)
716716
&Параметры(10000)
717717
&Параметры(100000)
@@ -807,4 +807,4 @@
807807

808808
Возврат 0;
809809

810-
КонецФункции
810+
КонецФункции
Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
// Указывает, что метод должен быть измерен как бенчмарк в рамках тестирования производительности.
22
//
3-
// Методы с этой аннотацией автоматически включаются в процесс бенчмаркинга.
4-
// При запуске будут замеряться время выполнения, аллокации памяти (если включен мониторинг памяти),
3+
// Методы с этой аннотацией автоматически включаются в процесс бенчмаркинга.
4+
// При запуске будут замеряться время выполнения, аллокации памяти (если включен мониторинг памяти),
55
// и другие параметры производительности.
66
//
7+
// Параметры:
8+
// Наименование - Строка - Наименование бенчмарка. Если указано, отображается в колонке Method отчета
9+
// вместо имени метода.
10+
//
711
// Примеры:
812
// &Бенчмарк
913
// Процедура МойБенчмарк() Экспорт
1014
// // Тестируемый код
1115
// КонецПроцедуры
16+
//
17+
// &Бенчмарк(Наименование = "Мое наименование")
18+
// Процедура МойБенчмарк() Экспорт
19+
// // Тестируемый код
20+
// КонецПроцедуры
1221
&Аннотация("Бенчмарк")
13-
Процедура ПриСозданииОбъекта()
14-
КонецПроцедуры
22+
Процедура ПриСозданииОбъекта(Наименование = "")
23+
КонецПроцедуры

src/BenchmarkOneScript/core/Классы/ДескрипторБенчмарка.os

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
&Тип("Массив") &ДляКаждого &Тип("ПараметрыМетодаБенчмарка")
2626
Перем _НаборыПараметров; // Массив из ПараметрыМетодаБенчмарка
2727

28+
&Сериализуемое("Title")
29+
&Тип("Строка")
30+
Перем _Наименование; // Строка - Наименование бенчмарка
31+
2832
&Сериализуемое("ParameterSources")
2933
&Тип("Массив")
3034
Перем _ИсточникиПараметров; // Массив из Строка
@@ -46,6 +50,7 @@
4650
_НаборыПараметров = Новый Массив();
4751
_ЭтоЭталон = Ложь;
4852
_Категория = "";
53+
_Наименование = "";
4954
_ИсточникиПараметров = Новый Массив();
5055

5156
Если Не Объект = Неопределено Тогда
@@ -90,6 +95,14 @@
9095
Возврат _Категория;
9196
КонецФункции
9297

98+
// Наименование бенчмарка
99+
//
100+
// Возвращаемое значение:
101+
// Строка
102+
Функция Наименование() Экспорт
103+
Возврат _Наименование;
104+
КонецФункции
105+
93106
// Наборы параметров, используемые для запуска бенчмарков с различными входными данными.
94107
//
95108
// Возвращаемое значение:
@@ -149,6 +162,23 @@
149162

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

165+
// Устанавливает наименование бенчмарка.
166+
//
167+
// Если наименование указано, оно отображается в колонке Method отчёта вместо имени метода.
168+
//
169+
// Параметры:
170+
// Наименование - Строка
171+
//
172+
// Возвращаемое значение:
173+
// ЭтотОбъект
174+
Функция УстановитьНаименование(Наименование) Экспорт
175+
176+
_Наименование = Наименование;
177+
178+
Возврат ЭтотОбъект;
179+
180+
КонецФункции
181+
152182
// Добавляет параметры бенчмарка, позволяя запускать тесты с различными наборами входных данных.
153183
//
154184
// Принимает значения только примитивного типа.
@@ -268,6 +298,7 @@
268298

269299
Дескриптор.ИспользоватьКакЭталон(ЭтоЭталон());
270300
Дескриптор.УстановитьКатегорию(Категория());
301+
Дескриптор.УстановитьНаименование(Наименование());
271302

272303
Возврат Дескриптор;
273304

@@ -380,4 +411,4 @@
380411
КонецЕсли;
381412
КонецПроцедуры
382413

383-
#КонецОбласти
414+
#КонецОбласти

src/BenchmarkOneScript/core/Классы/ИзвлекательДескрипторовБенчмарков.os

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363

6464
ДескрипторБенчмарка = Новый ДескрипторБенчмарка(_ИсточникБенчмарков, СвойстваМетода.Имя);
6565

66+
ПрочитатьНаименованиеИзАннотацииБенчмарк(СвойстваМетода, ДескрипторБенчмарка);
6667
ПрочитатьАннотациюЭталон(СвойстваМетода, ДескрипторБенчмарка);
6768
ПрочитатьАннотациюКатегория(СвойстваМетода, ДескрипторБенчмарка);
6869
ПрочитатьАннотациюПараметры(СвойстваМетода, ДескрипторБенчмарка);
@@ -72,6 +73,25 @@
7273

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

76+
// Читает параметр Наименование из аннотации &Бенчмарк и устанавливает его в дескриптор
77+
//
78+
// Параметры:
79+
// СвойстваМетода - СтрокаТаблицыЗначений - Свойства метода, полученные через рефлектор
80+
// ДескрипторБенчмарка - ДескрипторБенчмарка - Дескриптор для заполнения
81+
Процедура ПрочитатьНаименованиеИзАннотацииБенчмарк(СвойстваМетода, ДескрипторБенчмарка)
82+
83+
Аннотация = РаботаСАннотациями.ПолучитьАннотацию(СвойстваМетода, "Бенчмарк");
84+
Если Аннотация = Неопределено Тогда
85+
Возврат;
86+
КонецЕсли;
87+
88+
Наименование = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Наименование", "");
89+
Если ЗначениеЗаполнено(Наименование) Тогда
90+
ДескрипторБенчмарка.УстановитьНаименование(Наименование);
91+
КонецЕсли;
92+
93+
КонецПроцедуры
94+
7595
// Читает аннотацию &Эталон и помечает бенчмарк как эталонный, если она присутствует
7696
//
7797
// Параметры:

src/BenchmarkOneScript/core/Модули/КолонкаОтчетаБенчмарковМетод.os

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222
// Произвольный
2323
Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off
2424

25-
Возврат РезультатЗапускаКейса.Кейс.ДескрипторБенчмарка().Метод();
25+
Дескриптор = РезультатЗапускаКейса.Кейс.ДескрипторБенчмарка();
2626

27-
КонецФункции
27+
Наименование = Дескриптор.Наименование();
28+
Если ЗначениеЗаполнено(Наименование) Тогда
29+
Возврат Наименование;
30+
КонецЕсли;
31+
32+
Возврат Дескриптор.Метод();
33+
34+
КонецФункции
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
&Бенчмарк(Наименование = "Тестовое наименование бенчмарка")
2+
Процедура БенчмаркСНаименованием() Экспорт
3+
КонецПроцедуры
4+
5+
&Бенчмарк
6+
Процедура БенчмаркБезНаименования() Экспорт
7+
КонецПроцедуры

tests/ТестыБенчмарков.os

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,8 @@
220220
.ДобавитьИсточникПараметров("Источник1")
221221
.ДобавитьИсточникПараметров("Источник2")
222222
.ИспользоватьКакЭталон()
223-
.УстановитьКатегорию("Категория");
223+
.УстановитьКатегорию("Категория")
224+
.УстановитьНаименование("Наименование для копии");
224225

225226
// Действие
226227
КопияДескриптора = Дескриптор.Скопировать();
@@ -235,6 +236,7 @@
235236
Ожидаем.Что(НаборыПараметров[1].Получить(1).Значение()).Равно(200);
236237
Ожидаем.Что(КопияДескриптора.ЭтоЭталон()).ЭтоИстина();
237238
Ожидаем.Что(КопияДескриптора.Категория()).Равно("Категория");
239+
Ожидаем.Что(КопияДескриптора.Наименование()).Равно("Наименование для копии");
238240
Ожидаем.Что(ИсточникиПараметров[0]).Равно("Источник1");
239241
Ожидаем.Что(ИсточникиПараметров[1]).Равно("Источник2");
240242

@@ -655,4 +657,59 @@
655657
.Метод("Запустить", ПараметрыМетода)
656658
.ВыбрасываетИсключение("Не найдено ни одного дескриптора бенчмарка для запуска");
657659

658-
КонецПроцедуры
660+
КонецПроцедуры
661+
662+
&Тест
663+
Процедура ТестДолжен_ИзвлечьНаименованиеИзАннотацииБенчмарк() Экспорт
664+
665+
// Подготовка
666+
Тип = Тип("БенчмаркСНаименованием");
667+
668+
// Действие
669+
ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип);
670+
671+
// Проверка
672+
ДескрипторСНаименованием = ДескрипторыБенчмарков.НайтиПоИмени("БенчмаркСНаименованием");
673+
ДескрипторБезНаименования = ДескрипторыБенчмарков.НайтиПоИмени("БенчмаркБезНаименования");
674+
675+
Ожидаем.Что(ДескрипторСНаименованием.Наименование()).Равно("Тестовое наименование бенчмарка");
676+
Ожидаем.Что(ДескрипторБезНаименования.Наименование()).Равно("");
677+
678+
КонецПроцедуры
679+
680+
&Тест
681+
Процедура ТестДолжен_УстановитьНаименованиеЧерезМетодДескриптора() Экспорт
682+
683+
// Подготовка
684+
Тип = Тип("ПустойБенчмарк");
685+
686+
ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип);
687+
Дескриптор = ДескрипторыБенчмарков.ПолучитьПервый();
688+
689+
// Действие
690+
Дескриптор.УстановитьНаименование("Мое наименование");
691+
692+
// Проверка
693+
Ожидаем.Что(Дескриптор.Наименование()).Равно("Мое наименование");
694+
695+
КонецПроцедуры
696+
697+
&Тест
698+
Процедура ТестДолжен_ВключитьНаименованиеВОтчет() Экспорт
699+
700+
// Подготовка
701+
Конфигурация = ТестированиеБенчмарков.КонфигурацияПоУмолчанию();
702+
703+
// Действие
704+
Результат = Бенчмаркинг.Запустить(Тип("БенчмаркСНаименованием"), Конфигурация);
705+
706+
// Проверка
707+
Ожидаем.Что(Результат.Отчет.Таблица).ИмеетДлину(2);
708+
709+
ДескрипторСНаименованием = Результат.Отчет.Таблица[0];
710+
ДескрипторБезНаименования = Результат.Отчет.Таблица[1];
711+
712+
Ожидаем.Что(ДескрипторСНаименованием[КолонкиОтчетаБенчмарков.Метод]).Равно("Тестовое наименование бенчмарка");
713+
Ожидаем.Что(ДескрипторБезНаименования[КолонкиОтчетаБенчмарков.Метод]).Равно("БенчмаркБезНаименования");
714+
715+
КонецПроцедуры

0 commit comments

Comments
 (0)