From 0c3ba6b043c9511be0c94a71580110cbccb8c8db Mon Sep 17 00:00:00 2001 From: Ivanov Dmitry Date: Mon, 8 Sep 2025 11:05:39 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 2 + ...20\260\321\200\320\272\320\276\320\262.os" | 380 +++++++++++++----- ...20\260\321\200\320\272\320\276\320\262.os" | 63 +++ ...21\200\320\260\321\202\320\276\321\200.os" | 116 ++++++ ...21\200\320\260\321\206\320\270\320\270.os" | 6 +- 5 files changed, 456 insertions(+), 111 deletions(-) create mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" create mode 100644 "src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\277\320\260\321\200\320\260\321\202\320\276\321\200.os" diff --git a/packagedef b/packagedef index 5052b0b..19f206d 100644 --- a/packagedef +++ b/packagedef @@ -32,6 +32,8 @@ .ЗависитОт("tempfiles", "1.1.1") .ЗависитОт("packageinfo", "1.0") .ЗависитОт("1commands", "1.5.0") + .ЗависитОт("jason", "0.3.0") + .ЗависитОт("validate", "0.3.0") .РазработкаЗависитОт("1testrunner") .РазработкаЗависитОт("coverage") .ИсполняемыйФайл("src/BenchmarkOneScript/cmd/main.os", "benchos") \ No newline at end of file diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index bae77c0..8e56200 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,33 +1,96 @@ #Использовать asserts #Использовать delegate +#Использовать validate +&Сериализуемое("Стратегия") +&Тип("Строка") +&Геттер("Стратегия") Перем _Стратегия; // см. СтратегииЗапускаБенчмарка -Перем _СтратегияПоУмолчанию; // см. СтратегииЗапускаБенчмарка + +&Сериализуемое("КоличествоИтераций") +&Тип("Число") +&Геттер("КоличествоИтераций") Перем _КоличествоИтераций; // Число -Перем _КоличествоИтерацийПоУмолчанию; // Число + +&Сериализуемое("КоличествоВызововЗаИтерацию") +&Тип("Число") +&Геттер("КоличествоВызововЗаИтерацию") Перем _КоличествоВызововЗаИтерацию; // Число -Перем _КоличествоВызововЗаИтерациюПоУмолчанию; // Число + +&Сериализуемое("КоличествоПрогревочныхИтераций") +&Тип("Число") +&Геттер("КоличествоПрогревочныхИтераций") Перем _КоличествоПрогревочныхИтераций; // Число -Перем _КоличествоПрогревочныхИтерацийПоУмолчанию; // Число + +&Сериализуемое("МинимальноеВремяИтерации") +&Тип("Число") +&Геттер("МинимальноеВремяИтерации") Перем _МинимальноеВремяИтерации; // Число - мс -Перем _МинимальноеВремяИтерацииПоУмолчанию; // Число - мс + +&Сериализуемое("МинимальноеКоличествоВызововЗаИтерацию") +&Тип("Число") +&Геттер("МинимальноеКоличествоВызововЗаИтерацию") Перем _МинимальноеКоличествоВызововЗаИтерацию; // Число -Перем _МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию; // Число + +&Сериализуемое("СортировкаОтчета") +&Тип("Строка") +&Геттер("СортировкаОтчета") Перем _СортировкаОтчета; // см. СортировкиОтчетаБенчмарков -Перем _СортировкаОтчетаПоУмолчанию; // см. СортировкиОтчетаБенчмарков + +&Сериализуемое("ТребуетсяМониторингПамяти") +&Тип("Булево") +&Геттер("ТребуетсяМониторингПамяти") Перем _ТребуетсяМониторингПамяти; // Булево -Перем _ТребуетсяМониторингПамятиПоУмолчанию; // Булево + +&Сериализуемое("КаталогАртефактов") +&Тип("Строка") +&Геттер("КаталогАртефактов") Перем _КаталогАртефактов; // Строка -Перем _КаталогАртефактовПоУмолчанию; // Строка + +&Сериализуемое("Параметры") +&Тип("Массив") +&Геттер("Параметры") Перем _Параметры; // Массив из ПараметрБенчмарка + +&Сериализуемое("ИсточникиПараметров") +&Тип("ТаблицаЗначений") +&Геттер("ИсточникиПараметров") Перем _ИсточникиПараметров; // ТаблицаЗначений -Перем _Обработчики; // Соответствие + +&Сериализуемое("Обработчики") +&Тип("ТаблицаЗначений") +&Геттер("ОбработчикиСобытий") +Перем _Обработчики; // ТаблицаЗначений + +&Сериализуемое("Колонки") +&Тип("Массив") +&Геттер("Колонки") Перем _Колонки; // Массив из Строка - см. КолонкиОтчетаБенчмарков + +&Несериализуемое +&Геттер("Экспортеры") Перем _Экспортеры; // Массив из см. ЭкспортерыРезультатовБенчмарков + +&Сериализуемое("Экспортеры") +&Тип("Массив") +Перем _ЭкспортерыСериализуемое; // Массив из Строка + +&Сериализуемое("ВерсииИсполняющейСреды") +&Тип("ТаблицаЗначений") +&Геттер("ВерсииИсполняющейСреды") Перем _ВерсииИсполняющейСреды; // ТаблицаЗначений +&Несериализуемое +Перем _ЗначенияПолейПоУмолчанию; // Соответствие + +&Несериализуемое Перем _МодифицированныеПоля; // Соответствие -Перем _Рефлектор; // Рефлектор, Неопределено + +&Несериализуемое +Перем _ОписанияПолей; // ТаблицаЗначений, Неопределено + +&Несериализуемое +Перем _Рефлектор; // Рефлектор #Область Конструктор @@ -37,35 +100,37 @@ // ИсточникБенчмарков - Тип, Произвольный - Тип или экземпляр класса бенчмарков Процедура ПриСозданииОбъекта(ИсточникБенчмарков = Неопределено) - _СтратегияПоУмолчанию = СтратегииЗапускаБенчмарка.ПропускнаяСпособность; - _КоличествоИтерацийПоУмолчанию = 15; - _КоличествоВызововЗаИтерациюПоУмолчанию = 0; - _КоличествоПрогревочныхИтерацийПоУмолчанию = 6; - _МинимальноеВремяИтерацииПоУмолчанию = 100; - _МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию = 4; - _СортировкаОтчетаПоУмолчанию = СортировкиОтчетаБенчмарков.ПоУмолчанию; - _КаталогАртефактовПоУмолчанию = ".\BenchmarkArtifacts"; - _ТребуетсяМониторингПамятиПоУмолчанию = Ложь; + СтратегияПоУмолчанию = СтратегииЗапускаБенчмарка.ПропускнаяСпособность; + КоличествоИтерацийПоУмолчанию = 15; + КоличествоВызововЗаИтерациюПоУмолчанию = 0; + КоличествоПрогревочныхИтерацийПоУмолчанию = 6; + МинимальноеВремяИтерацииПоУмолчанию = 100; + МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию = 4; + СортировкаОтчетаПоУмолчанию = СортировкиОтчетаБенчмарков.ПоУмолчанию; + КаталогАртефактовПоУмолчанию = ".\BenchmarkArtifacts"; + ТребуетсяМониторингПамятиПоУмолчанию = Ложь; _Параметры = Новый Массив(); _ИсточникиПараметров = ПустаяТаблицаИсточникиПараметров(); - _Обработчики = Новый Соответствие(); + _Обработчики = ПустаяТаблицаОбработчикиСобытий(); _Колонки = Новый Массив(); _Экспортеры = Новый Массив(); - _МодифицированныеПоля = Новый Соответствие(); _ВерсииИсполняющейСреды = ПустаяТаблицаВерсииИсполняющейСреды(); - _ТребуетсяМониторингПамяти = _ТребуетсяМониторингПамятиПоУмолчанию; + _ТребуетсяМониторингПамяти = ТребуетсяМониторингПамятиПоУмолчанию; + _МодифицированныеПоля = Новый Соответствие(); + _Рефлектор = Новый Рефлектор(); - УстановитьСтратегию(_СтратегияПоУмолчанию); - УстановитьКоличествоИтераций(_КоличествоИтерацийПоУмолчанию); - УстановитьКоличествоВызововЗаИтерацию(_КоличествоВызововЗаИтерациюПоУмолчанию); - УстановитьКоличествоПрогревочныхИтераций(_КоличествоПрогревочныхИтерацийПоУмолчанию); - УстановитьМинимальноеВремяИтерации(_МинимальноеВремяИтерацииПоУмолчанию); - УстановитьМинимальноеКоличествоВызововЗаИтерацию(_МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию); - УстановитьСортировкуОтчета(_СортировкаОтчетаПоУмолчанию); - УстановитьКаталогАртефактов(_КаталогАртефактовПоУмолчанию); + УстановитьСтратегию(СтратегияПоУмолчанию); + УстановитьКоличествоИтераций(КоличествоИтерацийПоУмолчанию); + УстановитьКоличествоВызововЗаИтерацию(КоличествоВызововЗаИтерациюПоУмолчанию); + УстановитьКоличествоПрогревочныхИтераций(КоличествоПрогревочныхИтерацийПоУмолчанию); + УстановитьМинимальноеВремяИтерации(МинимальноеВремяИтерацииПоУмолчанию); + УстановитьМинимальноеКоличествоВызововЗаИтерацию(МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию); + УстановитьСортировкуОтчета(СортировкаОтчетаПоУмолчанию); + УстановитьКаталогАртефактов(КаталогАртефактовПоУмолчанию); _МодифицированныеПоля.Очистить(); + ЗапомнитьЗначенияПолейПоУмолчанию(); Если Не ИсточникБенчмарков = Неопределено Тогда ИзвлекательКонфигурацииБенчмарков.Извлечь(ИсточникБенчмарков, ЭтотОбъект); @@ -485,11 +550,15 @@ // ЭтотОбъект Функция ДобавитьОбработчикСобытия(ИмяСобытия, Обработчик) Экспорт - Если _Обработчики[ИмяСобытия] = Неопределено Тогда - _Обработчики[ИмяСобытия] = Новый Соответствие(); + Отбор = Новый Структура("Событие, Обработчик", ИмяСобытия, Обработчик); + Если _Обработчики.НайтиСтроки(Отбор).Количество() > 0 Тогда + Возврат ЭтотОбъект; КонецЕсли; - _Обработчики[ИмяСобытия][Обработчик] = Новый Структура("ЕстьПараметры"); + СтрокаТаблицы = _Обработчики.Добавить(); + СтрокаТаблицы.Событие = ИмяСобытия; + СтрокаТаблицы.Обработчик = Обработчик; + УстановитьМодифицированность(ИмяПоля_ОбработчикиСобытий()); Возврат ЭтотОбъект; @@ -505,9 +574,12 @@ // ЭтотОбъект Функция УдалитьОбработчикиСобытия(ИмяСобытия) Экспорт - Если Не _Обработчики[ИмяСобытия] = Неопределено Тогда - _Обработчики[ИмяСобытия].Очистить(); - КонецЕсли; + НайденныеСтроки = _Обработчики.НайтиСтроки(Новый Структура("Событие", ИмяСобытия)); + Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл + _Обработчики.Удалить(СтрокаТаблицы); + КонецЦикла; + + УстановитьМодифицированность(ИмяПоля_ОбработчикиСобытий()); Возврат ЭтотОбъект; @@ -534,26 +606,7 @@ // * Обработчик - Строка - Экспортный метод экземпляра класса бенчмарков // - Делегат - Делегат Функция ОбработчикиСобытий() Экспорт - - Результат = Новый ТаблицаЗначений(); - Результат.Колонки.Добавить("Событие"); - Результат.Колонки.Добавить("Обработчик"); - - Для Каждого ОбработчикиСобытия Из _Обработчики Цикл - - Событие = ОбработчикиСобытия.Ключ; - Обработчики = ОбработчикиСобытия.Значение; - - Для Каждого КлючЗначение Из Обработчики Цикл - СтрокаТаблицы = Результат.Добавить(); - СтрокаТаблицы.Событие = Событие; - СтрокаТаблицы.Обработчик = КлючЗначение.Ключ; - КонецЦикла; - - КонецЦикла; - - Возврат Результат; - + Возврат _Обработчики.Скопировать(); КонецФункции // Обработчики события @@ -568,13 +621,9 @@ Результат = Новый Массив(); - ОбработчикиСобытия = _Обработчики[ИмяСобытия]; - Если ОбработчикиСобытия = Неопределено Тогда - Возврат Результат; - КонецЕсли; - - Для Каждого Строка Из ОбработчикиСобытия Цикл - Результат.Добавить(Строка.Ключ); + НайденныеСтроки = _Обработчики.НайтиСтроки(Новый Структура("Событие", ИмяСобытия)); + Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл + Результат.Добавить(СтрокаТаблицы.Обработчик); КонецЦикла; Возврат Результат; @@ -594,23 +643,12 @@ МассивДелегатов = Новый Массив(); - ОбработчикиСобытия = _Обработчики[ИмяСобытия]; - Если ОбработчикиСобытия = Неопределено Тогда - Возврат МассивДелегатов; - КонецЕсли; - - Для Каждого Строка Из ОбработчикиСобытия Цикл - - Обработчик = Строка.Ключ; - Описание = Строка.Значение; + НайденныеСтроки = _Обработчики.НайтиСтроки(Новый Структура("Событие", ИмяСобытия)); + Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл - Делегат = ДелегатОбработчика(Обработчик, ОбъектБенчмарков); - - Если Описание.ЕстьПараметры = Неопределено Тогда - Описание.ЕстьПараметры = ЕстьПараметрыМетода(Делегат); - КонецЕсли; + Делегат = ДелегатОбработчика(СтрокаТаблицы.Обработчик, ОбъектБенчмарков); - Если Описание.ЕстьПараметры Тогда + Если ЕстьПараметрыМетода(Делегат) Тогда Делегат.УстановитьПараметры(Контекст); КонецЕсли; @@ -653,6 +691,7 @@ Инд = _Колонки.Найти(Колонка); Если Не Инд = Неопределено Тогда _Колонки.Удалить(Инд); + УстановитьМодифицированность(ИмяПоля_Колонки()); КонецЕсли; Возврат ЭтотОбъект; @@ -923,23 +962,13 @@ Таблица.Колонки.Добавить("Значение"); Таблица.Колонки.Добавить("Модифицирован", Новый ОписаниеТипов("Булево")); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Стратегия(), Стратегия()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоИтераций(), КоличествоИтераций()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоВызововЗаИтерацию(), КоличествоВызововЗаИтерацию()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоПрогревочныхИтераций(), КоличествоПрогревочныхИтераций()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_МинимальноеВремяИтерации(), МинимальноеВремяИтерации()); - ДобавитьСтрокуВТаблицу( - Таблица, ИмяПоля_МинимальноеКоличествоВызововЗаИтерацию(), МинимальноеКоличествоВызововЗаИтерацию()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_СортировкаОтчета(), СортировкаОтчета()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КаталогАртефактов(), КаталогАртефактов()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ТребуетсяМониторингПамяти(), ТребуетсяМониторингПамяти()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Параметры(), Параметры()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ИсточникиПараметров(), ИсточникиПараметров()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ОбработчикиСобытий(), ОбработчикиСобытий()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Колонки(), Колонки()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Экспортеры(), Экспортеры()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ВерсииИсполняющейСреды(), ВерсииИсполняющейСреды()); - + Для Каждого ОписаниеПоля Из ОписанияПолей() Цикл + СтрокаТаблицы = Таблица.Добавить(); + СтрокаТаблицы.Имя = ОписаниеПоля.Имя; + СтрокаТаблицы.Значение = _Рефлектор.ПолучитьСвойство(ЭтотОбъект, ОписаниеПоля.ИмяВнутреннее); + СтрокаТаблицы.Модифицирован = _МодифицированныеПоля[ОписаниеПоля.Имя]; + КонецЦикла; + Возврат Таблица; КонецФункции @@ -989,6 +1018,27 @@ #КонецОбласти +#Область Сериализация + +Процедура ОбработатьПередСериализацией() Экспорт + + ПроверитьОбработчикиСобытийПередСериализацией(); + ПроверитьИсточникиПараметровПередСериализацией(); + ОбработатьЭкспортерыПередСериализацией(); + +КонецПроцедуры + +Процедура ОбработатьПослеДесериализации() Экспорт + + ОбработатьПараметрыПослеДесериализации(); + ОбработатьЭкспортерыПослеДесериализации(); + ОпределитьМодифицированныеПоля(); + ВыполнитьВалидациюПослеДесериализации(); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1013,15 +1063,67 @@ КонецФункции -Функция ДобавитьСтрокуВТаблицу(Таблица, Имя, Значение) +Процедура ОпределитьМодифицированныеПоля() + + Для Каждого ОписаниеПоля Из ОписанияПолей() Цикл + Значение = _Рефлектор.ПолучитьСвойство(ЭтотОбъект, ОписаниеПоля.ИмяВнутреннее); + ЗначениеПоУмолчанию = _ЗначенияПолейПоУмолчанию[ОписаниеПоля.Имя]; + + Если Не Компаратор.Совпадают(Значение, ЗначениеПоУмолчанию) Тогда + УстановитьМодифицированность(ОписаниеПоля.Имя); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ЗапомнитьЗначенияПолейПоУмолчанию() + + _ЗначенияПолейПоУмолчанию = Новый Соответствие(); + + Для Каждого ОписаниеПоля Из ОписанияПолей() Цикл + _ЗначенияПолейПоУмолчанию[ОписаниеПоля.Имя] = _Рефлектор.ПолучитьСвойство(ЭтотОбъект, ОписаниеПоля.ИмяВнутреннее); + КонецЦикла; + +КонецПроцедуры + +Функция ОписанияПолей() + + Если Не _ОписанияПолей = Неопределено Тогда + Возврат _ОписанияПолей; + КонецЕсли; + + _ОписанияПолей = Новый ТаблицаЗначений(); + _ОписанияПолей.Колонки.Добавить("Имя"); + _ОписанияПолей.Колонки.Добавить("ИмяВнутреннее"); + _ОписанияПолей.Колонки.Добавить("Геттер"); + + СвойстваОбъекта = _Рефлектор.ПолучитьТаблицуСвойств(ЭтотОбъект, Истина); - Строка = Таблица.Добавить(); - Строка.Имя = Имя; - Строка.Значение = Значение; - Строка.Модифицирован = _МодифицированныеПоля[Имя]; + Для Каждого Свойство Из СвойстваОбъекта Цикл + ИмяПоля = Сред(Свойство.Имя, 2); - Возврат Строка; + АннотацияГеттер = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Геттер"); + Если АннотацияГеттер = Неопределено Тогда + Продолжить; + КонецЕсли; + + Геттер = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияГеттер, "Значение", Свойство.Имя); + + ОписаниеПоля = _ОписанияПолей.Добавить(); + ОписаниеПоля.Имя = ИмяПоля; + ОписаниеПоля.ИмяВнутреннее = Свойство.Имя; + ОписаниеПоля.Геттер = Геттер; + КонецЦикла; + Возврат _ОписанияПолей; + +КонецФункции + +Функция ПустаяТаблицаОбработчикиСобытий() + Таблица = Новый ТаблицаЗначений(); + Таблица.Колонки.Добавить("Событие"); + Таблица.Колонки.Добавить("Обработчик"); + Возврат Таблица; КонецФункции Функция ПустаяТаблицаВерсииИсполняющейСреды() @@ -1039,18 +1141,80 @@ Возврат Таблица; КонецФункции -#Область Модифицированность +#Область Сериализация + +Процедура ПроверитьОбработчикиСобытийПередСериализацией() Экспорт + + Для Каждого Строка Из _Обработчики Цикл + Тип = ТипЗнч(Строка.Обработчик); + Если Тип <> Тип("Строка") Тогда + ВызватьИсключение СтрШаблон("Обработчик события типа <%1> не поддерживает сериализацию.", Тип); + КонецЕсли; + КонецЦикла; -Процедура УстановитьМодифицированность(ИмяПоля_) - _МодифицированныеПоля[ИмяПоля_] = Истина; КонецПроцедуры -Процедура ПрименитьМодифицированноеПоле(ИмяПоля, МетодУстановки, ЗначенияМодифицированныхПолей) +Процедура ПроверитьИсточникиПараметровПередСериализацией() + + Для Каждого ИсточникПараметров Из _ИсточникиПараметров Цикл + Тип = ТипЗнч(ИсточникПараметров.Источник); + Если Тип <> Тип("Строка") Тогда + ВызватьИсключение СтрШаблон("Источник параметров типа <%1> не поддерживает сериализацию.", Тип); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ОбработатьЭкспортерыПередСериализацией() + + _ЭкспортерыСериализуемое = Новый Массив; + + Для Каждого Экспортер Из _Экспортеры Цикл + _ЭкспортерыСериализуемое.Добавить(Строка(ТипЗнч(Экспортер))); + КонецЦикла; + +КонецПроцедуры + +Процедура ОбработатьЭкспортерыПослеДесериализации() + + Для Каждого СтрокаТип Из _ЭкспортерыСериализуемое Цикл + ДобавитьЭкспортер(Новый(СтрокаТип)); + КонецЦикла; + +КонецПроцедуры - Если _Рефлектор = Неопределено Тогда - _Рефлектор = Новый Рефлектор(); +Процедура ОбработатьПараметрыПослеДесериализации() + + Параметры = Новый ФиксированныйМассив(_Параметры); + + ОчиститьПараметры(); + Для Каждого ПараметрДанные Из Параметры Цикл + ДобавитьПараметр(ПараметрДанные.Имя, ПараметрДанные.Значение); + КонецЦикла; + +КонецПроцедуры + +Процедура ВыполнитьВалидациюПослеДесериализации() + + Валидатор = Новый Валидатор; + + Результат = Валидатор.Валидировать(ЭтотОбъект); + Если Результат.Количество() > 0 Тогда + ВызватьИсключение Валидатор.ОписаниеОшибокВалидации(Результат); КонецЕсли; +КонецПроцедуры + +#КонецОбласти + +#Область Модифицированность + +Процедура УстановитьМодифицированность(ИмяПоля) + _МодифицированныеПоля[ИмяПоля] = Истина; +КонецПроцедуры + +Процедура ПрименитьМодифицированноеПоле(ИмяПоля, МетодУстановки, ЗначенияМодифицированныхПолей) + Если Не ЗначенияМодифицированныхПолей[ИмяПоля] = Неопределено Тогда Параметры = Новый Массив(); diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" new file mode 100644 index 0000000..7eddd89 --- /dev/null +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -0,0 +1,63 @@ +#Использовать logos +#Использовать jason + +Перем _Лог; // Лог + +// Сериализатор конфигурации бенчмарков +Процедура ПриСозданииОбъекта() + _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.СериализаторБенчмарков"); +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Сериализует конфигурацию бенчмарков в JSON-файл +// +// Параметры: +// Дескрипторы - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов бенчмарков +// Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков +// ИмяФайла - Строка - Имя файла, в который будет записана конфигурация +Процедура ЗаписатьВJson(Конфигурация, ИмяФайла) Экспорт + + _Лог.Отладка("Начало формирования файла: %1", ИмяФайла); + + ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб); + + Сериализатор = Новый СериализаторJson(); + + Конфигурация.ОбработатьПередСериализацией(); + + ЗаписьJSON = Новый ЗаписьJSON(); + ЗаписьJSON.ОткрытьФайл(ИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); + ЗаписьJSON.ЗаписатьБезОбработки(Сериализатор.Сериализовать(Конфигурация)); + ЗаписьJSON.Закрыть(); + + _Лог.Отладка("Завершение формирования файла: %1", ИмяФайла); + +КонецПроцедуры + +// Десериализует конфигурацию бенчмарков из JSON-файла +// +// Параметры: +// ИмяФайла - Строка - Имя файла, из которого будет прочитана конфигурация. +// +// Возвращаемое значение: +// КонфигурацияБенчмарков +Функция ПрочитатьИзJson(ИмяФайла) Экспорт + + _Лог.Отладка("Начало чтения файла: %1", ИмяФайла); + + ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, "UTF-8"); + Строка = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + Десериализатор = Новый ДесериализаторJson(); + Конфигурация = Десериализатор.Десериализовать(Строка, Тип("КонфигурацияБенчмарков")); + Конфигурация.ОбработатьПослеДесериализации(); + + _Лог.Отладка("Завершение чтения файла: %1", ИмяФайла); + + Возврат Конфигурация; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\277\320\260\321\200\320\260\321\202\320\276\321\200.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\277\320\260\321\200\320\260\321\202\320\276\321\200.os" new file mode 100644 index 0000000..0d98075 --- /dev/null +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\277\320\260\321\200\320\260\321\202\320\276\321\200.os" @@ -0,0 +1,116 @@ +#Область ПрограммныйИнтерфейс + +// Определяет, совпадают ли значения двух объектов по их внутреннему содержанию. +// +// Параметры: +// Значение1 - Проивзольный - Первый объект для сравнения +// Значение2 - Проивзольный - Второй объект для сравнения +// +// Возвращаемое значение: +// Булево +Функция Совпадают(Значение1, Значение2) Экспорт + + Тип = ТипЗнч(Значение1); + + Если Тип <> ТипЗнч(Значение2) Тогда + Возврат Ложь; + ИначеЕсли Тип = Тип("Массив") Тогда + Возврат МассивыСовпадают(Значение1, Значение2); + ИначеЕсли Тип = Тип("Соответствие") Тогда + Возврат СоответствияСовпадают(Значение1, Значение2); + ИначеЕсли Тип = Тип("Структура") Тогда + Возврат СтруктурыСовпадают(Значение1, Значение2); + ИначеЕсли Тип = Тип("ТаблицаЗначений") Тогда + Возврат ТаблицыСовпадают(Значение1, Значение2); + Иначе + Возврат Значение1 = Значение2; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция МассивыСовпадают(Массив1, Массив2) + + Если Массив1.Количество() <> Массив2.Количество() Тогда + Возврат Ложь; + КонецЕсли; + + Для Инд = 0 По Массив1.ВГраница() Цикл + Если Не Совпадают(Массив1[Инд], Массив2[Инд]) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +Функция СоответствияСовпадают(Соответствие1, Соответствие2) + + Если Соответствие1.Количество() <> Соответствие2.Количество() Тогда + Возврат Ложь; + КонецЕсли; + + Для Каждого КлючЗначение Из Соответствие1 Цикл + Ключ = КлючЗначение.Ключ; + Если Не Совпадают(Соответствие1[Ключ], Соответствие2[КлючЗначение.Ключ]) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +Функция СтруктурыСовпадают(Структура1, Структура2) + + Если Структура1.Количество() <> Структура2.Количество() Тогда + Возврат Ложь; + КонецЕсли; + + Для Каждого КлючЗначение Из Структура1 Цикл + Ключ = КлючЗначение.Ключ; + Если Не Структура2.Свойство(Ключ) Тогда + Возврат Ложь; + КонецЕсли; + + Если Не Совпадают(Структура1[Ключ], Структура2[КлючЗначение.Ключ]) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +Функция ТаблицыСовпадают(Таблица1, Таблица2) + + Если Таблица1.Количество() <> Таблица2.Количество() + Или Таблица1.Колонки.Количество() <> Таблица2.Колонки.Количество() Тогда + Возврат Ложь; + КонецЕсли; + + Для Каждого Колонка Из Таблица1.Колонки Цикл + Если Таблица2.Колонки.Найти(Колонка.Имя) = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Для Инд = 0 По Таблица1.Количество() - 1 Цикл + СтрокаТаблицы1 = Таблица1[Инд]; + СтрокаТаблицы2 = Таблица2[Инд]; + Для Каждого Колонка Из Таблица1.Колонки Цикл + Если Не Совпадают(СтрокаТаблицы1[Колонка.Имя], СтрокаТаблицы2[Колонка.Имя]) Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 5a40d0f..04a690d 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -766,9 +766,9 @@ ИмяФайла = МенеджерВременныхФайлов.НовоеИмяФайла(); - Сериализатор = Новый СериализаторКонфигурацииБенчмарков(); - Сериализатор.СериализоватьВJSON(Конфигурация, ИмяФайла); - КонфигурацияПрочитанная = Сериализатор.ДесериализоватьИзJSON(ИмяФайла); + Сериализатор = Новый СериализаторБенчмарков(); + Сериализатор.ЗаписатьВJson(Конфигурация, ИмяФайла); + КонфигурацияПрочитанная = Сериализатор.ПрочитатьИзJson(ИмяФайла); ПроверитьКонфигурациюБенчмаркСАннотациямиКонфигурации(КонфигурацияПрочитанная); From 3d656981ea586bee0ccf4581db0c8d85520daa86 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 18 Oct 2025 01:29:32 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F/=D0=B4=D0=B5=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/CLI.md | 2 +- packagedef | 14 +- ...20\277\321\203\321\201\320\272\320\260.os" | 76 +++-- ...20\274\320\260\321\200\320\272\320\260.os" | 70 ++++- ...20\260\321\200\320\272\320\276\320\262.os" | 42 +-- ...20\260\320\273\320\276\320\263\320\260.os" | 2 +- ...20\260\321\200\320\272\320\276\320\262.os" | 23 +- ...20\260\321\200\320\272\320\276\320\262.os" | 33 +-- ...20\274\320\260\321\200\320\272\320\260.os" | 2 +- ...20\274\320\260\321\200\320\272\320\260.os" | 51 ++++ ...20\260\321\200\320\272\320\276\320\262.os" | 232 --------------- ...20\260\321\200\320\272\320\276\320\262.os" | 34 ++- ...20\260\321\200\320\272\320\276\320\262.os" | 9 +- ...00\320\272\320\276\320\262\320\222Json.os" | 2 +- ...20\260\321\200\320\272\320\276\320\262.os" | 3 +- ...20\260\321\200\320\272\320\276\320\262.os" | 3 +- ...20\274\320\260\321\200\320\272\320\260.os" | 26 +- ...20\276\320\262\320\224\321\202\320\276.os" | 9 + ...21\203\320\265\320\274\320\276\320\265.os" | 9 + ...21\203\320\265\320\274\320\276\320\265.os" | 18 ++ ...0\260\321\202\320\276\321\200JsonBench.os" | 280 ++++++++++++++++++ ...0\260\321\202\320\276\321\200JsonBench.os" | 197 ++++++++++++ ...21\200\320\260\321\206\320\270\320\270.os" | 5 +- ...20\260\321\200\320\272\320\276\320\262.os" | 14 +- ...21\200\320\260\321\206\320\270\320\270.os" | 33 +-- ...20\260\321\200\320\272\320\276\320\262.os" | 105 +++++++ ...20\273\320\276\320\275\320\276\320\262.os" | 1 + 27 files changed, 907 insertions(+), 388 deletions(-) create mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\321\202\320\276\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" delete mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" rename "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" => "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" (57%) create mode 100644 "src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" create mode 100644 "src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\235\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\320\276\320\265.os" create mode 100644 "src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\320\276\320\265.os" create mode 100644 "src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" create mode 100644 "src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" create mode 100644 "tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" diff --git a/docs/CLI.md b/docs/CLI.md index 0401683..ae60179 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -23,7 +23,7 @@ benchos run [OPTIONS] [FILE] | `-e`, `--exporters` | Форматы [экспорта результатов](ЭкспортРезультатов.md) (`md`, `json`, `xml`, `html`) | `-e json,xml` | | `-a`, `--artifacts` | Каталог для сохранения результатов | `-a path/to/file` | | `-r`, `--recursive` | Рекурсивный поиск в поддиректориях | | -| `-c`, `--config` | Файл конфигурации бенчмарков в формате JSON | `-c path/to/config.json` | +| `--settings` | Файл настроек бенчмарков в формате JSON | `--settings path/to/settings.json` | ## Примеры diff --git a/packagedef b/packagedef index 19f206d..d824de1 100644 --- a/packagedef +++ b/packagedef @@ -1,4 +1,4 @@ -Процедура ПередСборкой(РабочийКаталог) Экспорт +Процедура ПередСборкой(РабочийКаталог) Экспорт ПодготовкаКомпонентов = ЗагрузитьСценарий("build/ПодготовкаКомпонентов.os"); ПодготовкаКомпонентов.Подготовить(); КонецПроцедуры @@ -7,6 +7,7 @@ .Версия("0.6.0") .Автор("Dmitry Ivanov") .АдресАвтора("https://github.com/Stivo182") + .АдресРепозитория("https://github.com/Stivo182/BenchmarkOneScript") .Описание("Бенчмаркинг на OneScript") .ВерсияСреды("1.9.3") .ВключитьФайл("src/BenchmarkOneScript") @@ -17,11 +18,11 @@ .ВключитьФайл("package-loader.os") .ВключитьФайл("README.md") .ВключитьФайл("LICENSE") - .ЗависитОт("cpuinfo", "1.3.0") + .ЗависитОт("cpuinfo", "1.4.0") .ЗависитОт("delegate", "1.0.0") .ЗависитОт("annotations", "1.3.1") - .ЗависитОт("asserts", "1.4.0") - .ЗависитОт("autumn", "4.3.10") + .ЗависитОт("asserts", "1.5.0") + .ЗависитОт("autumn", "4.3.11") .ЗависитОт("autumn-cli", "1.2.0") .ЗависитОт("coloratos", "0.3.0") .ЗависитОт("fluent", "0.6.1") @@ -30,10 +31,11 @@ .ЗависитОт("logos", "1.7.1") .ЗависитОт("fs", "1.2.0") .ЗависитОт("tempfiles", "1.1.1") - .ЗависитОт("packageinfo", "1.0") + .ЗависитОт("packageinfo", "1.1.1") .ЗависитОт("1commands", "1.5.0") - .ЗависитОт("jason", "0.3.0") .ЗависитОт("validate", "0.3.0") + .ЗависитОт("reflector", "0.7.1") + .ЗависитОт("collectionos", "0.8.2") .РазработкаЗависитОт("1testrunner") .РазработкаЗависитОт("coverage") .ИсполняемыйФайл("src/BenchmarkOneScript/cmd/main.os", "benchos") \ No newline at end of file diff --git "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" index 3ce69bf..f0efaf1 100644 --- "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" @@ -44,9 +44,9 @@ &Флаг Перем _ПропускнаяСпособность; // Булево, Неопределено -&Опция(Имя = "c config", Описание = "Файл конфигурации бенчмарков в формате JSON") +&Опция(Имя = "settings", Описание = "Файл настроек бенчмарков в формате JSON") &ТСтрока -Перем _ФайлКонфигурации; // Строка +Перем _ФайлНастроек; // Строка &Опция(Имя = "runtime", Описание = "Версии OneScript через запятую (current, stable, dev, x.x.x)") &ТСтрока @@ -62,8 +62,11 @@ &ТМассивСтрок Перем _МассивФайлов; // Массив из Строка +Перем _Лог; // Лог + &КомандаПриложения(Имя = "run", Описание = "Запуск бенчмарков") Процедура ПриСозданииОбъекта() + _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark"); КонецПроцедуры &ВыполнениеКоманды @@ -71,32 +74,55 @@ УстановитьРежимВоркер(); - Для Каждого Каталог Из КаталогиБенчмарков() Цикл - Бенчмаркинг.ЗапуститьИзКаталога(Каталог, _Рекурсивно, ПрочитатьКонфигурацию()); - КонецЦикла; + ПодключенныеТипы = ПодключитьТипы(); + Настройки = ПрочитатьНастройки(); + Конфигурация = ПрочитатьКонфигурацию(Настройки); - Для Каждого ИмяФайла Из ФайлыБенчмарков() Цикл - Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла); - Если Не Тип = Неопределено Тогда - Конфигурация = Новый КонфигурацияБенчмарков(Тип); - Конфигурация.Объединить(ПрочитатьКонфигурацию()); - Бенчмаркинг.Запустить(Тип, Конфигурация); + Для Каждого Тип Из ПодключенныеТипы Цикл + + КонфигурацияТипа = Новый КонфигурацияБенчмарков(Тип); + КонфигурацияТипа.Объединить(Конфигурация); + + Если Не Настройки = Неопределено И Настройки.ДескрипторыБенчмарков.Количество() > 0 Тогда + Источник = Настройки.ДескрипторыБенчмарков; + Иначе + Источник = Тип; КонецЕсли; + + Попытка + Бенчмаркинг.Запустить(Источник, КонфигурацияТипа); + Исключение + _Лог.Ошибка("Возникла ошибка при запуске бенчмарков <%1>: %2", + Тип, + ОписаниеОшибки()); + КонецПопытки; + КонецЦикла; КонецПроцедуры -Функция КаталогиБенчмарков() - - Каталоги = Новый Массив(); +Функция ПрочитатьНастройки() - Для Каждого ИмяФайла Из _МассивФайлов Цикл - Если ФС.КаталогСуществует(ИмяФайла) Тогда - Каталоги.Добавить(ИмяФайла); + Если Не ЗначениеЗаполнено(_ФайлНастроек) Тогда + Возврат Неопределено; + КонецЕсли; + + Сериализатор = Новый СериализаторНастроекБенчмарков(); + Возврат Сериализатор.ПрочитатьИзJson(_ФайлНастроек); + +КонецФункции + +Функция ПодключитьТипы() + + ПодключенныеТипы = Новый Массив(); + Для Каждого ИмяФайла Из ФайлыБенчмарков() Цикл + Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла); + Если Не Тип = Неопределено Тогда + ПодключенныеТипы.Добавить(Тип); КонецЕсли; КонецЦикла; - Возврат Каталоги; + Возврат ПодключенныеТипы; КонецФункции @@ -105,7 +131,12 @@ Файлы = Новый Массив(); Для Каждого ИмяФайла Из _МассивФайлов Цикл - Если Не ФС.КаталогСуществует(ИмяФайла) Тогда + Если ФС.КаталогСуществует(ИмяФайла) Тогда + Файлы = НайтиФайлы(ИмяФайла, , _Рекурсивно); + Для Каждого ИмяФайлаВКаталоге Из Файлы Цикл + Файлы.Добавить(ИмяФайлаВКаталоге); + КонецЦикла; + Иначе Файлы.Добавить(ПолноеИмяФайлаСценария(ИмяФайла)); КонецЕсли; КонецЦикла; @@ -131,11 +162,10 @@ КонецФункции -Функция ПрочитатьКонфигурацию() +Функция ПрочитатьКонфигурацию(Настройки) - Если ЗначениеЗаполнено(_ФайлКонфигурации) Тогда - Сериализатор = Новый СериализаторКонфигурацииБенчмарков(); - Конфигурация = Сериализатор.ДесериализоватьИзJSON(_ФайлКонфигурации); + Если Настройки <> Неопределено Тогда + Конфигурация = Настройки.Конфигурация; Иначе Конфигурация = Новый КонфигурацияБенчмарков(); КонецЕсли; diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index b2280d6..1e65213 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -1,21 +1,47 @@ #Использовать delegate +#Использовать validate +#Использовать reflector +#Использовать "../../dto" +&Сериализуемое("Тип") +&Тип("Тип") +&Заполнено Перем _Тип; // Тип - Класс бенчмарков + +&Сериализуемое("Метод") +&Тип("Строка") +&Заполнено Перем _Метод; // Строка - Метод бенчмарка + +&Сериализуемое("ЭтоЭталон") +&Тип("Булево") Перем _ЭтоЭталон; // Булево + +&Сериализуемое("Категория") +&Тип("Строка") Перем _Категория; // Строка -Перем _НаборыПараметров; // Массив из Массив из ПараметрБенчмарка -Перем _ИменаПараметров; // Массив из Строка + +&Сериализуемое("НаборыПараметров") +&Тип("Массив") +&ДляКаждого +&Тип("ПараметрыМетодаБенчмарка") +Перем _НаборыПараметров; // Массив из ПараметрыМетодаБенчмарка + +&Сериализуемое("ИсточникиПараметров") +&Тип("Массив") Перем _ИсточникиПараметров; // Массив из Строка, Делегат +&Несериализуемое +Перем _ИменаПараметров; // Массив из Строка + #Область Конструктор // Дескриптор бенчмарка // // Параметры: -// Объект - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// Объект - Произвольный - Тип или экземпляр класса бенчмарков // Метод - Строка - Метод бенчмарка -Процедура ПриСозданииОбъекта(Объект, Метод) +Процедура ПриСозданииОбъекта(Объект = Неопределено, Метод = "") _Тип = ?(ТипЗнч(Объект) = Тип("Тип"), Объект, ТипЗнч(Объект)); _Метод = Метод; @@ -24,7 +50,9 @@ _Категория = ""; _ИсточникиПараметров = Новый Массив(); - ИзвлечьИменаПараметров(Объект); + Если Не Объект = Неопределено Тогда + ИзвлечьИменаПараметров(Объект); + КонецЕсли; КонецПроцедуры @@ -51,7 +79,7 @@ // Наборы параметров, используемые для запуска бенчмарков с различными входными данными. // // Возвращаемое значение: -// Массив из Массив из ПараметрБенчмарка +// Массив из ПараметрыМетодаБенчмарка Функция НаборыПараметров() Экспорт Возврат Новый Массив(Новый ФиксированныйМассив(_НаборыПараметров)); КонецФункции @@ -67,7 +95,7 @@ // ЭтотОбъект Функция ДобавитьПараметры(Параметры) Экспорт - МассивПараметров = Новый Массив(); + ПараметрыМетода = Новый ПараметрыМетодаБенчмарка(); КоличествоТребуемыхПараметров = _ИменаПараметров.Количество(); Если КоличествоТребуемыхПараметров = 0 Тогда @@ -90,7 +118,7 @@ Для ИндексПараметра = 0 По Параметры.ВГраница() Цикл Параметр = Новый ПараметрБенчмарка(_ИменаПараметров[ИндексПараметра], Параметры[ИндексПараметра], Истина); - МассивПараметров.Добавить(Параметр); + ПараметрыМетода.Добавить(Параметр); КонецЦикла; Иначе @@ -104,11 +132,11 @@ КонецЕсли; Параметр = Новый ПараметрБенчмарка(_ИменаПараметров[0], Параметры, Истина); - МассивПараметров.Добавить(Параметр); + ПараметрыМетода.Добавить(Параметр); КонецЕсли; - _НаборыПараметров.Добавить(МассивПараметров); + _НаборыПараметров.Добавить(ПараметрыМетода); Возврат ЭтотОбъект; @@ -239,6 +267,17 @@ Возврат Делегаты.Создать(Объект, _Метод, Параметры); КонецФункции +#Область Сериализация + +Процедура ПослеДесериализации() Экспорт + + Валидировать(); + ИзвлечьИменаПараметров(Новый(_Тип)); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -254,4 +293,15 @@ КонецПроцедуры +Процедура Валидировать() + + Валидатор = Новый Валидатор; + + Результат = Валидатор.Валидировать(ЭтотОбъект); + Если Результат.Количество() > 0 Тогда + ВызватьИсключение Валидатор.ОписаниеОшибокВалидации(Результат); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index c770a46..9ee96a6 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -193,8 +193,8 @@ // --worker СтрокаКоманды.Добавить("--worker"); - // --config - СтрокаКоманды.Добавить("--config"); + // --settings + СтрокаКоманды.Добавить("--settings"); СтрокаКоманды.Добавить(ОбернутьВКавычки(ИмяФайлаКонфигурации)); // FILE @@ -242,8 +242,8 @@ ПутьКФайлу = _МенеджерВременныхФайлов.СоздатьФайл("json"); - Сериализатор = Новый СериализаторКонфигурацииБенчмарков(); - Сериализатор.СериализоватьВJSON(Конфигурация, ПутьКФайлу); + Сериализатор = Новый СериализаторНастроекБенчмарков(); + Сериализатор.ЗаписатьВJson(_ДескрипторыБенчмарков, Конфигурация, ПутьКФайлу); Возврат ПутьКФайлу; @@ -283,7 +283,7 @@ Файлы = НайтиФайлы(Каталог, "*-report.json"); Для Каждого Файл Из Файлы Цикл - Данные = Сериализатор.ДесериализоватьИзJSON(Файл.ПолноеИмя, _Конфигурация); + Данные = Сериализатор.ПрочитатьИзJson(Файл.ПолноеИмя, _Конфигурация); Для Каждого СтрокаРезультата Из Данные.Расшифровка Цикл НоваяСтрокаТаблицы = РасшифровкаРезультатов.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрокаТаблицы, СтрокаРезультата); @@ -692,10 +692,10 @@ КонецЕсли; Если КоличествоПараметровМетода = 1 Тогда - Параметр = Новый ПараметрБенчмарка(ИменаПараметров[0], Параметры, Истина); - Результат = Новый Массив(); - Результат.Добавить(Параметр); - Возврат Результат; + ПараметрБенчмарка = Новый ПараметрБенчмарка(ИменаПараметров[0], Параметры, Истина); + ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); + ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка); + Возврат ПараметрыМетодаБенчмарка; КонецЕсли; ТипКоллекции = ТипЗнч(Параметры); @@ -718,7 +718,7 @@ Функция ПреобразоватьМассивВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) - Результат = Новый Массив(); + ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); ИменаПараметров = ДескрипторБенчмарка.ИменаПараметров(); КоличествоТребуемыхПараметров = ИменаПараметров.Количество(); @@ -732,17 +732,17 @@ КонецЕсли; Для ИндексПараметра = 0 По Параметры.ВГраница() Цикл - Параметр = Новый ПараметрБенчмарка(ИменаПараметров[ИндексПараметра], Параметры[ИндексПараметра], Истина); - Результат.Добавить(Параметр); + ПараметрБенчмарка = Новый ПараметрБенчмарка(ИменаПараметров[ИндексПараметра], Параметры[ИндексПараметра], Истина); + ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка); КонецЦикла; - Возврат Результат; + Возврат ПараметрыМетодаБенчмарка; КонецФункции Функция ПреобразоватьСтруктуруВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) - Результат = Новый Массив(); + ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); ТипКоллекции = ТипЗнч(Параметры); Для Каждого ИмяПараметра Из ДескрипторБенчмарка.ИменаПараметров() Цикл @@ -762,18 +762,18 @@ ); КонецЕсли; - Параметр = Новый ПараметрБенчмарка(ИмяПараметра, Параметры[ИмяПараметра], Истина); - Результат.Добавить(Параметр); + ПараметрБенчмарка = Новый ПараметрБенчмарка(ИмяПараметра, Параметры[ИмяПараметра], Истина); + ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка); КонецЦикла; - Возврат Результат; + Возврат ПараметрыМетодаБенчмарка; КонецФункции Функция ПреобразоватьСтрокуТаблицыЗначенийВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) - Результат = Новый Массив(); + ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); Колонки = Параметры.Владелец().Колонки; Для Каждого ИмяПараметра Из ДескрипторБенчмарка.ИменаПараметров() Цикл @@ -786,12 +786,12 @@ ); КонецЕсли; - Параметр = Новый ПараметрБенчмарка(ИмяПараметра, Параметры[ИмяПараметра], Истина); - Результат.Добавить(Параметр); + ПараметрБенчмарка = Новый ПараметрБенчмарка(ИмяПараметра, Параметры[ИмяПараметра], Истина); + ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка); КонецЦикла; - Возврат Результат; + Возврат ПараметрыМетодаБенчмарка; КонецФункции diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\230\320\267\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\230\320\267\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260.os" index 4eb6454..b0780c8 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\230\320\267\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\230\320\267\320\232\320\260\321\202\320\260\320\273\320\276\320\263\320\260.os" @@ -65,7 +65,7 @@ СтрокаРезультата.Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); Исключение СтрокаРезультата.Успешно = Ложь; - _Лог.Ошибка("Возникла ошибка при запуске бенчмарков класса <%1>: %2", + _Лог.Ошибка("Возникла ошибка при запуске бенчмарков <%1>: %2", СтрокаРезультата.ИмяКласса, ОписаниеОшибки()); КонецПопытки; diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 442efb4..352ea9a 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,17 +1,22 @@ #Использовать fluent +&Сериализуемое("Элементы") +&Тип("Массив") +&ДляКаждого +&Тип("ДескрипторБенчмарка") Перем _ДескрипторыБенчмарков; // Массив из ДескрипторБенчмарка // Коллекция дескрипторов бенчмарков // // Параметры: -// ИсточникБенчмарков - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// ИсточникБенчмарков - Произвольный - Тип или экземпляр класса бенчмарков, +// откуда будут прочитаны дескрипторы Процедура ПриСозданииОбъекта(ИсточникБенчмарков = Неопределено) Экспорт _ДескрипторыБенчмарков = Новый Массив(); Если Не ИсточникБенчмарков = Неопределено Тогда - ИзвлекательДескрипторовБенчмарков.Извлечь(ИсточникБенчмарков, ЭтотОбъект); + Прочитать(ИсточникБенчмарков); КонецЕсли; КонецПроцедуры @@ -47,6 +52,11 @@ Возврат _ДескрипторыБенчмарков.Количество(); КонецФункции +// Очищает коллекцию +Процедура Очистить() Экспорт + _ДескрипторыБенчмарков.Очистить(); +КонецПроцедуры + // Дескриптор бенчмарка по имени метода // // Параметры: @@ -118,6 +128,15 @@ КонецФункции +// Читает дескрипторы бенчмарков из класса +// +// Параметры: +// ИсточникБенчмарков - Произвольный - Тип или экземпляр класса бенчмарков +Процедура Прочитать(ИсточникБенчмарков) Экспорт + Очистить(); + ИзвлекательДескрипторовБенчмарков.Извлечь(ИсточникБенчмарков, ЭтотОбъект); +КонецПроцедуры + // Массив дескрипторов бенчмарков // // Возвращаемое значение: diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 8e56200..3456d68 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,6 +1,7 @@ #Использовать asserts #Использовать delegate #Использовать validate +#Использовать reflector &Сериализуемое("Стратегия") &Тип("Строка") @@ -48,7 +49,9 @@ Перем _КаталогАртефактов; // Строка &Сериализуемое("Параметры") -&Тип("Массив") +&Тип("Массив") +&ДляКаждого +&Тип("ПараметрБенчмарка") &Геттер("Параметры") Перем _Параметры; // Массив из ПараметрБенчмарка @@ -97,7 +100,7 @@ // Конфигурация бенчмарков // // Параметры: -// ИсточникБенчмарков - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// ИсточникБенчмарков - Произвольный - Тип или экземпляр класса бенчмарков Процедура ПриСозданииОбъекта(ИсточникБенчмарков = Неопределено) СтратегияПоУмолчанию = СтратегииЗапускаБенчмарка.ПропускнаяСпособность; @@ -965,7 +968,7 @@ Для Каждого ОписаниеПоля Из ОписанияПолей() Цикл СтрокаТаблицы = Таблица.Добавить(); СтрокаТаблицы.Имя = ОписаниеПоля.Имя; - СтрокаТаблицы.Значение = _Рефлектор.ПолучитьСвойство(ЭтотОбъект, ОписаниеПоля.ИмяВнутреннее); + СтрокаТаблицы.Значение = ОписаниеПоля.Геттер.Исполнить(); СтрокаТаблицы.Модифицирован = _МодифицированныеПоля[ОписаниеПоля.Имя]; КонецЦикла; @@ -1020,7 +1023,7 @@ #Область Сериализация -Процедура ОбработатьПередСериализацией() Экспорт +Процедура ПередСериализацией() Экспорт ПроверитьОбработчикиСобытийПередСериализацией(); ПроверитьИсточникиПараметровПередСериализацией(); @@ -1028,12 +1031,11 @@ КонецПроцедуры -Процедура ОбработатьПослеДесериализации() Экспорт +Процедура ПослеДесериализации() Экспорт - ОбработатьПараметрыПослеДесериализации(); ОбработатьЭкспортерыПослеДесериализации(); ОпределитьМодифицированныеПоля(); - ВыполнитьВалидациюПослеДесериализации(); + Валидировать(); КонецПроцедуры @@ -1112,7 +1114,7 @@ ОписаниеПоля = _ОписанияПолей.Добавить(); ОписаниеПоля.Имя = ИмяПоля; ОписаниеПоля.ИмяВнутреннее = Свойство.Имя; - ОписаниеПоля.Геттер = Геттер; + ОписаниеПоля.Геттер = Новый Делегат(ЭтотОбъект, Геттер); КонецЦикла; Возврат _ОписанияПолей; @@ -1183,18 +1185,7 @@ КонецПроцедуры -Процедура ОбработатьПараметрыПослеДесериализации() - - Параметры = Новый ФиксированныйМассив(_Параметры); - - ОчиститьПараметры(); - Для Каждого ПараметрДанные Из Параметры Цикл - ДобавитьПараметр(ПараметрДанные.Имя, ПараметрДанные.Значение); - КонецЦикла; - -КонецПроцедуры - -Процедура ВыполнитьВалидациюПослеДесериализации() +Процедура Валидировать() Валидатор = Новый Валидатор; @@ -1359,7 +1350,7 @@ КонецФункции Функция ИмяПоля_ОбработчикиСобытий() - Возврат "ОбработчикиСобытий"; + Возврат "Обработчики"; КонецФункции Функция ИмяПоля_Колонки() diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 28c7fc0..337727a 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -4,7 +4,7 @@ Перем Значение Экспорт; // Произвольный Перем ЭтоПараметрМетода Экспорт; // Булево -Процедура ПриСозданииОбъекта(пИмя, пЗначение, пЭтоПараметрМетода = Ложь) +Процедура ПриСозданииОбъекта(пИмя = "", пЗначение = Неопределено, пЭтоПараметрМетода = Ложь) Имя = пИмя; Значение = пЗначение; diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\321\202\320\276\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\321\202\320\276\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" new file mode 100644 index 0000000..694339d --- /dev/null +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\321\202\320\276\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -0,0 +1,51 @@ +#Использовать asserts + +&Сериализуемое +&Тип("Массив") +&ДляКаждого +&Тип("ПараметрБенчмарка") +Перем _Параметры; // Массив из ПараметрБенчмарка + +Процедура ПриСозданииОбъекта() + _Параметры = Новый Массив(); +КонецПроцедуры + +// Добавляет параметр бенчмарка в коллекцию +// +// Параметры: +// Параметр - ПараметрБенчмарка +Процедура Добавить(Параметр) Экспорт + + Ожидаем.Что(Параметр).ИмеетТип("ПараметрБенчмарка"); + Ожидаем.Что(Параметр.ЭтоПараметрМетода).ЭтоИстина(); + + _Параметры.Добавить(Параметр); + +КонецПроцедуры + +// Возвращает количество параметров +// +// Возвращаемое значение: +// Число +Функция Количество() Экспорт + Возврат _Параметры.Количество(); +КонецФункции + +// Возвращает параметр метода по индексу +// +// Параметры: +// Индекс - Число +// +// Возвращаемое значение: +// ПараметрБенчмарка +Функция Получить(Индекс) Экспорт + Возврат _Параметры[Индекс]; +КонецФункции + +// Возвращает массив параметров +// +// Возвращаемое значение: +// Массив из ПараметрБенчмарка +Функция ВМассив() Экспорт + Возврат Новый Массив(Новый ФиксированныйМассив(_Параметры)); +КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" deleted file mode 100644 index ed3ab68..0000000 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ /dev/null @@ -1,232 +0,0 @@ -#Использовать logos -#Использовать asserts - -Перем _Лог; // Лог - -// Сериализатор конфигурации бенчмарков -Процедура ПриСозданииОбъекта() - _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.СериализаторКонфигурацииБенчмарков"); -КонецПроцедуры - -#Область ПрограммныйИнтерфейс - -// Сериализует конфигурацию бенчмарков в JSON-файл -// -// Параметры: -// Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков -// ИмяФайла - Строка - Имя файла, в который будет записана конфигурация. -Процедура СериализоватьВJSON(Конфигурация, ИмяФайла) Экспорт - - _Лог.Отладка("Начало формирования файла: %1", ИмяФайла); - - ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб); - - ЗаписьJSON = Новый ЗаписьJSON(); - ЗаписьJSON.ОткрытьФайл(ИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); - ЗаписатьJSON(ЗаписьJSON, Конвертировать(Конфигурация)); - ЗаписьJSON.Закрыть(); - - _Лог.Отладка("Завершение формирования файла: %1", ИмяФайла); - -КонецПроцедуры - -// Десериализует конфигурацию бенчмарков из JSON-файла -// -// Параметры: -// ИмяФайла - Строка - Имя файла, из которого будет прочитана конфигурация. -// -// Возвращаемое значение: -// КонфигурацияБенчмарков -Функция ДесериализоватьИзJSON(ИмяФайла) Экспорт - - _Лог.Отладка("Начало чтения файла: %1", ИмяФайла); - - ЧтениеJSON = Новый ЧтениеJSON(); - ЧтениеJSON.ОткрытьФайл(ИмяФайла, "UTF-8"); - Данные = ПрочитатьJSON(ЧтениеJSON, Ложь); - ЧтениеJSON.Закрыть(); - - _Лог.Отладка("Завершение чтения файла: %1", ИмяФайла); - - Возврат СобратьКонфигурацию(Данные); - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция Конвертировать(Конфигурация) - - Данные = Новый Структура(); - - Для Каждого СтрокаТаблицы Из Конфигурация.ВТаблицу() Цикл - - Если СериализацияОбъектовБенчмаркинга.ЗначениеСериализуется(СтрокаТаблицы.Значение) - Или СтрокаТаблицы.Имя = "Колонки" Тогда - Значение = СтрокаТаблицы.Значение; - ИначеЕсли СтрокаТаблицы.Имя = "Параметры" Тогда - Значение = КонвертироватьПараметры(СтрокаТаблицы.Значение); - ИначеЕсли СтрокаТаблицы.Имя = "ОбработчикиСобытий" Тогда - Значение = КонвертироватьОбработчикиСобытий(СтрокаТаблицы.Значение); - ИначеЕсли СтрокаТаблицы.Имя = "Экспортеры" Тогда - Значение = КонвертироватьЭкспортеры(СтрокаТаблицы.Значение); - ИначеЕсли СтрокаТаблицы.Имя = "ВерсииИсполняющейСреды" Тогда - Значение = КонвертироватьВерсииИсполняющейСреды(СтрокаТаблицы.Значение); - ИначеЕсли СтрокаТаблицы.Имя = "ИсточникиПараметров" Тогда - Значение = КонвертироватьИсточникиПараметров(СтрокаТаблицы.Значение); - Иначе - ВызватьИсключение СтрШаблон("Не реализована конвертация параметра '%1'", СтрокаТаблицы.Имя); - КонецЕсли; - - Данные.Вставить(СтрокаТаблицы.Имя, Значение); - - КонецЦикла; - - Возврат Данные; - -КонецФункции - -Функция КонвертироватьПараметры(Параметры) - - Результат = Новый Массив(); - - Для Каждого ПараметрБенчмарка Из Параметры Цикл - - Значение = Новый Структура(); - Значение.Вставить("Имя", ПараметрБенчмарка.Имя); - Значение.Вставить("Значение", ПараметрБенчмарка.Значение); - Значение.Вставить("ЭтоПараметрМетода", ПараметрБенчмарка.ЭтоПараметрМетода); - - Результат.Добавить(Значение); - - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция КонвертироватьОбработчикиСобытий(ОбработчикиСобытий) - - Результат = Новый Массив(); - - Для Каждого Строка Из ОбработчикиСобытий Цикл - - Тип = ТипЗнч(Строка.Обработчик); - Если Тип <> Тип("Строка") Тогда - ВызватьИсключение СтрШаблон("Обработчик события типа <%1> не поддерживает сериализацию.", Тип); - КонецЕсли; - - Значение = Новый Структура(); - Значение.Вставить("Событие", Строка.Событие); - Значение.Вставить("Обработчик", Строка.Обработчик); - - Результат.Добавить(Значение); - - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция КонвертироватьЭкспортеры(Экспортеры) - - Результат = Новый Массив(); - - Для Каждого Экспортер Из Экспортеры Цикл - Результат.Добавить(Строка(ТипЗнч(Экспортер))); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция КонвертироватьВерсииИсполняющейСреды(Версии) - - Результат = Новый Массив(); - - Для Каждого СтрокаВерсия Из Версии Цикл - Версия = Новый Структура(); - Версия.Вставить("Версия", СтрокаВерсия.Версия); - Версия.Вставить("Наименование", СтрокаВерсия.Наименование); - Версия.Вставить("ЭтоЭталон", СтрокаВерсия.ЭтоЭталон); - - Результат.Добавить(Версия); - КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция СобратьКонфигурацию(Данные) - - Конфигурация = Новый КонфигурацияБенчмарков(); - Конфигурация.УстановитьКоличествоИтераций(Данные.КоличествоИтераций); - Конфигурация.УстановитьКоличествоВызововЗаИтерацию(Данные.КоличествоВызововЗаИтерацию); - Конфигурация.УстановитьКоличествоПрогревочныхИтераций(Данные.КоличествоПрогревочныхИтераций); - Конфигурация.УстановитьМинимальноеВремяИтерации(Данные.МинимальноеВремяИтерации); - Конфигурация.УстановитьМинимальноеКоличествоВызововЗаИтерацию(Данные.МинимальноеКоличествоВызововЗаИтерацию); - Конфигурация.УстановитьСтратегию(Данные.Стратегия); - Конфигурация.УстановитьСортировкуОтчета(Данные.СортировкаОтчета); - Конфигурация.УстановитьКаталогАртефактов(Данные.КаталогАртефактов); - - Если Данные.ТребуетсяМониторингПамяти Тогда - Конфигурация.ДобавитьМониторингПамяти(); - КонецЕсли; - - Для Каждого Параметр Из Данные.Параметры Цикл - Конфигурация.ДобавитьПараметр(Параметр.Имя, Параметр.Значение); - КонецЦикла; - - Для Каждого ДанныеСобытия Из Данные.ОбработчикиСобытий Цикл - Конфигурация.ДобавитьОбработчикСобытия(ДанныеСобытия.Событие, ДанныеСобытия.Обработчик); - КонецЦикла; - - Для Каждого Колонка Из Данные.Колонки Цикл - Конфигурация.ДобавитьКолонку(Колонка); - КонецЦикла; - - Для Каждого Экспортер Из Данные.Экспортеры Цикл - Конфигурация.ДобавитьЭкспортер(Новый(Тип(Экспортер))); - КонецЦикла; - - Для Каждого ВерсияИсполняющейСреды Из Данные.ВерсииИсполняющейСреды Цикл - Конфигурация.ДобавитьВерсиюИсполняющейСреды( - ВерсияИсполняющейСреды.Версия, - ВерсияИсполняющейСреды.Наименование, - ВерсияИсполняющейСреды.ЭтоЭталон - ); - КонецЦикла; - - Для Каждого ИсточникПараметров Из Данные.ИсточникиПараметров Цикл - Конфигурация.ДобавитьИсточникПараметров(ИсточникПараметров.ИмяПоля, ИсточникПараметров.Источник); - КонецЦикла; - - Возврат Конфигурация; - -КонецФункции - -Функция КонвертироватьИсточникиПараметров(ИсточникиПараметров) - - Результат = Новый Массив(); - - Для Каждого ИсточникПараметров Из ИсточникиПараметров Цикл - - Тип = ТипЗнч(ИсточникПараметров.Источник); - Если Тип <> Тип("Строка") Тогда - ВызватьИсключение СтрШаблон("Источник параметров типа <%1> не поддерживает сериализацию.", Тип); - КонецЕсли; - - Значение = Новый Структура(); - Значение.Вставить("ИмяПоля", ИсточникПараметров.ИмяПоля); - Значение.Вставить("Источник", ИсточникПараметров.Источник); - - Результат.Добавить(Значение); - - КонецЦикла; - - Возврат Результат; - -КонецФункции - -#КонецОбласти \ No newline at end of file diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" similarity index 57% rename from "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" rename to "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 7eddd89..27145e1 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,47 +1,50 @@ #Использовать logos -#Использовать jason +#Использовать "../../dto" +#Использовать "../../jason" Перем _Лог; // Лог -// Сериализатор конфигурации бенчмарков +// Сериализатор настроек бенчмарков Процедура ПриСозданииОбъекта() - _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.СериализаторБенчмарков"); + _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.СериализаторНастроекБенчмарков"); КонецПроцедуры #Область ПрограммныйИнтерфейс -// Сериализует конфигурацию бенчмарков в JSON-файл +// Сериализует настройки бенчмарков в JSON-файл // // Параметры: -// Дескрипторы - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов бенчмарков +// Дескрипторы - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов бенчмарков // Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков -// ИмяФайла - Строка - Имя файла, в который будет записана конфигурация -Процедура ЗаписатьВJson(Конфигурация, ИмяФайла) Экспорт +// ИмяФайла - Строка - Имя файла, в который будет записана конфигурация +Процедура ЗаписатьВJson(Дескрипторы, Конфигурация, ИмяФайла) Экспорт _Лог.Отладка("Начало формирования файла: %1", ИмяФайла); ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб); - Сериализатор = Новый СериализаторJson(); + Сериализатор = Новый СериализаторJsonBench(); - Конфигурация.ОбработатьПередСериализацией(); + Настройки = Новый НастройкиБенчмарковДто(); + Настройки.ДескрипторыБенчмарков = Дескрипторы; + Настройки.Конфигурация = Конфигурация; ЗаписьJSON = Новый ЗаписьJSON(); ЗаписьJSON.ОткрытьФайл(ИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); - ЗаписьJSON.ЗаписатьБезОбработки(Сериализатор.Сериализовать(Конфигурация)); + ЗаписьJSON.ЗаписатьБезОбработки(Сериализатор.Сериализовать(Настройки)); ЗаписьJSON.Закрыть(); _Лог.Отладка("Завершение формирования файла: %1", ИмяФайла); КонецПроцедуры -// Десериализует конфигурацию бенчмарков из JSON-файла +// Десериализует настройки бенчмарков из JSON-файла // // Параметры: // ИмяФайла - Строка - Имя файла, из которого будет прочитана конфигурация. // // Возвращаемое значение: -// КонфигурацияБенчмарков +// БенчмаркиСКонфигурацией Функция ПрочитатьИзJson(ИмяФайла) Экспорт _Лог.Отладка("Начало чтения файла: %1", ИмяФайла); @@ -50,13 +53,12 @@ Строка = ЧтениеТекста.Прочитать(); ЧтениеТекста.Закрыть(); - Десериализатор = Новый ДесериализаторJson(); - Конфигурация = Десериализатор.Десериализовать(Строка, Тип("КонфигурацияБенчмарков")); - Конфигурация.ОбработатьПослеДесериализации(); + Десериализатор = Новый ДесериализаторJsonBench(); + Настройки = Десериализатор.Десериализовать(Строка, Тип("НастройкиБенчмарковДто")); _Лог.Отладка("Завершение чтения файла: %1", ИмяФайла); - Возврат Конфигурация; + Возврат Настройки; КонецФункции diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index c326657..d1ce474 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -21,7 +21,7 @@ // * Расшифровка - ТаблицаЗначений - см. МенеджерРасшифровкиРезультатовБенчмарков.НоваяТаблицаРасшифровки // * СредаОкружения - СредаОкруженияБенчмарков - Информация о среде выполнения бенчмарков // ПолноеИмяФайла - Строка - Полный путь к файлу, в который будут записаны результаты бенчмарков -Процедура СериализоватьВJSON(РезультатыБенчмарков, ПолноеИмяФайла) Экспорт +Процедура ЗаписатьВJson(РезультатыБенчмарков, ПолноеИмяФайла) Экспорт _Лог.Отладка("Начало сериализации результатов в JSON-файл: %1", ПолноеИмяФайла); @@ -48,7 +48,7 @@ // Структура: // * Расшифровка - см. МенеджерРасшифровкиРезультатовБенчмарков.НоваяТаблицаРасшифровки // * СредаОкружения - СредаОкруженияБенчмарков -Функция ДесериализоватьИзJSON(ПолноеИмяФайла, Конфигурация) Экспорт +Функция ПрочитатьИзJson(ПолноеИмяФайла, Конфигурация) Экспорт _Лог.Отладка("Начало десериализации из JSON-файла: %1", ПолноеИмяФайла); @@ -395,8 +395,9 @@ НайденНабор = Ложь; Для Каждого НаборПараметров Из ДескрипторБенчмарка.НаборыПараметров() Цикл НайденНабор = Истина; - Для Инд = 0 По НаборПараметров.ВГраница() Цикл - Если Не НаборПараметров[Инд].Значение = ПараметрыМетода[Инд] Тогда + МассивПараметров = НаборПараметров.ВМассив(); + Для Инд = 0 По МассивПараметров.ВГраница() Цикл + Если Не МассивПараметров[Инд].Значение = ПараметрыМетода[Инд] Тогда НайденНабор = Ложь; Прервать; КонецЕсли; diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\255\320\272\321\201\320\277\320\276\321\200\321\202\320\265\321\200\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222Json.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\255\320\272\321\201\320\277\320\276\321\200\321\202\320\265\321\200\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222Json.os" index 6651e56..bf01eed 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\255\320\272\321\201\320\277\320\276\321\200\321\202\320\265\321\200\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222Json.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\255\320\272\321\201\320\277\320\276\321\200\321\202\320\265\321\200\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222Json.os" @@ -8,7 +8,7 @@ ПутьКФайлу = ОбъединитьПути(КаталогАртефактов, РезультатыБенчмарков.ИмяКласса + "-report." + Расширение()); Сериализатор = Новый СериализаторРезультатовБенчмарков(); - Сериализатор.СериализоватьВJSON(РезультатыБенчмарков, ПутьКФайлу); + Сериализатор.ЗаписатьВJson(РезультатыБенчмарков, ПутьКФайлу); КонецПроцедуры diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index a96b3d2..f918c9b 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,12 +1,13 @@ #Использовать annotations #Использовать asserts +#Использовать reflector #Область ПрограммныйИнтерфейс // Извлекает дескрипторы бенчмарков // // Параметры: -// ИсточникБенчмарков - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// ИсточникБенчмарков - Произвольный - Тип или экземпляр класса бенчмарков // НаборДескрипторов - КоллекцияДескрипторовБенчмарков - Коллекция, в которую будут добавлены извлеченные // дескрипторы бенчмарков // diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 0d0f52e..e36a683 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,11 +1,12 @@ #Использовать annotations +#Использовать reflector #Область ПрограммныйИнтерфейс // Извлекает конфигурацию бенчмарков // // Параметры: -// ИсточникБенчмарков - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// ИсточникБенчмарков - Произвольный - Тип или экземпляр класса бенчмарков // Конфигурация - КонфигурацияБенчмарков - Конфигурация, в которую будут записаны данные // // Возвращаемое значение: diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\261\320\270\320\275\320\260\321\202\320\276\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\261\320\270\320\275\320\260\321\202\320\276\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index ba6d361..f2ee90f 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\261\320\270\320\275\320\260\321\202\320\276\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\261\320\270\320\275\320\260\321\202\320\276\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -4,6 +4,8 @@ // // Параметры: // Параметры - Массив из ПараметрБенчмарка +// - Массив из Массив из ПараметрБенчмарка +// - Массив из ПараметрыМетодаБенчмарка // // Возвращаемое значение: // Массив из Массив из ПараметрБенчмарка @@ -27,19 +29,23 @@ Для Каждого Параметр Из Параметры Цикл - Если ТипЗнч(Параметр) = Тип("Массив") Тогда + ТипЭлемента = ТипЗнч(Параметр); + Если ТипЭлемента = Тип("ПараметрБенчмарка") Тогда + + Имя = Параметр.Имя; + ЭтоПараметрМетода = Параметр.ЭтоПараметрМетода; + + ИначеЕсли ТипЭлемента = Тип("Массив") Или ТипЭлемента = Тип("ПараметрыМетодаБенчмарка") Тогда + Если Параметр.Количество() = 0 Тогда Продолжить; КонецЕсли; Имя = "_"; - ЭтоПараметрМетода = Параметр[0].ЭтоПараметрМетода; + ЭтоПараметрМетода = ТипЭлемента = Тип("ПараметрыМетодаБенчмарка"); Иначе - - Имя = Параметр.Имя; - ЭтоПараметрМетода = Параметр.ЭтоПараметрМетода; - + ВызватьИсключение СтрШаблон("Не поддерживается тип <%1>", ТипЭлемента); КонецЕсли; Строки = Дерево[ЭтоПараметрМетода]; @@ -68,13 +74,13 @@ КомбинацииПараметров = Новый Массив(); ЭтоПерваяГруппа = Истина; - Для Каждого Параметры Из ГруппыПараметров Цикл + Для Каждого ПараметрыГруппы Из ГруппыПараметров Цикл КоличествоКомбинаций = КомбинацииПараметров.Количество(); ЭтоПервыйПараметр = Истина; - Для Каждого Параметр Из Параметры Цикл + Для Каждого Параметр Из ПараметрыГруппы Цикл Если ЭтоПерваяГруппа Тогда @@ -126,6 +132,10 @@ ДобавитьПараметрыВКомбинацию(Комбинация, Параметр); + ИначеЕсли ТипЗнч(Параметр) = Тип("ПараметрыМетодаБенчмарка") Тогда + + ДобавитьПараметрыВКомбинацию(Комбинация, Параметр.ВМассив()); + Иначе Для Инд = 0 По Комбинация.ВГраница() Цикл diff --git "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" "b/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" new file mode 100644 index 0000000..629811e --- /dev/null +++ "b/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" @@ -0,0 +1,9 @@ +// BSLLS:ExportVariables-off + +&Сериализуемое +&Тип("КоллекцияДескрипторовБенчмарков") +Перем ДескрипторыБенчмарков Экспорт; // КоллекцияДескрипторовБенчмарков + +&Сериализуемое +&Тип("КонфигурацияБенчмарков") +Перем Конфигурация Экспорт; // КонфигурацияБенчмарков \ No newline at end of file diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\235\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\320\276\320\265.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\235\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\320\276\320\265.os" new file mode 100644 index 0000000..c132417 --- /dev/null +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\235\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\320\276\320\265.os" @@ -0,0 +1,9 @@ +// Copyright © 2025 Nikita Fedkin (nixel2007@gmail.com). +// Адаптированная версия библиотеки jason (https://github.com/nixel2007/jason) +// +// Поле, помеченное аннотацией &Несериализуемое, не будет включено в результирующую +// JSON-строку. +// +&Аннотация("Несериализуемое") +Процедура ПриСозданииОбъекта() +КонецПроцедуры \ No newline at end of file diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\320\276\320\265.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\320\276\320\265.os" new file mode 100644 index 0000000..8759389 --- /dev/null +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\320\276\320\265.os" @@ -0,0 +1,18 @@ +// Copyright © 2025 Nikita Fedkin (nixel2007@gmail.com). +// Адаптированная версия библиотеки jason (https://github.com/nixel2007/jason) +// +// Поле, помеченное аннотацией &Сериализуемое, будет включено в результирующую +// JSON-строку. +// +// По умолчанию все заполненные поля объекта, не помеченные аннотацией &Несериализуемое, +// сериализуются. +// Вы можете переопределить дополнительные параметры сериализации с помощью аннотации +// &Сериализуемое. +// +// Параметры: +// Значение - Строка- имя свойства в JSON (переименование) +// Обязательное - Булево - включать поле даже при значении Неопределено +// +&Аннотация("Сериализуемое") +Процедура ПриСозданииОбъекта(Значение = "", Обязательное = Ложь) +КонецПроцедуры diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" new file mode 100644 index 0000000..f38c3fe --- /dev/null +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" @@ -0,0 +1,280 @@ +// Copyright © 2025 Nikita Fedkin (nixel2007@gmail.com). +// Адаптированная версия библиотеки jason (https://github.com/nixel2007/jason) + +#Использовать annotations +#Использовать validate + +#Область ОписаниеПеременных + +// Лог +// +Перем Лог; + +// Рефлектор +// +Перем Рефлектор; + +// Множество - список известных пользовательских типов +// +Перем КэшИзвестныхТипов; + +// Множество - список примитивных типов +// +Перем ПримитивныеТипы; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Десериализация JSON-строки в объект. +// +// Параметры: +// Строка - Строка - JSON-строка, которую необходимо десериализовать. +// Поддерживаются объекты, массивы и примитивы. +// ТипОбъекта - Тип - Тип, в который нужно десериализовать JSON-строку (необязателен). +// ЧитатьВСоответствие - Булево - если Истина, чтение нетипизированного объекта JSON будет выполнено в `Соответствие`. +// Если Ложь, нетипизированные объекты будут считываться в объект типа `Структура`. +// Значение по умолчанию: Ложь +// Возвращаемое значение: +// Произвольный - Если тип не задан, возвращается значение, прочитанное платформенным методом ПрочитатьJSON; +// иначе преобразованный объект целевого типа. +// +Функция Десериализовать(Строка, ТипОбъекта = Неопределено, ЧитатьВСоответствие = Ложь) Экспорт + + ЧтениеJSON = Новый ЧтениеJSON(); + ЧтениеJSON.УстановитьСтроку(Строка); + + ДесериализованныйОбъект = ПрочитатьJSON(ЧтениеJSON, ЧитатьВСоответствие); + ЧтениеJSON.Закрыть(); + + // Если тип не задан - возвращаем прочитанный объект как есть + Если ТипОбъекта = Неопределено Тогда + Возврат ДесериализованныйОбъект; + КонецЕсли; + + Объект = ПреобразоватьОбъектДесериализации(ДесериализованныйОбъект, ТипОбъекта); + + Возврат Объект; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПреобразоватьОбъектДесериализации(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов = Неопределено) + + Если ЭтоПримитивныйТип(ТипОбъекта) Тогда + Возврат ПреобразоватьПримитивныйТип(ДесериализованныйОбъект, ТипОбъекта); + ИначеЕсли ТипОбъекта = Тип("Массив") Тогда + Возврат ПреобразоватьМассив(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов); + ИначеЕсли ТипОбъекта = Тип("Соответствие") Тогда + Возврат ПреобразоватьОбъект(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов); + ИначеЕсли ТипОбъекта = Тип("Структура") Тогда + Возврат ПреобразоватьОбъект(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов); + ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда + Возврат ПреобразоватьТаблицуЗначений(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов); + ИначеЕсли ТипОбъекта = Тип("Тип") Тогда + Возврат ПреобразоватьТип(ДесериализованныйОбъект); + ИначеЕсли ЭтоПользовательскийТип(ТипОбъекта) Тогда + Возврат ПреобразоватьПользовательскийТип(ДесериализованныйОбъект, ТипОбъекта); + Иначе + Лог.Предупреждение("Неизвестный тип объекта: %1", ТипОбъекта); + КонецЕсли; + +КонецФункции + +Функция ЭтоПримитивныйТип(ТипОбъекта) + Возврат ПримитивныеТипы.Содержит(ТипОбъекта); +КонецФункции + +Функция ЭтоПользовательскийТип(ТипОбъекта) + Возврат КэшИзвестныхТипов.Содержит(ТипОбъекта); +КонецФункции + +Функция ПреобразоватьПримитивныйТип(Объект, ТипОбъекта) + Возврат Объект; +КонецФункции + +Функция ПреобразоватьТип(Объект) + Возврат Тип(Объект); +КонецФункции + +Функция ПреобразоватьМассив(Объект, ТипОбъекта, ТипЭлементов) + + Результат = Новый Массив; + + Для Каждого Элемент Из Объект Цикл + ОжидаемыйТип = ?(ЗначениеЗаполнено(ТипЭлементов), ТипЭлементов, ТипЗнч(Элемент)); + ПреобразованныйЭлемент = ПреобразоватьОбъектДесериализации(Элемент, ОжидаемыйТип); + Результат.Добавить(ПреобразованныйЭлемент); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПреобразоватьТаблицуЗначений(Объект, ТипОбъекта, ТипЭлементов) + + Результат = Новый ТаблицаЗначений; + КоличествоЭлементов = Объект.Количество(); + + Если КоличествоЭлементов = 0 Тогда + Возврат Результат; + КонецЕсли; + + ИменаКолонок = Объект[0]; + Если Не ТипЗнч(ИменаКолонок) = Тип("Массив") Тогда + Возврат Результат; + КонецЕсли; + + КоличествоКолонок = ИменаКолонок.Количество(); + + Для Каждого ИмяКолонки Из ИменаКолонок Цикл + Результат.Колонки.Добавить(ИмяКолонки); + КонецЦикла; + + Для ИндексЭлемента = 1 По КоличествоЭлементов - 1 Цикл + ЗначенияКолонок = Объект[ИндексЭлемента]; + Если Не ТипЗнч(ЗначенияКолонок) = Тип("Массив") Тогда + Продолжить; + КонецЕсли; + + СтрокаТаблицы = Результат.Добавить(); + Для ИндексКолонки = 0 По Мин(КоличествоКолонок, ЗначенияКолонок.Количество()) - 1 Цикл + ИмяКолонки = ИменаКолонок[ИндексКолонки]; + ЗначениеКолонки = ЗначенияКолонок[ИндексКолонки]; + ПреобразованныйЭлемент = ПреобразоватьОбъектДесериализации(ЗначениеКолонки, ТипЗнч(ЗначениеКолонки)); + СтрокаТаблицы[ИмяКолонки] = ПреобразованныйЭлемент; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПреобразоватьОбъект(Объект, ТипОбъекта, ТипЭлементов) + + Результат = Новый(ТипОбъекта); + + Для Каждого КлючИЗначение Из Объект Цикл + ОжидаемыйТип = ?(ЗначениеЗаполнено(ТипЭлементов), ТипЭлементов, ТипЗнч(КлючИЗначение.Значение)); + ПреобразованноеЗначение = ПреобразоватьОбъектДесериализации(КлючИЗначение.Значение, ОжидаемыйТип); + Результат.Вставить(КлючИЗначение.Ключ, ПреобразованноеЗначение); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПреобразоватьПользовательскийТип(Объект, ТипОбъекта) + + Результат = Новый(ТипОбъекта); + СвойстваОбъекта = Рефлектор.ПолучитьТаблицуСвойств(ТипОбъекта, Истина); + СвойстваПоИменамПолей = Новый Соответствие(); + + Для Каждого Свойство Из СвойстваОбъекта Цикл + АннотацияСериализуемое = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Сериализуемое"); + ИмяСвойства = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Значение", Свойство.Имя); + + СвойстваПоИменамПолей.Вставить(ИмяСвойства, Свойство); + КонецЦикла; + + Для Каждого КлючИЗначение Из Объект Цикл + Свойство = СвойстваПоИменамПолей[КлючИЗначение.Ключ]; + Если Свойство = Неопределено Тогда + // Если поле не найдено, то пропускаем его + // TODO: Падать, если не висит @JsonIgnore + Продолжить; + КонецЕсли; + + ИмяСвойства = Свойство.Имя; + ЗначениеСвойства = КлючИЗначение.Значение; + + ТипыСвойства = ПолучитьТипыСвойства(Свойство, ЗначениеСвойства); + ТипСвойства = ТипыСвойства.БазовыйТип; + ТипЭлементов = ТипыСвойства.ТипЭлементов; + + ЗначениеСвойства = ПреобразоватьОбъектДесериализации(ЗначениеСвойства, ТипСвойства, ТипЭлементов); + Если ТипСвойства <> Неопределено И ТипСвойства <> ТипЗнч(ЗначениеСвойства) Тогда + Лог.Ошибка("Тип свойства '%1' не соответствует ожидаемому типу '%2'", ТипЗнч(ЗначениеСвойства), ТипСвойства); + Продолжить; + КонецЕсли; + + Рефлектор.УстановитьСвойство(Результат, ИмяСвойства, ЗначениеСвойства); + КонецЦикла; + + Если Рефлектор.МетодСуществует(Результат, "ПослеДесериализации") Тогда + Результат.ПослеДесериализации(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +Функция ПолучитьТипыСвойства(Свойство, ЗначениеСвойства) + + ОписаниеСвойства = Новый Структура(); + ОписаниеСвойства.Вставить("БазовыйТип", ТипЗнч(ЗначениеСвойства)); + ОписаниеСвойства.Вставить("ТипЭлементов"); + + КонтейнерАннотаций = Новый КонтейнерАннотаций; + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияТип")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияДляКаждого")); + + ТекущийРежимДляКаждого = Неопределено; + + Для Каждого Аннотация Из Свойство.Аннотации Цикл + + ОпределениеАннотации = КонтейнерАннотаций.ПолучитьОпределениеАннотации(Аннотация.Имя); + Если ОпределениеАннотации = Неопределено Тогда + Продолжить; + КонецЕсли; + + ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация); + + // Директива &ДляКаждого - переключает режим обхода + Если ТипЗнч(ОбъектАннотации) = Тип("АннотацияДляКаждого") Тогда + + ТекущийРежимДляКаждого = ОбъектАннотации.Режим(); + + ИначеЕсли ТипЗнч(ОбъектАннотации) = Тип("АннотацияТип") Тогда + + ТипСвойства = ОбъектАннотации.ТипЗначения(); + + Если ТекущийРежимДляКаждого = Неопределено Тогда + ОписаниеСвойства.БазовыйТип = ТипСвойства; + ИначеЕсли ТекущийРежимДляКаждого = "Значение" Тогда + ОписаниеСвойства.ТипЭлементов = ТипСвойства; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Возврат ОписаниеСвойства; + +КонецФункции + +Процедура ПриСозданииОбъекта() + + Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.jason.ДесериализаторJson"); + Рефлектор = Новый Рефлектор(); + + КэшИзвестныхТипов = Новый МножествоСоответствие; + ИзвестныеТипы = Рефлектор.ИзвестныеТипы(Новый Структура("Пользовательский", Истина)); + Для Каждого ИзвестныйТип Из ИзвестныеТипы Цикл + КэшИзвестныхТипов.Добавить(ИзвестныйТип.Значение); + КонецЦикла; + + ПримитивныеТипы = Новый МножествоСоответствие; + ПримитивныеТипы.Добавить(Тип("Строка")); + ПримитивныеТипы.Добавить(Тип("Булево")); + ПримитивныеТипы.Добавить(Тип("Дата")); + ПримитивныеТипы.Добавить(Тип("Число")); + ПримитивныеТипы.Добавить(Тип("Null")); + ПримитивныеТипы.Добавить(Тип("Неопределено")); + +КонецПроцедуры diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" new file mode 100644 index 0000000..9de2d3a --- /dev/null +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" @@ -0,0 +1,197 @@ +// Copyright © 2025 Nikita Fedkin (nixel2007@gmail.com). +// Адаптированная версия библиотеки jason (https://github.com/nixel2007/jason) + +#Использовать annotations +#Использовать logos +#Использовать collectionos + +#Область ОписаниеПеременных + +// Лог +// +Перем Лог; + +// Рефлектор +// +Перем Рефлектор; + +// Множество - список известных пользовательских типов +// +Перем КэшИзвестныхТипов; + +// Множество - список примитивных типов +// +Перем ПримитивныеТипы; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Сериализация объекта в JSON-строку. +// +// Параметры: +// Объект - Произвольный - Сериализуемый объект. Поддерживаются пользовательские классы, +// коллекции и примитивы. +// Возвращаемое значение: +// Строка +// +Функция Сериализовать(Объект) Экспорт + ОбъектСериализации = ПреобразоватьОбъектСериализации(Объект); + + Запись = Новый ЗаписьJSON; + Запись.УстановитьСтроку(); + ЗаписатьJSON(Запись, ОбъектСериализации); + + Возврат Запись.Закрыть(); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПреобразоватьОбъектСериализации(Объект) + + ТипОбъекта = ТипЗнч(Объект); + + Если ТипОбъекта = Тип("Массив") Тогда + Результат = ПреобразоватьМассив(Объект); + ИначеЕсли ТипОбъекта = Тип("Структура") ИЛИ ТипОбъекта = Тип("Соответствие") Тогда + Результат = ПреобразоватьСтруктуру(Объект); + ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда + Результат = ПреобразоватьТаблицуЗначений(Объект); + ИначеЕсли ЭтоПримитивныйТип(ТипОбъекта) Тогда + Результат = ПреобразоватьПримитивныйТип(Объект); + ИначеЕсли ТипОбъекта = Тип("Тип") Тогда + Результат = ПреобразоватьТип(Объект); + Иначе + Результат = ПреобразоватьКомплексныйТип(Объект); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ЭтоПримитивныйТип(ТипОбъекта) + Возврат ПримитивныеТипы.Содержит(ТипОбъекта); +КонецФункции + +Функция ПреобразоватьМассив(Массив) + Результат = Новый Массив; + + Для Каждого Элемент Из Массив Цикл + ПреобразованныйЭлемент = ПреобразоватьОбъектСериализации(Элемент); + Результат.Добавить(ПреобразованныйЭлемент); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция ПреобразоватьСтруктуру(Структура) Экспорт + Результат = Новый Соответствие(); + + Для Каждого Элемент Из Структура Цикл + ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(Элемент.Значение); + Результат.Вставить(Элемент.Ключ, ПреобразованноеЗначение); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений) Экспорт + + Результат = Новый Массив(); + + ИменаКолонок = Новый Массив(); + Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл + ИменаКолонок.Добавить(Колонка.Имя); + КонецЦикла; + Результат.Добавить(ИменаКолонок); + + Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл + ЗначенияКолонок = Новый Массив(); + Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл + ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]); + ЗначенияКолонок.Добавить(ПреобразованноеЗначение); + КонецЦикла; + Результат.Добавить(ЗначенияКолонок); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПреобразоватьПримитивныйТип(Объект) Экспорт + Возврат Объект; +КонецФункции + +Функция ПреобразоватьТип(Объект) Экспорт + Возврат Строка(Объект); +КонецФункции + +Функция ПреобразоватьКомплексныйТип(Объект) Экспорт + + ТипОбъекта = ТипЗнч(Объект); + + ЭтоПользовательскийТип = КэшИзвестныхТипов.Содержит(ТипОбъекта); + + Если НЕ ЭтоПользовательскийТип Тогда + Лог.Предупреждение("Неизвестный тип объекта для преобразования: %1", ТипОбъекта); + Возврат Неопределено; + КонецЕсли; + + Результат = Новый Соответствие(); + + СвойстваОбъекта = Рефлектор.ПолучитьТаблицуСвойств(ТипОбъекта, Истина); + + Если Рефлектор.МетодСуществует(Объект, "ПередСериализацией") Тогда + Объект.ПередСериализацией(); + КонецЕсли; + + Для Каждого СвойствоОбъекта Из СвойстваОбъекта Цикл + // Проверяем, не помечено ли поле как несериализуемое + Несериализуемое = РаботаСАннотациями.НайтиАннотацию(СвойствоОбъекта.Аннотации, "Несериализуемое"); + Если Несериализуемое <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Обязательное = Ложь; + ИмяСвойства = СвойствоОбъекта.Имя; + АннотацияСериализуемое = РаботаСАннотациями.НайтиАннотацию(СвойствоОбъекта.Аннотации, "Сериализуемое"); + Если АннотацияСериализуемое <> Неопределено Тогда + ИмяСвойства = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Значение", СвойствоОбъекта.Имя); + Обязательное = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Обязательное", Обязательное); + КонецЕсли; + + ЗначениеСвойства = Рефлектор.ПолучитьСвойство(Объект, СвойствоОбъекта.Имя); + ЗначениеСвойства = ПреобразоватьОбъектСериализации(ЗначениеСвойства); + Если Обязательное ИЛИ ЗначениеСвойства <> Неопределено Тогда + Результат.Вставить(ИмяСвойства, ЗначениеСвойства); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +Процедура ПриСозданииОбъекта() + + Рефлектор = Новый Рефлектор(); + Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.jason.СериализаторJson"); + + КэшИзвестныхТипов = Новый МножествоСоответствие; + ИзвестныеТипы = Рефлектор.ИзвестныеТипы(Новый Структура("Пользовательский", Истина)); + Для Каждого ИзвестныйТип Из ИзвестныеТипы Цикл + КэшИзвестныхТипов.Добавить(ИзвестныйТип.Значение); + КонецЦикла; + + ПримитивныеТипы = Новый МножествоСоответствие; + ПримитивныеТипы.Добавить(Тип("Строка")); + ПримитивныеТипы.Добавить(Тип("Булево")); + ПримитивныеТипы.Добавить(Тип("Дата")); + ПримитивныеТипы.Добавить(Тип("Число")); + ПримитивныеТипы.Добавить(Тип("Null")); + ПримитивныеТипы.Добавить(Тип("Неопределено")); + +КонецПроцедуры diff --git "a/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\274\320\270\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\274\320\270\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 85614c2..3b32033 100644 --- "a/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\274\320\270\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/tests/fixtures/\320\232\320\273\320\260\321\201\321\201\321\213/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\241\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\274\320\270\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -40,5 +40,8 @@ КонецПроцедуры &Бенчмарк -Процедура Бенчмарк() Экспорт +&Параметры(1) +&Параметры(2) +&ИсточникПараметров("ПолучитьПараметры") +Процедура Бенчмарк(Парам) Экспорт КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index b0c4ab2..60a5907 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -153,7 +153,7 @@ Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.Параметр("Парам2")]).Равно(100); Ожидаем.Что(Результат.Отчет.Таблица[1][КолонкиОтчетаБенчмарков.Параметр("Парам1")]).Равно(20); Ожидаем.Что(Результат.Отчет.Таблица[1][КолонкиОтчетаБенчмарков.Параметр("Парам2")]).Равно(200); - Ожидаем.Что(НаборыПараметров[0][0].ЭтоПараметрМетода).ЭтоИстина(); + Ожидаем.Что(НаборыПараметров[0].Получить(0).ЭтоПараметрМетода).ЭтоИстина(); КонецПроцедуры @@ -758,8 +758,8 @@ ИмяФайла = МенеджерВременныхФайлов.НовоеИмяФайла(); Сериализатор = Новый СериализаторРезультатовБенчмарков(); - Сериализатор.СериализоватьВJSON(Результат, ИмяФайла); - РезультатПрочитанный = Сериализатор.ДесериализоватьИзJSON(ИмяФайла, Конфигурация); + Сериализатор.ЗаписатьВJson(Результат, ИмяФайла); + РезультатПрочитанный = Сериализатор.ПрочитатьИзJson(ИмяФайла, Конфигурация); // Проверка Расшифровка = РезультатПрочитанный.Расшифровка; @@ -772,11 +772,11 @@ Ожидаем.Что(ДескрипторБенчмарка.Категория(), "Категория").Равно("Категория 1"); Ожидаем.Что(НаборыПараметров, "Наборы параметров").ИмеетДлину(2); Ожидаем.Что(НаборыПараметров[0], "Набор параметров 1").ИмеетДлину(2); - Ожидаем.Что(НаборыПараметров[0][0].Значение, "Набор параметров 1").Равно(3); - Ожидаем.Что(НаборыПараметров[0][1].Значение, "Набор параметров 1").Равно(4); + Ожидаем.Что(НаборыПараметров[0].Получить(0).Значение, "Набор параметров 1").Равно(3); + Ожидаем.Что(НаборыПараметров[0].Получить(1).Значение, "Набор параметров 1").Равно(4); Ожидаем.Что(НаборыПараметров[1], "Набор параметров 2").ИмеетДлину(2); - Ожидаем.Что(НаборыПараметров[1][0].Значение, "Набор параметров 2").Равно(5); - Ожидаем.Что(НаборыПараметров[1][1].Значение, "Набор параметров 2").Равно(6); + Ожидаем.Что(НаборыПараметров[1].Получить(0).Значение, "Набор параметров 2").Равно(5); + Ожидаем.Что(НаборыПараметров[1].Получить(1).Значение, "Набор параметров 2").Равно(6); Ожидаем.Что(Расшифровка[0].Параметры, "Количество строк в параметрах").ИмеетДлину(3); Ожидаем.Что(Расшифровка[0].Параметры[0].Значение, "Параметр 1.1").Содержит("ТаблицаЗначений@"); Ожидаем.Что(Расшифровка[0].Параметры[1].Значение, "Параметр 1.2").Равно(3); diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 04a690d..9d0aee8 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -3,28 +3,15 @@ #Использовать asserts #Использовать fluent -#Использовать tempfiles #Использовать "helpers" -Перем МенеджерВременныхФайлов; // МенеджерВременныхФайлов - -&Инициализация -Процедура ПередВсеми() Экспорт - МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); -КонецПроцедуры - -&Завершение -Процедура ПослеВсех() Экспорт - МенеджерВременныхФайлов.Удалить(); -КонецПроцедуры - &Тест Процедура Тест_АннотацииКонфигурации() Экспорт Тип = Тип("БенчмаркСАннотациямиКонфигурации"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); - ПроверитьКонфигурациюБенчмаркСАннотациямиКонфигурации(Конфигурация); + ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации(Конфигурация); КонецПроцедуры @@ -758,23 +745,7 @@ КонецПроцедуры -&Тест -Процедура Тест_ДолженПроверитьСериализациюКонфигурацииJson() Экспорт - - Тип = Тип("БенчмаркСАннотациямиКонфигурации"); - Конфигурация = Новый КонфигурацияБенчмарков(Тип); - - ИмяФайла = МенеджерВременныхФайлов.НовоеИмяФайла(); - - Сериализатор = Новый СериализаторБенчмарков(); - Сериализатор.ЗаписатьВJson(Конфигурация, ИмяФайла); - КонфигурацияПрочитанная = Сериализатор.ПрочитатьИзJson(ИмяФайла); - - ПроверитьКонфигурациюБенчмаркСАннотациямиКонфигурации(КонфигурацияПрочитанная); - -КонецПроцедуры - -Процедура ПроверитьКонфигурациюБенчмаркСАннотациямиКонфигурации(Конфигурация) +Процедура ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации(Конфигурация) Экспортеры = Конфигурация.Экспортеры(); КоллекцияЭкспортеры = ПроцессорыКоллекций.ИзКоллекции(Экспортеры); diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" new file mode 100644 index 0000000..8343b1d --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -0,0 +1,105 @@ +// BSLLS:DuplicateStringLiteral-off +// BSLLS:MagicNumber-off + +#Использовать asserts +#Использовать tempfiles +#Использовать "helpers" + +Перем МенеджерВременныхФайлов; // МенеджерВременныхФайлов + +&Инициализация +Процедура ПередВсеми() Экспорт + МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); +КонецПроцедуры + +&Завершение +Процедура ПослеВсех() Экспорт + МенеджерВременныхФайлов.Удалить(); +КонецПроцедуры + +&Тест +Процедура Тест_ДолженПроверитьСериализациюИДесериализацию() Экспорт + + Тип = Тип("БенчмаркСАннотациямиКонфигурации"); + Конфигурация = Новый КонфигурацияБенчмарков(Тип); + КоллекцияДескрипторов = Новый КоллекцияДескрипторовБенчмарков(Тип); + + ИмяФайла = МенеджерВременныхФайлов.НовоеИмяФайла(); + + Сериализатор = Новый СериализаторНастроекБенчмарков(); + Сериализатор.ЗаписатьВJson(КоллекцияДескрипторов, Конфигурация, ИмяФайла); + ДТО = Сериализатор.ПрочитатьИзJson(ИмяФайла); + + ПроверитьДескрипторыБенчмаркаСАннотациямиКонфигурации(ДТО.ДескрипторыБенчмарков); + ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации(ДТО.Конфигурация); + +КонецПроцедуры + +Процедура ПроверитьДескрипторыБенчмаркаСАннотациямиКонфигурации(ДескрипторыБенчмарков) + + Ожидаем.Что(ДескрипторыБенчмарков.Количество()).Равно(1); + + Дексриптор = ДескрипторыБенчмарков.ПолучитьПервый(); + НаборыПараметров = Дексриптор.НаборыПараметров(); + ИсточникиПараметров = Дексриптор.ИсточникиПараметров(); + + Ожидаем.Что(Дексриптор.ТипОбъекта()).Равно(Тип("БенчмаркСАннотациямиКонфигурации")); + Ожидаем.Что(Дексриптор.Метод()).Равно("Бенчмарк"); + Ожидаем.Что(Дексриптор.ЭтоЭталон()).ЭтоЛожь(); + + Ожидаем.Что(НаборыПараметров, "Наборы параметров").ИмеетДлину(2); + Ожидаем.Что(НаборыПараметров[0].Получить(0).Имя, "Наборы параметров [0].Имя").Равно("Парам"); + Ожидаем.Что(НаборыПараметров[0].Получить(0).Значение, "Наборы параметров [0].Значение").Равно(1); + Ожидаем.Что(НаборыПараметров[1].Получить(0).Имя, "Наборы параметров [1].Имя").Равно("Парам"); + Ожидаем.Что(НаборыПараметров[1].Получить(0).Значение, "Наборы параметров [1].Значение").Равно(2); + + Ожидаем.Что(ИсточникиПараметров, "Источники параметров").ИмеетДлину(1); + Ожидаем.Что(ИсточникиПараметров[0], "Источники параметров [0]").Равно("ПолучитьПараметры"); + +КонецПроцедуры + +Процедура ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации(Конфигурация) + + Экспортеры = Конфигурация.Экспортеры(); + КоллекцияЭкспортеры = ПроцессорыКоллекций.ИзКоллекции(Экспортеры); + ВерсииИсполняющейСреды = Конфигурация.ВерсииИсполняющейСреды(); + Колонки = Конфигурация.Колонки(); + Параметры = Конфигурация.Параметры(); + ИсточникиПараметров = Конфигурация.ИсточникиПараметров(); + + ФункцияПоискаЭкспортера = "Экспортер -> ТипЗнч(Экспортер) = Тип(""ЭкспортерРезультатовБенчмарковВ%1"")"; + + Ожидаем.Что(Конфигурация.Стратегия()).Равно(СтратегииЗапускаБенчмарка.ХолодныйЗапуск); + Ожидаем.Что(Конфигурация.СортировкаОтчета()).Равно(СортировкиОтчетаБенчмарков.ОтБыстрыхКМедленным); + Ожидаем.Что(Конфигурация.ТребуетсяМониторингПамяти()).ЭтоИстина(); + Ожидаем.Что(Конфигурация.КоличествоИтераций()).Равно(100); + Ожидаем.Что(Конфигурация.КоличествоВызововЗаИтерацию()).Равно(200); + Ожидаем.Что(Конфигурация.КоличествоПрогревочныхИтераций()).Равно(300); + Ожидаем.Что(Конфигурация.МинимальноеВремяИтерации()).Равно(400); + Ожидаем.Что(Конфигурация.МинимальноеКоличествоВызововЗаИтерацию()).Равно(500); + Ожидаем.Что(Конфигурация.ОбработчикиСобытия(СобытияБенчмарков.ПередВсеми), "Обработчики").Содержит("ПередВсеми"); + Ожидаем.Что(Конфигурация.ОбработчикиСобытия(СобытияБенчмарков.ПослеВсех), "Обработчики").Содержит("ПослеВсех"); + Ожидаем.Что(Конфигурация.ОбработчикиСобытия(СобытияБенчмарков.ПередКаждым), "Обработчики").Содержит("ПередКаждым"); + Ожидаем.Что(Конфигурация.ОбработчикиСобытия(СобытияБенчмарков.ПослеКаждого), "Обработчики").Содержит("ПослеКаждого"); + Ожидаем.Что(Конфигурация.КаталогАртефактов()).Равно("path/to/artifacts"); + Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "Markdown"))).ЭтоИстина(); + Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "Json"))).ЭтоИстина(); + Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "Xml"))).ЭтоИстина(); + Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "Html"))).ЭтоИстина(); + Ожидаем.Что(ВерсииИсполняющейСреды, "Должно быть 4 версии исполняющей среды").ИмеетДлину(4); + Ожидаем.Что(ВерсииИсполняющейСреды[0].Версия, "Версия исполняющей среды stable").Равно("stable"); + Ожидаем.Что(ВерсииИсполняющейСреды[1].Версия, "Версия исполняющей среды 1.9.3").Равно("1.9.3"); + Ожидаем.Что(ВерсииИсполняющейСреды[2].Версия, "Версия исполняющей среды 1.9.4").Равно("1.9.4"); + Ожидаем.Что(ВерсииИсполняющейСреды[3].Версия, "Версия исполняющей среды 2.0.0").Равно("2.0.0"); + Ожидаем.Что(ВерсииИсполняющейСреды[3].Наименование, "Наименование исполняющей среды 2.0.0").Равно("Новая"); + Ожидаем.Что(ВерсииИсполняющейСреды[3].ЭтоЭталон, "Исполняющая среда версии 2.0.0 - эталонная").ЭтоИстина(); + Ожидаем.Что(Колонки, "Колонки").Содержит(КолонкиОтчетаБенчмарков.Мин); + Ожидаем.Что(Колонки, "Колонки").Содержит(КолонкиОтчетаБенчмарков.Макс); + Ожидаем.Что(Параметры, "Параметры").ИмеетДлину(2); + Ожидаем.Что(Параметры[0].Значение, "Параметры").Равно(100); + Ожидаем.Что(Параметры[1].Значение, "Параметры").Равно(200); + Ожидаем.Что(ИсточникиПараметров, "Источники параметров").ИмеетДлину(1); + Ожидаем.Что(ИсточникиПараметров[0].ИмяПоля, "Источники параметров").Равно("ОбщееЗначение"); + Ожидаем.Что(ИсточникиПараметров[0].Источник, "Источники параметров").Равно("ПолучитьЗначения"); + +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\255\321\202\320\260\320\273\320\276\320\275\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\255\321\202\320\260\320\273\320\276\320\275\320\276\320\262.os" index 31bc8ae..0578660 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\255\321\202\320\260\320\273\320\276\320\275\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\255\321\202\320\260\320\273\320\276\320\275\320\276\320\262.os" @@ -1,3 +1,4 @@ +// BSLLS:LineLength-off // BSLLS:DuplicateStringLiteral-off // BSLLS:MagicNumber-off From b1a297921e8779768d16bc3b9b514b17033a43dd Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 18 Oct 2025 01:59:00 +0300 Subject: [PATCH 3/6] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=20coderabbit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\277\321\203\321\201\320\272\320\260.os" | 17 +++++++++----- ...20\260\321\200\320\272\320\276\320\262.os" | 2 +- ...20\260\321\200\320\272\320\276\320\262.os" | 22 +++++++++---------- ...21\200\320\260\321\202\320\276\321\200.os" | 4 ++-- ...20\276\320\262\320\224\321\202\320\276.os" | 7 +++++- ...20\260\321\200\320\272\320\276\320\262.os" | 12 +++++----- 6 files changed, 37 insertions(+), 27 deletions(-) diff --git "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" index f0efaf1..fc6e033 100644 --- "a/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\320\272\320\260.os" @@ -115,7 +115,7 @@ Функция ПодключитьТипы() ПодключенныеТипы = Новый Массив(); - Для Каждого ИмяФайла Из ФайлыБенчмарков() Цикл + Для Каждого ИмяФайла Из НайтиФайлыБенчмарков() Цикл Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла); Если Не Тип = Неопределено Тогда ПодключенныеТипы.Добавить(Тип); @@ -126,18 +126,23 @@ КонецФункции -Функция ФайлыБенчмарков() +Функция НайтиФайлыБенчмарков() Файлы = Новый Массив(); Для Каждого ИмяФайла Из _МассивФайлов Цикл Если ФС.КаталогСуществует(ИмяФайла) Тогда - Файлы = НайтиФайлы(ИмяФайла, , _Рекурсивно); - Для Каждого ИмяФайлаВКаталоге Из Файлы Цикл - Файлы.Добавить(ИмяФайлаВКаталоге); + НайденныеФайлы = НайтиФайлы(ИмяФайла, , _Рекурсивно); + Для Каждого ИмяФайлаВКаталоге Из НайденныеФайлы Цикл + Если Файлы.Найти(ИмяФайлаВКаталоге) = Неопределено Тогда + Файлы.Добавить(ИмяФайлаВКаталоге); + КонецЕсли; КонецЦикла; Иначе - Файлы.Добавить(ПолноеИмяФайлаСценария(ИмяФайла)); + ПолноеИмяФайла = ПолноеИмяФайлаСценария(ИмяФайла); + Если Файлы.Найти(ПолноеИмяФайла) = Неопределено Тогда + Файлы.Добавить(ПолноеИмяФайла); + КонецЕсли; КонецЕсли; КонецЦикла; diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 27145e1..5fb9a56 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -44,7 +44,7 @@ // ИмяФайла - Строка - Имя файла, из которого будет прочитана конфигурация. // // Возвращаемое значение: -// БенчмаркиСКонфигурацией +// НастройкиБенчмарковДто Функция ПрочитатьИзJson(ИмяФайла) Экспорт _Лог.Отладка("Начало чтения файла: %1", ИмяФайла); diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index e36a683..c60dadb 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\230\320\267\320\262\320\273\320\265\320\272\320\260\321\202\320\265\320\273\321\214\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -34,13 +34,13 @@ ПрочитатьАннотациюМинимальноеКоличествоВызововЗаИтерацию(СвойстваКонструктора, КонфигурацияБенчмарков); ПрочитатьАннотациюСортировка(СвойстваКонструктора, КонфигурацияБенчмарков); ПрочитатьАннотациюМониторингПамяти(СвойстваКонструктора, КонфигурацияБенчмарков); - ПрочитатьАннотацииКолонок(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюКаталогАртефактов(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортMarkdown(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортJson(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортXml(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортHtml(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюИсполняющаяСреда(СвойстваКонструктора, Конфигурация); + ПрочитатьАннотацииКолонок(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюКаталогАртефактов(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортMarkdown(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортJson(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортXml(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортHtml(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюИсполняющаяСреда(СвойстваКонструктора, КонфигурацияБенчмарков); КонецЕсли; Для Каждого СвойстваПоля Из ТаблицаСвойств Цикл @@ -48,10 +48,10 @@ ПрочитатьАннотациюИсточникПараметров(СвойстваПоля, КонфигурацияБенчмарков); КонецЦикла; - ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПередВсеми, РефлекторОбъекта, Конфигурация); - ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПослеВсех, РефлекторОбъекта, Конфигурация); - ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПередКаждым, РефлекторОбъекта, Конфигурация); - ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПослеКаждого, РефлекторОбъекта, Конфигурация); + ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПередВсеми, РефлекторОбъекта, КонфигурацияБенчмарков); + ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПослеВсех, РефлекторОбъекта, КонфигурацияБенчмарков); + ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПередКаждым, РефлекторОбъекта, КонфигурацияБенчмарков); + ПрочитатьОбработчикиСобытия(СобытияБенчмарков.ПослеКаждого, РефлекторОбъекта, КонфигурацияБенчмарков); Возврат КонфигурацияБенчмарков; diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\277\320\260\321\200\320\260\321\202\320\276\321\200.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\277\320\260\321\200\320\260\321\202\320\276\321\200.os" index 0d98075..7c76283 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\277\320\260\321\200\320\260\321\202\320\276\321\200.os" +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\274\320\277\320\260\321\200\320\260\321\202\320\276\321\200.os" @@ -3,8 +3,8 @@ // Определяет, совпадают ли значения двух объектов по их внутреннему содержанию. // // Параметры: -// Значение1 - Проивзольный - Первый объект для сравнения -// Значение2 - Проивзольный - Второй объект для сравнения +// Значение1 - Произвольный - Первый объект для сравнения +// Значение2 - Произвольный - Второй объект для сравнения // // Возвращаемое значение: // Булево diff --git "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" "b/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" index 629811e..75eefa6 100644 --- "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" +++ "b/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" @@ -6,4 +6,9 @@ &Сериализуемое &Тип("КонфигурацияБенчмарков") -Перем Конфигурация Экспорт; // КонфигурацияБенчмарков \ No newline at end of file +Перем Конфигурация Экспорт; // КонфигурацияБенчмарков + +Процедура ПриСозданииОбъекта() + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(); + Конфигурация = Новый КонфигурацияБенчмарков(); +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 8343b1d..56fde55 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -39,13 +39,13 @@ Ожидаем.Что(ДескрипторыБенчмарков.Количество()).Равно(1); - Дексриптор = ДескрипторыБенчмарков.ПолучитьПервый(); - НаборыПараметров = Дексриптор.НаборыПараметров(); - ИсточникиПараметров = Дексриптор.ИсточникиПараметров(); + Дескриптор = ДескрипторыБенчмарков.ПолучитьПервый(); + НаборыПараметров = Дескриптор.НаборыПараметров(); + ИсточникиПараметров = Дескриптор.ИсточникиПараметров(); - Ожидаем.Что(Дексриптор.ТипОбъекта()).Равно(Тип("БенчмаркСАннотациямиКонфигурации")); - Ожидаем.Что(Дексриптор.Метод()).Равно("Бенчмарк"); - Ожидаем.Что(Дексриптор.ЭтоЭталон()).ЭтоЛожь(); + Ожидаем.Что(Дескриптор.ТипОбъекта()).Равно(Тип("БенчмаркСАннотациямиКонфигурации")); + Ожидаем.Что(Дескриптор.Метод()).Равно("Бенчмарк"); + Ожидаем.Что(Дескриптор.ЭтоЭталон()).ЭтоЛожь(); Ожидаем.Что(НаборыПараметров, "Наборы параметров").ИмеетДлину(2); Ожидаем.Что(НаборыПараметров[0].Получить(0).Имя, "Наборы параметров [0].Имя").Равно("Парам"); From d3e55ec8f3f1d1c36d7da33f3aa72d31860ee4eb Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 18 Oct 2025 23:52:49 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B5=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86?= =?UTF-8?q?=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2=20?= =?UTF-8?q?json.=20=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D1=8B=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D1=83=D0=B5=D0=BC=D1=8B=D1=85=20=D0=BF=D0=BE=D0=BB=D0=B5?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\274\320\260\321\200\320\272\320\260.os" | 12 ++-- ...20\260\321\200\320\272\320\276\320\262.os" | 2 +- ...20\260\321\200\320\272\320\276\320\262.os" | 39 ++++++----- ...20\274\320\260\321\200\320\272\320\260.os" | 5 ++ ...20\274\320\260\321\200\320\272\320\260.os" | 2 +- ...20\276\320\262\320\224\321\202\320\276.os" | 4 +- ...20\271\320\232\320\273\321\216\321\207.os" | 10 +++ ...0\260\321\202\320\276\321\200JsonBench.os" | 66 ++++++++++++------- ...0\260\321\202\320\276\321\200JsonBench.os" | 58 +++++++++++----- ...21\200\320\260\321\206\320\270\320\270.os" | 1 + ...20\260\321\200\320\272\320\276\320\262.os" | 1 + 11 files changed, 137 insertions(+), 63 deletions(-) create mode 100644 "src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\321\213\320\271\320\232\320\273\321\216\321\207.os" diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 1e65213..1471f87 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -3,31 +3,31 @@ #Использовать reflector #Использовать "../../dto" -&Сериализуемое("Тип") +&Сериализуемое("Type") &Тип("Тип") &Заполнено Перем _Тип; // Тип - Класс бенчмарков -&Сериализуемое("Метод") +&Сериализуемое("Method") &Тип("Строка") &Заполнено Перем _Метод; // Строка - Метод бенчмарка -&Сериализуемое("ЭтоЭталон") +&Сериализуемое("IsBaseline") &Тип("Булево") Перем _ЭтоЭталон; // Булево -&Сериализуемое("Категория") +&Сериализуемое("Category") &Тип("Строка") Перем _Категория; // Строка -&Сериализуемое("НаборыПараметров") +&Сериализуемое("ParameterSets") &Тип("Массив") &ДляКаждого &Тип("ПараметрыМетодаБенчмарка") Перем _НаборыПараметров; // Массив из ПараметрыМетодаБенчмарка -&Сериализуемое("ИсточникиПараметров") +&Сериализуемое("ParameterSources") &Тип("Массив") Перем _ИсточникиПараметров; // Массив из Строка, Делегат diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 352ea9a..1d16c71 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\273\320\265\320\272\321\206\320\270\321\217\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\276\320\262\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,6 +1,6 @@ #Использовать fluent -&Сериализуемое("Элементы") +&Сериализуемое("Items") &Тип("Массив") &ДляКаждого &Тип("ДескрипторБенчмарка") diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 3456d68..ad0926e 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -3,82 +3,89 @@ #Использовать validate #Использовать reflector -&Сериализуемое("Стратегия") +&Сериализуемое("Strategy") &Тип("Строка") &Геттер("Стратегия") Перем _Стратегия; // см. СтратегииЗапускаБенчмарка -&Сериализуемое("КоличествоИтераций") +&Сериализуемое("IterationCount") &Тип("Число") &Геттер("КоличествоИтераций") Перем _КоличествоИтераций; // Число -&Сериализуемое("КоличествоВызововЗаИтерацию") +&Сериализуемое("InvocationCount") &Тип("Число") &Геттер("КоличествоВызововЗаИтерацию") Перем _КоличествоВызововЗаИтерацию; // Число -&Сериализуемое("КоличествоПрогревочныхИтераций") +&Сериализуемое("WarmupCount") &Тип("Число") &Геттер("КоличествоПрогревочныхИтераций") Перем _КоличествоПрогревочныхИтераций; // Число -&Сериализуемое("МинимальноеВремяИтерации") +&Сериализуемое("MinIterationTime") &Тип("Число") &Геттер("МинимальноеВремяИтерации") Перем _МинимальноеВремяИтерации; // Число - мс -&Сериализуемое("МинимальноеКоличествоВызововЗаИтерацию") +&Сериализуемое("MinInvocationCount") &Тип("Число") &Геттер("МинимальноеКоличествоВызововЗаИтерацию") Перем _МинимальноеКоличествоВызововЗаИтерацию; // Число -&Сериализуемое("СортировкаОтчета") +&Сериализуемое("ReportSorting") &Тип("Строка") &Геттер("СортировкаОтчета") Перем _СортировкаОтчета; // см. СортировкиОтчетаБенчмарков -&Сериализуемое("ТребуетсяМониторингПамяти") +&Сериализуемое("Memory") &Тип("Булево") &Геттер("ТребуетсяМониторингПамяти") Перем _ТребуетсяМониторингПамяти; // Булево -&Сериализуемое("КаталогАртефактов") +&Сериализуемое("ArtifactsDirectory") &Тип("Строка") &Геттер("КаталогАртефактов") Перем _КаталогАртефактов; // Строка -&Сериализуемое("Параметры") +&Сериализуемое("Parameters") &Тип("Массив") &ДляКаждого &Тип("ПараметрБенчмарка") &Геттер("Параметры") Перем _Параметры; // Массив из ПараметрБенчмарка -&Сериализуемое("ИсточникиПараметров") +&Сериализуемое("ParameterSources") +&СериализуемыйКлюч("ИмяПоля", "FieldName") +&СериализуемыйКлюч("Источник", "Source") &Тип("ТаблицаЗначений") &Геттер("ИсточникиПараметров") Перем _ИсточникиПараметров; // ТаблицаЗначений -&Сериализуемое("Обработчики") +&Сериализуемое("Handlers") +&СериализуемыйКлюч("Событие", "Event") +&СериализуемыйКлюч("Обработчик", "Handler") &Тип("ТаблицаЗначений") &Геттер("ОбработчикиСобытий") Перем _Обработчики; // ТаблицаЗначений -&Сериализуемое("Колонки") +&Сериализуемое("Columns") &Тип("Массив") &Геттер("Колонки") Перем _Колонки; // Массив из Строка - см. КолонкиОтчетаБенчмарков &Несериализуемое &Геттер("Экспортеры") -Перем _Экспортеры; // Массив из см. ЭкспортерыРезультатовБенчмарков +Перем _Экспортеры; // Массив из Произвольный - см. ЭкспортерыРезультатовБенчмарков -&Сериализуемое("Экспортеры") +&Сериализуемое("Exporters") &Тип("Массив") Перем _ЭкспортерыСериализуемое; // Массив из Строка -&Сериализуемое("ВерсииИсполняющейСреды") +&Сериализуемое("RuntimeVersions") +&СериализуемыйКлюч("Версия", "Version") +&СериализуемыйКлюч("Наименование", "Name") +&СериализуемыйКлюч("ЭтоЭталон", "IsBaseline") &Тип("ТаблицаЗначений") &Геттер("ВерсииИсполняющейСреды") Перем _ВерсииИсполняющейСреды; // ТаблицаЗначений diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 337727a..cc184d2 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -1,7 +1,12 @@ // BSLLS:ExportVariables-off +&Сериализуемое("Name") Перем Имя Экспорт; // Строка + +&Сериализуемое("Value") Перем Значение Экспорт; // Произвольный + +&Сериализуемое("IsMethodParameter") Перем ЭтоПараметрМетода Экспорт; // Булево Процедура ПриСозданииОбъекта(пИмя = "", пЗначение = Неопределено, пЭтоПараметрМетода = Ложь) diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\321\202\320\276\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\321\202\320\276\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 694339d..e17ab6b 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\321\202\320\276\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\234\320\265\321\202\320\276\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -1,6 +1,6 @@ #Использовать asserts -&Сериализуемое +&Сериализуемое("Items") &Тип("Массив") &ДляКаждого &Тип("ПараметрБенчмарка") diff --git "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" "b/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" index 75eefa6..600a431 100644 --- "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" +++ "b/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\224\321\202\320\276.os" @@ -1,10 +1,10 @@ // BSLLS:ExportVariables-off -&Сериализуемое +&Сериализуемое("BenchmarkDescriptors") &Тип("КоллекцияДескрипторовБенчмарков") Перем ДескрипторыБенчмарков Экспорт; // КоллекцияДескрипторовБенчмарков -&Сериализуемое +&Сериализуемое("Configuration") &Тип("КонфигурацияБенчмарков") Перем Конфигурация Экспорт; // КонфигурацияБенчмарков diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\321\213\320\271\320\232\320\273\321\216\321\207.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\321\213\320\271\320\232\320\273\321\216\321\207.os" new file mode 100644 index 0000000..49d7ea9 --- /dev/null +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\275\320\275\320\276\321\202\320\260\321\206\320\270\321\217\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\321\203\320\265\320\274\321\213\320\271\320\232\320\273\321\216\321\207.os" @@ -0,0 +1,10 @@ +// Copyright © 2025 Nikita Fedkin (nixel2007@gmail.com). +// Адаптированная версия библиотеки jason (https://github.com/nixel2007/jason) +// +// Параметры: +// Значение - Строка - Первый параметр аннотации задаёт имя сериализуемого ключа, +// а второй - имя ключа в JSON. +// +&Аннотация("СериализуемыйКлюч") +Процедура ПриСозданииОбъекта(Значение) +КонецПроцедуры diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" index f38c3fe..97021d7 100644 --- "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" @@ -62,7 +62,7 @@ #Область СлужебныеПроцедурыИФункции -Функция ПреобразоватьОбъектДесериализации(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов = Неопределено) +Функция ПреобразоватьОбъектДесериализации(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов = Неопределено, ДесериализуемыеКлючи = Неопределено) Если ЭтоПримитивныйТип(ТипОбъекта) Тогда Возврат ПреобразоватьПримитивныйТип(ДесериализованныйОбъект, ТипОбъекта); @@ -73,7 +73,7 @@ ИначеЕсли ТипОбъекта = Тип("Структура") Тогда Возврат ПреобразоватьОбъект(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов); ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда - Возврат ПреобразоватьТаблицуЗначений(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов); + Возврат ПреобразоватьТаблицуЗначений(ДесериализованныйОбъект, ТипОбъекта, ТипЭлементов, ДесериализуемыеКлючи); ИначеЕсли ТипОбъекта = Тип("Тип") Тогда Возврат ПреобразоватьТип(ДесериализованныйОбъект); ИначеЕсли ЭтоПользовательскийТип(ТипОбъекта) Тогда @@ -114,7 +114,7 @@ КонецФункции -Функция ПреобразоватьТаблицуЗначений(Объект, ТипОбъекта, ТипЭлементов) +Функция ПреобразоватьТаблицуЗначений(Объект, ТипОбъекта, ТипЭлементов, ДесериализуемыеКлючи) Результат = Новый ТаблицаЗначений; КоличествоЭлементов = Объект.Количество(); @@ -123,30 +123,35 @@ Возврат Результат; КонецЕсли; - ИменаКолонок = Объект[0]; - Если Не ТипЗнч(ИменаКолонок) = Тип("Массив") Тогда - Возврат Результат; - КонецЕсли; + ДобавленныеКолонки = Новый МножествоСоответствие; - КоличествоКолонок = ИменаКолонок.Количество(); - - Для Каждого ИмяКолонки Из ИменаКолонок Цикл - Результат.Колонки.Добавить(ИмяКолонки); - КонецЦикла; + Для ИндексЭлемента = 0 По КоличествоЭлементов - 1 Цикл - Для ИндексЭлемента = 1 По КоличествоЭлементов - 1 Цикл ЗначенияКолонок = Объект[ИндексЭлемента]; - Если Не ТипЗнч(ЗначенияКолонок) = Тип("Массив") Тогда + Если Не (ТипЗнч(ЗначенияКолонок) = Тип("Структура") Или ТипЗнч(ЗначенияКолонок) = Тип("Соответствие")) Тогда Продолжить; КонецЕсли; СтрокаТаблицы = Результат.Добавить(); - Для ИндексКолонки = 0 По Мин(КоличествоКолонок, ЗначенияКолонок.Количество()) - 1 Цикл - ИмяКолонки = ИменаКолонок[ИндексКолонки]; - ЗначениеКолонки = ЗначенияКолонок[ИндексКолонки]; + Для Каждого КлючИЗначение Из ЗначенияКолонок Цикл + + ИмяКолонки = КлючИЗначение.Ключ; + ЗначениеКолонки = КлючИЗначение.Значение; + + Если ДесериализуемыеКлючи.Свойство(ИмяКолонки) Тогда + ИмяКолонки = ДесериализуемыеКлючи[ИмяКолонки]; + КонецЕсли; + + Если Не ДобавленныеКолонки.Содержит(ИмяКолонки) Тогда + Результат.Колонки.Добавить(ИмяКолонки); + ДобавленныеКолонки.Добавить(ИмяКолонки); + КонецЕсли; + ПреобразованныйЭлемент = ПреобразоватьОбъектДесериализации(ЗначениеКолонки, ТипЗнч(ЗначениеКолонки)); СтрокаТаблицы[ИмяКолонки] = ПреобразованныйЭлемент; + КонецЦикла; + КонецЦикла; Возврат Результат; @@ -181,10 +186,9 @@ КонецЦикла; Для Каждого КлючИЗначение Из Объект Цикл + Свойство = СвойстваПоИменамПолей[КлючИЗначение.Ключ]; Если Свойство = Неопределено Тогда - // Если поле не найдено, то пропускаем его - // TODO: Падать, если не висит @JsonIgnore Продолжить; КонецЕсли; @@ -195,13 +199,15 @@ ТипСвойства = ТипыСвойства.БазовыйТип; ТипЭлементов = ТипыСвойства.ТипЭлементов; - ЗначениеСвойства = ПреобразоватьОбъектДесериализации(ЗначениеСвойства, ТипСвойства, ТипЭлементов); + ДесериализуемыеКлючи = ПолучитьДесериализуемыеКлючи(Свойство); + ЗначениеСвойства = ПреобразоватьОбъектДесериализации(ЗначениеСвойства, ТипСвойства, ТипЭлементов, ДесериализуемыеКлючи); Если ТипСвойства <> Неопределено И ТипСвойства <> ТипЗнч(ЗначениеСвойства) Тогда Лог.Ошибка("Тип свойства '%1' не соответствует ожидаемому типу '%2'", ТипЗнч(ЗначениеСвойства), ТипСвойства); Продолжить; КонецЕсли; Рефлектор.УстановитьСвойство(Результат, ИмяСвойства, ЗначениеСвойства); + КонецЦикла; Если Рефлектор.МетодСуществует(Результат, "ПослеДесериализации") Тогда @@ -212,8 +218,6 @@ КонецФункции -#КонецОбласти - Функция ПолучитьТипыСвойства(Свойство, ЗначениеСвойства) ОписаниеСвойства = Новый Структура(); @@ -258,6 +262,24 @@ КонецФункции +Функция ПолучитьДесериализуемыеКлючи(СвойствоОбъекта) + + ДесериализуемыеКлючи = Новый Структура(); + + АннотацииСериализуемыеКлючи = РаботаСАннотациями.НайтиАннотации(СвойствоОбъекта.Аннотации, "СериализуемыйКлюч"); + Для Каждого Аннотация Из АннотацииСериализуемыеКлючи Цикл + КоличествоПараметров = Аннотация.Параметры.Количество(); + Если КоличествоПараметров > 1 Тогда + ДесериализуемыеКлючи.Вставить(Аннотация.Параметры[1].Значение, Аннотация.Параметры[0].Значение); + КонецЕсли; + КонецЦикла; + + Возврат ДесериализуемыеКлючи; + +КонецФункции + +#КонецОбласти + Процедура ПриСозданииОбъекта() Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.jason.ДесериализаторJson"); diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" index 9de2d3a..e162dff 100644 --- "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" @@ -49,7 +49,7 @@ #Область СлужебныеПроцедурыИФункции -Функция ПреобразоватьОбъектСериализации(Объект) +Функция ПреобразоватьОбъектСериализации(Объект, СериализуемыеКлючи = Неопределено) ТипОбъекта = ТипЗнч(Объект); @@ -58,7 +58,7 @@ ИначеЕсли ТипОбъекта = Тип("Структура") ИЛИ ТипОбъекта = Тип("Соответствие") Тогда Результат = ПреобразоватьСтруктуру(Объект); ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда - Результат = ПреобразоватьТаблицуЗначений(Объект); + Результат = ПреобразоватьТаблицуЗначений(Объект, СериализуемыеКлючи); ИначеЕсли ЭтоПримитивныйТип(ТипОбъекта) Тогда Результат = ПреобразоватьПримитивныйТип(Объект); ИначеЕсли ТипОбъекта = Тип("Тип") Тогда @@ -97,21 +97,28 @@ Возврат Результат; КонецФункции -Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений) Экспорт +Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений, СериализуемыеКлючи) Экспорт Результат = Новый Массив(); - - ИменаКолонок = Новый Массив(); - Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл - ИменаКолонок.Добавить(Колонка.Имя); - КонецЦикла; - Результат.Добавить(ИменаКолонок); + СерриализоватьВсеКолонки = СериализуемыеКлючи.Количество() = 0; Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл - ЗначенияКолонок = Новый Массив(); + ЗначенияКолонок = Новый Структура(); Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл - ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]); - ЗначенияКолонок.Добавить(ПреобразованноеЗначение); + + Если СериализуемыеКлючи.Свойство(Колонка.Имя) Тогда + ИмяКлюча = СериализуемыеКлючи[Колонка.Имя]; + ИначеЕсли СерриализоватьВсеКолонки Тогда + ИмяКлюча = Колонка.Имя; + Иначе + Продолжить; + КонецЕсли; + + Если СерриализоватьВсеКолонки Или СериализуемыеКлючи.Свойство(Колонка.Имя) Тогда + ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]); + ЗначенияКолонок.Вставить(ИмяКлюча, ПреобразованноеЗначение); + КонецЕсли; + КонецЦикла; Результат.Добавить(ЗначенияКолонок); КонецЦикла; @@ -161,18 +168,39 @@ ИмяСвойства = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Значение", СвойствоОбъекта.Имя); Обязательное = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Обязательное", Обязательное); КонецЕсли; - + + СериализуемыеКлючи = ПолучитьСериализуемыеКлючи(СвойствоОбъекта); + ЗначениеСвойства = Рефлектор.ПолучитьСвойство(Объект, СвойствоОбъекта.Имя); - ЗначениеСвойства = ПреобразоватьОбъектСериализации(ЗначениеСвойства); + ЗначениеСвойства = ПреобразоватьОбъектСериализации(ЗначениеСвойства, СериализуемыеКлючи); Если Обязательное ИЛИ ЗначениеСвойства <> Неопределено Тогда Результат.Вставить(ИмяСвойства, ЗначениеСвойства); КонецЕсли; + КонецЦикла; Возврат Результат; КонецФункции +Функция ПолучитьСериализуемыеКлючи(СвойствоОбъекта) + + СериализуемыеКлючи = Новый Структура(); + + АннотацииСериализуемыеКлючи = РаботаСАннотациями.НайтиАннотации(СвойствоОбъекта.Аннотации, "СериализуемыйКлюч"); + Для Каждого Аннотация Из АннотацииСериализуемыеКлючи Цикл + КоличествоПараметров = Аннотация.Параметры.Количество(); + Если КоличествоПараметров = 1 Тогда + СериализуемыеКлючи.Вставить(Аннотация.Параметры[0].Значение); + ИначеЕсли КоличествоПараметров > 1 Тогда + СериализуемыеКлючи.Вставить(Аннотация.Параметры[0].Значение, Аннотация.Параметры[1].Значение); + КонецЕсли; + КонецЦикла; + + Возврат СериализуемыеКлючи; + +КонецФункции + #КонецОбласти Процедура ПриСозданииОбъекта() @@ -194,4 +222,4 @@ ПримитивныеТипы.Добавить(Тип("Null")); ПримитивныеТипы.Добавить(Тип("Неопределено")); -КонецПроцедуры +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 9d0aee8..6e30c4c 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" @@ -783,6 +783,7 @@ Ожидаем.Что(Колонки, "Колонки").Содержит(КолонкиОтчетаБенчмарков.Мин); Ожидаем.Что(Колонки, "Колонки").Содержит(КолонкиОтчетаБенчмарков.Макс); Ожидаем.Что(Параметры, "Параметры").ИмеетДлину(2); + Ожидаем.Что(Параметры[0], "Параметры").ИмеетТип("ПараметрБенчмарка"); Ожидаем.Что(Параметры[0].Значение, "Параметры").Равно(100); Ожидаем.Что(Параметры[1].Значение, "Параметры").Равно(200); Ожидаем.Что(ИсточникиПараметров, "Источники параметров").ИмеетДлину(1); diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 56fde55..dd7bec1 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -96,6 +96,7 @@ Ожидаем.Что(Колонки, "Колонки").Содержит(КолонкиОтчетаБенчмарков.Мин); Ожидаем.Что(Колонки, "Колонки").Содержит(КолонкиОтчетаБенчмарков.Макс); Ожидаем.Что(Параметры, "Параметры").ИмеетДлину(2); + Ожидаем.Что(Параметры[0], "Параметры").ИмеетТип("ПараметрБенчмарка"); Ожидаем.Что(Параметры[0].Значение, "Параметры").Равно(100); Ожидаем.Что(Параметры[1].Значение, "Параметры").Равно(200); Ожидаем.Что(ИсточникиПараметров, "Источники параметров").ИмеетДлину(1); From fe3ba8cb8207ee7f329af8090e6c910f5513b3db Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 19 Oct 2025 12:57:37 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=20coderabbitai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...67\320\260\321\202\320\276\321\200JsonBench.os" | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" index e162dff..45f00ef 100644 --- "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" @@ -100,27 +100,29 @@ Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений, СериализуемыеКлючи) Экспорт Результат = Новый Массив(); - СерриализоватьВсеКолонки = СериализуемыеКлючи.Количество() = 0; + СериализоватьВсеКолонки = СериализуемыеКлючи.Количество() = 0; Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл + ЗначенияКолонок = Новый Структура(); + Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл Если СериализуемыеКлючи.Свойство(Колонка.Имя) Тогда ИмяКлюча = СериализуемыеКлючи[Колонка.Имя]; - ИначеЕсли СерриализоватьВсеКолонки Тогда + ИначеЕсли СериализоватьВсеКолонки Тогда ИмяКлюча = Колонка.Имя; Иначе Продолжить; КонецЕсли; - Если СерриализоватьВсеКолонки Или СериализуемыеКлючи.Свойство(Колонка.Имя) Тогда - ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]); - ЗначенияКолонок.Вставить(ИмяКлюча, ПреобразованноеЗначение); - КонецЕсли; + ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]); + ЗначенияКолонок.Вставить(ИмяКлюча, ПреобразованноеЗначение); КонецЦикла; + Результат.Добавить(ЗначенияКолонок); + КонецЦикла; Возврат Результат; From edd21403e76dcbf2c11d2b63a8eebd483106523b Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 19 Oct 2025 13:14:41 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC=20coderabbitai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\320\274\320\260\321\200\320\272\320\276\320\262.os" | 6 +++--- ...\320\267\320\260\321\202\320\276\321\200JsonBench.os" | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 9ee96a6..2cab647 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -172,7 +172,7 @@ Тип = _ДескрипторыБенчмарков.ПолучитьПервый().ТипОбъекта(); ИмяФайлаИсполняющейСреды = ИмяФайлаИсполняющейСреды(Версия); ИмяФайлаТочкиВхода = ТочкаВходаКонсольногоПриложения(); - ИмяФайлаКонфигурации = ПолучитьИмяФайлаКонфигурацииДляПроцесса(Конфигурация); + ИмяФайлаКонфигурации = ЗаписатьНастройкиВФайл(_ДескрипторыБенчмарков, Конфигурация); ИмяФайлаТипа = Новый РасширениеТипа(Тип).Источник; КаталогБиблиотек = ИсполняющаяСредаБенчмарков.КаталогБиблиотек(); @@ -238,12 +238,12 @@ КонецФункции -Функция ПолучитьИмяФайлаКонфигурацииДляПроцесса(Конфигурация) +Функция ЗаписатьНастройкиВФайл(ДескрипторыБенчмарков, Конфигурация) ПутьКФайлу = _МенеджерВременныхФайлов.СоздатьФайл("json"); Сериализатор = Новый СериализаторНастроекБенчмарков(); - Сериализатор.ЗаписатьВJson(_ДескрипторыБенчмарков, Конфигурация, ПутьКФайлу); + Сериализатор.ЗаписатьВJson(ДескрипторыБенчмарков, Конфигурация, ПутьКФайлу); Возврат ПутьКФайлу; diff --git "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" index 45f00ef..5289e6d 100644 --- "a/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" +++ "b/src/BenchmarkOneScript/jason/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200JsonBench.os" @@ -97,9 +97,14 @@ Возврат Результат; КонецФункции -Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений, СериализуемыеКлючи) Экспорт +Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений, СериализуемыеКлючи = Неопределено) Экспорт Результат = Новый Массив(); + + Если СериализуемыеКлючи = Неопределено Тогда + СериализуемыеКлючи = Новый Структура(); + КонецЕсли; + СериализоватьВсеКолонки = СериализуемыеКлючи.Количество() = 0; Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл @@ -193,7 +198,7 @@ Для Каждого Аннотация Из АннотацииСериализуемыеКлючи Цикл КоличествоПараметров = Аннотация.Параметры.Количество(); Если КоличествоПараметров = 1 Тогда - СериализуемыеКлючи.Вставить(Аннотация.Параметры[0].Значение); + СериализуемыеКлючи.Вставить(Аннотация.Параметры[0].Значение, Аннотация.Параметры[0].Значение); ИначеЕсли КоличествоПараметров > 1 Тогда СериализуемыеКлючи.Вставить(Аннотация.Параметры[0].Значение, Аннотация.Параметры[1].Значение); КонецЕсли;