Skip to content

Commit b46b551

Browse files
authored
feat: Выравнивание чисел в колонках по разрядности дробной части мин. значения (Stivo182#7)
1 parent f0d4452 commit b46b551

16 files changed

+165
-31
lines changed

src/BenchmarkOneScript/columns/Модули/КолонкаОтчетаБенчмарковВерхнийКвартиль.os

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "Q3";
1111
Колонка.Описание = "Третий (верхний) квартиль (75-й процентиль)";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

src/BenchmarkOneScript/columns/Модули/КолонкаОтчетаБенчмарковВыделяемаяПамять.os

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "Allocated";
1111
Колонка.Описание = "Выделяемая память на одну операцию";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Байт;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

src/BenchmarkOneScript/columns/Модули/КолонкаОтчетаБенчмарковКоэффициентПроизводительности.os

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
Колонка.Заголовок = "Ratio";
1212
Колонка.Описание = "Среднее значение отношений [Mean] / [Baseline Mean]";
1313
Колонка.СтильКоэффициента = СтилиКоэффициентаБенчмарка.Значение;
14+
Колонка.ЭтоЧисло = Истина;
1415
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1516

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

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

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "Max";
1111
Колонка.Описание = "Максимум";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

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

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "Median";
1111
Колонка.Описание = "Значение, разделяющее упорядоченные измерения на две равные части";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

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

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "Min";
1111
Колонка.Описание = "Минимум";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

src/BenchmarkOneScript/columns/Модули/КолонкаОтчетаБенчмарковНижнийКвартиль.os

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "Q1";
1111
Колонка.Описание = "Первый (нижний) квартиль (25-й процентиль)";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

src/BenchmarkOneScript/columns/Модули/КолонкаОтчетаБенчмарковОперацийВСекунду.os

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "Op/s";
1111
Колонка.Описание = "Операций в секунду";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.ОперацийВСекунду;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

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

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
Колонка.Заголовок = "P" + Процентиль;
1515
Колонка.Описание = СтрШаблон("%1-й процентиль", Процентиль);
1616
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
17+
Колонка.ЭтоЧисло = Истина;
1718
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1819

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

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

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "Mean";
1111
Колонка.Описание = "Арифметическое среднее всех измерений";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

src/BenchmarkOneScript/columns/Модули/КолонкаОтчетаБенчмарковСтандартнаяОшибка.os

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "StdErr";
1111
Колонка.Описание = "Стандартная ошибка всех измерений";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

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

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
Колонка.Заголовок = "StdDev";
1111
Колонка.Описание = "Стандартное отклонение всех измерений";
1212
Колонка.ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
13+
Колонка.ЭтоЧисло = Истина;
1314
Колонка.ЗначениеДелегат = Делегаты.Создать(ЭтотОбъект, "Значение");
1415

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

src/BenchmarkOneScript/core/Классы/ПостроительОтчетаБенчмарков.os

+45-1
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,10 @@
184184

185185
КонецЦИкла;
186186

187+
// Порядок важен
187188
ОпределитьЧисловыеКолонки();
188189
ОпределитьЕдиницыИзмеренияПредставления();
190+
ОпределитьФорматныеСтроки();
189191
ОпределитьРазмерыКолонок();
190192

191193
КонецПроцедуры
@@ -194,8 +196,12 @@
194196

195197
Для Каждого Колонка Из _Отчет.Колонки Цикл
196198

199+
Если Колонка.ЭтоЧисло Тогда
200+
Продолжить;
201+
КонецЕсли;
202+
197203
ЗначенияКолонки = _Отчет.Таблица.ВыгрузитьКолонку(Колонка.Имя);
198-
Если МатематическиеФункцииБенчмарков.ТолькоЧисла(ЗначенияКолонки, Истина) Тогда
204+
Если МатематическиеФункцииБенчмарков.ТолькоЧисла(ЗначенияКолонки) Тогда
199205
Колонка.ЭтоЧисло = Истина;
200206
КонецЕсли;
201207

@@ -231,6 +237,44 @@
231237

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

240+
Процедура ОпределитьФорматныеСтроки()
241+
242+
Для Каждого Колонка Из _Отчет.Колонки Цикл
243+
244+
Если Не Колонка.ЭтоЧисло Тогда
245+
Продолжить;
246+
КонецЕсли;
247+
248+
МинЗначение = Неопределено;
249+
Для Каждого Строка Из _Отчет.Таблица Цикл
250+
Значение = Строка[Колонка.Имя];
251+
Если ТипЗнч(Значение) = Тип("Число") Тогда
252+
МинЗначение = ?(МинЗначение = Неопределено, Значение, Мин(МинЗначение, Значение));
253+
КонецЕсли;
254+
КонецЦикла;
255+
256+
Если МинЗначение = Неопределено Тогда
257+
Возврат;
258+
КонецЕсли;
259+
260+
Если Не Колонка.ЕдиницаИзмерения = Неопределено И Не Колонка.ЕдиницаИзмеренияПредставления = Неопределено Тогда
261+
МинЗначение = ЕдиницыИзмеренийБенчмарков.Конвертировать(
262+
МинЗначение,
263+
Колонка.ЕдиницаИзмерения,
264+
Колонка.ЕдиницаИзмеренияПредставления
265+
);
266+
КонецЕсли;
267+
268+
Разрядность = ПредставленияПоказателейБенчмарков.ПодобратьРазрядностьДробнойЧасти(
269+
МинЗначение,
270+
Колонка.ЕдиницаИзмерения);
271+
272+
Колонка.ФорматнаяСтрока = ПредставленияПоказателейБенчмарков.ФорматнаяСтрокаЧисла(Разрядность);
273+
274+
КонецЦикла;
275+
276+
КонецПроцедуры
277+
234278
Процедура ОпределитьРазмерыКолонок()
235279

236280
Для Каждого Колонка Из _Отчет.Колонки Цикл

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

+1-7
Original file line numberDiff line numberDiff line change
@@ -104,20 +104,14 @@
104104

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

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

109109
ТипЧисло = Тип("Число");
110110

111111
Для Каждого Значение Из Значения Цикл
112-
113-
Если Значение = Неопределено И ВключаяНеопределено Тогда
114-
Продолжить;
115-
КонецЕсли;
116-
117112
Если Не ТипЗнч(Значение) = ТипЧисло Тогда
118113
Возврат Ложь;
119114
КонецЕсли;
120-
121115
КонецЦикла;
122116

123117
Возврат Истина;

src/BenchmarkOneScript/core/Модули/ПредставленияПоказателейБенчмарков.os

+39-11
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
Если ЗначениеЗаполнено(ФорматнаяСтрока) Тогда
88
Представление = Формат(Значение, ФорматнаяСтрока);
99
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
10-
Представление = ПредставлениеЧисла(Значение);
10+
Представление = ПредставлениеЧисла(Значение, ЕдиницаИзмерения);
1111
ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда
1212
Представление = ПредставлениеБулево(Значение);
1313
Иначе
@@ -39,22 +39,37 @@
3939

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

42-
Функция ПредставлениеЧисла(Знач Значение, Разрядность = Неопределено) Экспорт
42+
Функция ПредставлениеЧисла(Значение, ЕдиницаИзмерения = Неопределено) Экспорт
4343

44-
МинимальнаяТочность = 1;
45-
МаксимальнаяТочность = 4;
44+
Разрядность = ПодобратьРазрядностьДробнойЧасти(Значение, ЕдиницаИзмерения);
4645

47-
Если Значение <> 0 Тогда
48-
Точность = 3 - Цел(Log10(?(Значение < 0, -Значение, Значение)));
49-
Точность = Макс(Точность, МинимальнаяТочность);
50-
Точность = Мин(Точность, МаксимальнаяТочность);
46+
Представление = Формат(Значение, ФорматнаяСтрокаЧисла(Разрядность));
47+
48+
Возврат Представление;
49+
50+
КонецФункции
5151

52-
Значение = Окр(Значение, Точность);
52+
Функция ПодобратьРазрядностьДробнойЧасти(Знач Значение, ЕдиницаИзмерения = Неопределено) Экспорт
53+
54+
Если Значение = 0 Тогда
55+
Возврат 0;
5356
КонецЕсли;
5457

55-
Представление = Формат(Значение, ФорматнаяСтрокаЧисла(Разрядность));
58+
ЭтоВремя = Не ЕдиницаИзмерения = Неопределено И ЕдиницаИзмерения.Базовая = ЕдиницыИзмеренийБенчмарков.Наносекунда;
5659

57-
Возврат Представление;
60+
МинимальнаяРазрядность = ?(ЭтоВремя, 1, 0);
61+
МаксимальнаяРазрядность = 4;
62+
63+
Значение = ?(Значение < 0, -Значение, Значение);
64+
Разрядность = 3 - Цел(Log10(Значение));
65+
Разрядность = Макс(Разрядность, МинимальнаяРазрядность);
66+
Разрядность = Мин(Разрядность, МаксимальнаяРазрядность);
67+
68+
Значение = Окр(Значение, Разрядность);
69+
70+
Разрядность = Макс(РазрядностьЧисла(Значение), МинимальнаяРазрядность);
71+
72+
Возврат Разрядность;
5873

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

@@ -95,4 +110,17 @@
95110
Возврат Строка + ДобавочныеСимволы;
96111
КонецЕсли;
97112

113+
КонецФункции
114+
115+
Функция РазрядностьЧисла(Знач Значение)
116+
117+
Значение = ?(Значение < 0, -Значение, Значение);
118+
Значение = Значение - Цел(Значение);
119+
120+
Если Значение = 0 Тогда
121+
Возврат 0;
122+
КонецЕсли;
123+
124+
Возврат СтрДлина(СтрЗаменить(Значение, "0.", ""));
125+
98126
КонецФункции

tests/ТестыПредставленияПоказателей.os

+68-12
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,18 @@
4141

4242
ТестовыйНабор = Новый Соответствие();
4343
ТестовыйНабор[0] = "0 ns";
44-
ТестовыйНабор[10] = "10 ns";
45-
ТестовыйНабор[100] = "100 ns";
46-
ТестовыйНабор[1000] = "1 us";
47-
ТестовыйНабор[10000] = "10 us";
48-
ТестовыйНабор[100000] = "100 us";
49-
ТестовыйНабор[1000000] = "1 ms";
50-
ТестовыйНабор[10000000] = "10 ms";
51-
ТестовыйНабор[100000000] = "100 ms";
52-
ТестовыйНабор[1000000000] = "1 s";
53-
ТестовыйНабор[10000000000] = "10 s";
54-
ТестовыйНабор[60000000000] = "60 s";
55-
ТестовыйНабор[600000000000] = "600 s";
44+
ТестовыйНабор[10] = "10.0 ns";
45+
ТестовыйНабор[100] = "100.0 ns";
46+
ТестовыйНабор[1000] = "1.0 us";
47+
ТестовыйНабор[10000] = "10.0 us";
48+
ТестовыйНабор[100000] = "100.0 us";
49+
ТестовыйНабор[1000000] = "1.0 ms";
50+
ТестовыйНабор[10000000] = "10.0 ms";
51+
ТестовыйНабор[100000000] = "100.0 ms";
52+
ТестовыйНабор[1000000000] = "1.0 s";
53+
ТестовыйНабор[10000000000] = "10.0 s";
54+
ТестовыйНабор[60000000000] = "60.0 s";
55+
ТестовыйНабор[600000000000] = "600.0 s";
5656

5757
Для Каждого Строка Из ТестовыйНабор Цикл
5858

@@ -68,4 +68,60 @@
6868

6969
КонецЦикла;
7070

71+
КонецПроцедуры
72+
73+
&Тест
74+
Процедура Тест_ПредставлениеЧислаСекунды() Экспорт
75+
76+
ЕдиницаИзмерения = ЕдиницыИзмеренийБенчмарков.Наносекунда;
77+
78+
ТестовыйНабор = Новый Соответствие();
79+
ТестовыйНабор[0] = "0";
80+
ТестовыйНабор[1] = "1.0";
81+
82+
ТестовыйНабор[0.1] = "0.1";
83+
ТестовыйНабор[0.12] = "0.12";
84+
ТестовыйНабор[0.123] = "0.123";
85+
ТестовыйНабор[0.1234] = "0.123";
86+
87+
ТестовыйНабор[0.01] = "0.01";
88+
ТестовыйНабор[0.012] = "0.012";
89+
ТестовыйНабор[0.0123] = "0.0123";
90+
ТестовыйНабор[0.01234] = "0.0123";
91+
92+
ТестовыйНабор[0.001] = "0.001";
93+
ТестовыйНабор[0.0012] = "0.0012";
94+
ТестовыйНабор[0.00123] = "0.0012";
95+
96+
ТестовыйНабор[1.1] = "1.1";
97+
ТестовыйНабор[1.12] = "1.12";
98+
ТестовыйНабор[1.123] = "1.123";
99+
ТестовыйНабор[1.1234] = "1.123";
100+
101+
ТестовыйНабор[10.1] = "10.1";
102+
ТестовыйНабор[10.12] = "10.12";
103+
ТестовыйНабор[10.123] = "10.12";
104+
105+
ТестовыйНабор[100.1] = "100.1";
106+
ТестовыйНабор[100.12] = "100.1";
107+
108+
ТестовыйНабор[1000.1] = "1,000.1";
109+
ТестовыйНабор[1000.12] = "1,000.1";
110+
111+
Для Каждого Строка Из ТестовыйНабор Цикл
112+
113+
Число = Строка.Ключ;
114+
Представление = Строка.Значение;
115+
116+
Результат = ПредставленияПоказателейБенчмарков.ПредставлениеЧисла(Число, ЕдиницаИзмерения);
117+
РезультатСМинусом = ПредставленияПоказателейБенчмарков.ПредставлениеЧисла(-Число, ЕдиницаИзмерения);
118+
119+
Ожидаем.Что(Результат).Равно(Представление);
120+
121+
Если Число <> 0 Тогда
122+
Ожидаем.Что(РезультатСМинусом).Равно("-" + Представление);
123+
КонецЕсли;
124+
125+
КонецЦикла;
126+
71127
КонецПроцедуры

0 commit comments

Comments
 (0)