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
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
// BSLLS:MagicNumber-off
// BSLLS:CommentedCode-off

#Использовать benchmark
#Использовать "../benchmarks"

Expand All @@ -6,5 +9,7 @@
Конфигурация = Новый КонфигурацияБенчмарков(Тип);
Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Мин);
Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Макс);
Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Процентиль(33)); // 33-й процентиль
//Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Процентиль); // Процентили по умолчанию

Бенчмаркинг.Запустить(Тип, Конфигурация);
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
&КолонкаМакс
&КолонкаНижнийКвартиль
&КолонкаВерхнийКвартиль
&КолонкаПроцентиль
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
#Использовать delegate
#Использовать fluent

// Создает экземпляр колонки
//
// Параметры:
// Процентиль - Число
//
// Возвращаемое значение:
// КолонкаОтчетаБенчмарков
Функция Создать(Процентиль) Экспорт

Колонка = Новый КолонкаОтчетаБенчмарков(ИмяКолонки(Процентиль));
Колонка.Заголовок = "P" + Процентиль;
Колонка.Описание = СтрШаблон("%1-й процентиль", Процентиль);
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");

Возврат Колонка;

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

// Возвращает значение колонки
//
// Параметры:
// СтрокаРезультата - СтрокаТаблицыЗначений - см. ЗапускательБенчмарков.НоваяТаблицаРезультатовЗапусков
// Колонка - КолонкаОтчетаБенчмарков
//
// Возвращаемое значение:
// Число
Функция Значение(СтрокаРезультата, Колонка) Экспорт // BSLLS:UnusedParameters-off

Процентиль = ПроцентильПоКолонке(Колонка.Имя);

Возврат СтрокаРезультата.Статистика.Квантиль(Процентиль / 100);

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

// Создает экземпляр колонки по имении
//
// Параметры:
// ИмяКолонки - Строка, Массив из Строка - Имена колонок
//
// Возвращаемое значение:
// Массив из КолонкаОтчетаБенчмарков
Функция СоздатьПоИмени(ИмяКолонки) Экспорт

Если ТипЗнч(ИмяКолонки) = Тип("Массив") Тогда
ИменаКолонок = ИмяКолонки;
Иначе
ИменаКолонок = Новый Массив();
ИменаКолонок.Добавить(ИмяКолонки);
КонецЕсли;

Процентили = Новый Массив();
Для Каждого Имя Из ИменаКолонок Цикл

Если Не ЭтоИмяКолонки(Имя) Тогда
Продолжить;
КонецЕсли;

Если Имя = КолонкиОтчетаБенчмарков.Процентиль Тогда
Для Каждого Процентиль Из ПроцентилиПоУмолчанию() Цикл
Процентили.Добавить(Процентиль);
КонецЦикла;
Иначе
Процентиль = Сред(Имя, СтрДлина(Префикс() + 1));
Процентили.Добавить(СтрокаВЧисло(Процентиль));
КонецЕсли;

КонецЦикла;

Процентили = ПроцессорыКоллекций.ИзКоллекции(Процентили)
.Различные()
.Сортировать()
.ВМассив();

Колонки = Новый Массив();
Для Каждого Процентиль Из Процентили Цикл
Колонки.Добавить(Создать(Процентиль));
КонецЦикла;

Возврат Колонки;

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

// Имя колонки
//
// Параметры:
// Процентиль - Число, Неопределено
//
// Возвращаемое значение:
// Строка
Функция ИмяКолонки(Процентиль) Экспорт
Возврат Префикс() + Процентиль;
КонецФункции

// Имя колонки является колонкой процентеля
//
// Параметры:
// ИмяКолонки - Строка
//
// Возвращаемое значение:
// Булево
Функция ЭтоИмяКолонки(ИмяКолонки) Экспорт
Возврат ИмяКолонки = КолонкиОтчетаБенчмарков.Процентиль Или СтрНачинаетсяС(ИмяКолонки, Префикс());
КонецФункции

// Процентили по умолчанию
//
// Возвращаемое значение:
// Массив из Число
//
// BSLLS:MagicNumber-off
Функция ПроцентилиПоУмолчанию() Экспорт

Процентили = Новый Массив();
Процентили.Добавить(0);
Процентили.Добавить(25);
Процентили.Добавить(50);
Процентили.Добавить(67);
Процентили.Добавить(80);
Процентили.Добавить(85);
Процентили.Добавить(90);
Процентили.Добавить(95);
Процентили.Добавить(100);

Возврат Процентили;

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

Функция ПроцентильПоКолонке(ИмяКолонки)
Возврат СтрокаВЧисло(СтрЗаменить(ИмяКолонки, Префикс(), ""));
КонецФункции

Функция Префикс()
Возврат "Процентиль_";
КонецФункции

Функция СтрокаВЧисло(Строка) Экспорт

ОписаниеТипа = Новый ОписаниеТипов("Число");
Возврат ОписаниеТипа.ПривестиЗначение(Строка);

КонецФункции
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,6 @@

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


// Делегаты обработчиков по имени события
//
// Параметры:
Expand Down Expand Up @@ -477,7 +476,7 @@
Функция ДобавитьКолонку(Колонка) Экспорт

Если _Колонки.Найти(Колонка) = Неопределено Тогда
_Колонки.Добавить(КолонкиОтчетаБенчмарков[Колонка]);
_Колонки.Добавить(Колонка);
КонецЕсли;

Возврат ЭтотОбъект;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,13 @@
ДобавитьКолонку(КолонкиОтчетаБенчмарков.СоздатьСреднее());
ДобавитьКолонку(КолонкиОтчетаБенчмарков.СоздатьСтандартнаяОшибка());
ДобавитьКолонку(КолонкиОтчетаБенчмарков.СоздатьСтандартноеОтклонение());
ДобавитьКолонкуКоэффициентОтношенияСреднего();
ДобавитьКолонкуМин();
ДобавитьКолонкуНижнийКвартиль();
ДобавитьКолонку(КолонкиОтчетаБенчмарков.СоздатьМедиана());
ДобавитьКолонкуВерхнийКвартиль();
ДобавитьКолонкуМин();
ДобавитьКолонкуМакс();
ДобавитьКолонкуКоэффициентОтношенияСреднего();
ДобавитьКолонкиПроцентилей();
ДобавитьКолонку(КолонкиОтчетаБенчмарков.СоздатьОперацийВСекунду());
ДобавитьКолонкуВыделяемаяПамять();

Expand Down Expand Up @@ -148,6 +149,14 @@

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

Процедура ДобавитьКолонкиПроцентилей()

Для Каждого Колонка Из КолонкаОтчетаБенчмарковПроцентиль.СоздатьПоИмени(_КолонкиКонфигурации) Цикл
ДобавитьКолонку(Колонка);
КонецЦикла;

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

Процедура ДобавитьКолонку(Колонка)

Если Не _Отчет.Таблица.Колонки.Найти(Колонка.Имя) = Неопределено Тогда
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
Перем ВыделяемаяПамять Экспорт; // Число

Перем _ИсходныеДанные; // Структура
Перем _УпорядоченныеЗамерыВремени; // Массив из Число

// Статистика бенчмарка
//
Expand All @@ -36,6 +37,17 @@

#Область ПрограммныйИнтерфейс

// Квантиль
//
// Параметры:
// Вероятность - Число
//
// Возвращаемое значение:
// Число
Функция Квантиль(Вероятность) Экспорт
Возврат МатематическиеФункцииБенчмарков.Квантиль(_УпорядоченныеЗамерыВремени, Вероятность);
КонецФункции

// Читает замеры и формирует статистику
//
// Параметры:
Expand Down Expand Up @@ -68,6 +80,8 @@
ОперацийВСекунду = ?(_ИсходныеДанные.Среднее = 0, 0, НаносекундВСекунде / _ИсходныеДанные.Среднее);
ВыделяемаяПамять = МатематическиеФункцииБенчмарков.Среднее(ЗамерыПамяти);

_УпорядоченныеЗамерыВремени = ЗамерыВремени;

ВНаносекунды();

Возврат ЭтотОбъект;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,13 @@

Процедура ПрочитатьАннотацииКолонок(СвойстваКонструктора, Конфигурация)

ПрочитатьАннотацииКолонкиБезПараметров(СвойстваКонструктора, Конфигурация);
ПрочитатьАннотацииКолонкиПроцентиля(СвойстваКонструктора, Конфигурация);

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

Процедура ПрочитатьАннотацииКолонкиБезПараметров(СвойстваКонструктора, Конфигурация)

ПереченьКолонок = "Мин, Макс, НижнийКвартиль, ВерхнийКвартиль";
Колонки = СтрРазделить(ПереченьКолонок, ", ", Ложь);

Expand All @@ -204,4 +211,26 @@

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

Процедура ПрочитатьАннотацииКолонкиПроцентиля(СвойстваКонструктора, Конфигурация)

Аннотации = РаботаСАннотациями.ПолучитьАннотации(СвойстваКонструктора, "КолонкаПроцентиль");

КоличествоДобавлено = 0;
Для Каждого Аннотация Из Аннотации Цикл

Процентили = РаботаСАннотациями.ПолучитьЗначенияПараметровАннотации(Аннотация, "Значение");

Для Каждого Процентиль Из Процентили Цикл
Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Процентиль(Процентиль));
КоличествоДобавлено = КоличествоДобавлено + 1;
КонецЦИкла;

КонецЦикла;

Если Аннотации.Количество() > 0 И КоличествоДобавлено = 0 Тогда
Конфигурация.ДобавитьКолонку(КолонкиОтчетаБенчмарков.Процентиль);
КонецЕсли;

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

#КонецОбласти
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
Перем ВыделяемаяПамять Экспорт; // Строка
Перем Мин Экспорт; // Строка
Перем Макс Экспорт; // Строка
Перем Процентиль Экспорт; // Строка

Функция СоздатьМетод() Экспорт
Возврат КолонкаОтчетаБенчмарковМетод.Создать();
Expand Down Expand Up @@ -73,6 +74,14 @@
Возврат КолонкаОтчетаБенчмарковВерхнийКвартиль.Создать();
КонецФункции

Функция СоздатьПроцентиль(Процентиль) Экспорт
Возврат КолонкаОтчетаБенчмарковПроцентиль.Создать(Процентиль);
КонецФункции

Функция Процентиль(Процентиль) Экспорт
Возврат КолонкаОтчетаБенчмарковПроцентиль.ИмяКолонки(Процентиль);
КонецФункции

Функция СоздатьПараметр(ИмяПараметра) Экспорт
Возврат КолонкаОтчетаБенчмарковПараметр.Создать(ИмяПараметра);
КонецФункции
Expand All @@ -94,4 +103,5 @@
Категория = "Категория";
ВыделяемаяПамять = "ВыделяемаяПамять";
Мин = "Мин";
Макс = "Макс";
Макс = "Макс";
Процентиль = "Процентиль";
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,27 @@

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

Функция Квантиль(УпорядоченныеЗначения, Вероятность) Экспорт

Количество = УпорядоченныеЗначения.Количество();

Позиция = Вероятность * (Количество - 1);

ИндексПозиции = Цел(Позиция);
ДробнаяЧасть = Позиция - ИндексПозиции;

Если ИндексПозиции < 0 Тогда
Возврат УпорядоченныеЗначения[0];
ИначеЕсли ИндексПозиции >= Количество - 1 Тогда
Возврат УпорядоченныеЗначения[Количество - 1];
Иначе
НижнееЗначение = УпорядоченныеЗначения[ИндексПозиции];
ВерхнееЗначение = УпорядоченныеЗначения[ИндексПозиции + 1];
Возврат НижнееЗначение + ДробнаяЧасть * (ВерхнееЗначение - НижнееЗначение);
КонецЕсли;

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

Функция ТолькоЧисла(Значения, ВключаяНеопределено = Ложь) Экспорт

ТипЧисло = Тип("Число");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
&КолонкаМакс
&КолонкаНижнийКвартиль
&КолонкаВерхнийКвартиль
&КолонкаПроцентиль(10, 80)
Процедура ПриСозданииОбъекта()
КонецПроцедуры

Expand Down
Loading
Loading