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 5052b0b..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,8 +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") + .ЗависитОт("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..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" @@ -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,42 +74,75 @@ УстановитьРежимВоркер(); - Для Каждого Каталог Из КаталогиБенчмарков() Цикл - Бенчмаркинг.ЗапуститьИзКаталога(Каталог, _Рекурсивно, ПрочитатьКонфигурацию()); - КонецЦикла; + ПодключенныеТипы = ПодключитьТипы(); + Настройки = ПрочитатьНастройки(); + Конфигурация = ПрочитатьКонфигурацию(Настройки); - Для Каждого ИмяФайла Из ФайлыБенчмарков() Цикл - Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла); - Если Не Тип = Неопределено Тогда - Конфигурация = Новый КонфигурацияБенчмарков(Тип); - Конфигурация.Объединить(ПрочитатьКонфигурацию()); - Бенчмаркинг.Запустить(Тип, Конфигурация); + Для Каждого Тип Из ПодключенныеТипы Цикл + + КонфигурацияТипа = Новый КонфигурацияБенчмарков(Тип); + КонфигурацияТипа.Объединить(Конфигурация); + + Если Не Настройки = Неопределено И Настройки.ДескрипторыБенчмарков.Количество() > 0 Тогда + Источник = Настройки.ДескрипторыБенчмарков; + Иначе + Источник = Тип; КонецЕсли; + + Попытка + Бенчмаркинг.Запустить(Источник, КонфигурацияТипа); + Исключение + _Лог.Ошибка("Возникла ошибка при запуске бенчмарков <%1>: %2", + Тип, + ОписаниеОшибки()); + КонецПопытки; + КонецЦикла; КонецПроцедуры -Функция КаталогиБенчмарков() - - Каталоги = Новый Массив(); +Функция ПрочитатьНастройки() - Для Каждого ИмяФайла Из _МассивФайлов Цикл - Если ФС.КаталогСуществует(ИмяФайла) Тогда - Каталоги.Добавить(ИмяФайла); + Если Не ЗначениеЗаполнено(_ФайлНастроек) Тогда + Возврат Неопределено; + КонецЕсли; + + Сериализатор = Новый СериализаторНастроекБенчмарков(); + Возврат Сериализатор.ПрочитатьИзJson(_ФайлНастроек); + +КонецФункции + +Функция ПодключитьТипы() + + ПодключенныеТипы = Новый Массив(); + Для Каждого ИмяФайла Из НайтиФайлыБенчмарков() Цикл + Тип = Бенчмаркинг.ПодключитьКласс(ИмяФайла); + Если Не Тип = Неопределено Тогда + ПодключенныеТипы.Добавить(Тип); КонецЕсли; КонецЦикла; - Возврат Каталоги; + Возврат ПодключенныеТипы; КонецФункции -Функция ФайлыБенчмарков() +Функция НайтиФайлыБенчмарков() Файлы = Новый Массив(); Для Каждого ИмяФайла Из _МассивФайлов Цикл - Если Не ФС.КаталогСуществует(ИмяФайла) Тогда - Файлы.Добавить(ПолноеИмяФайлаСценария(ИмяФайла)); + Если ФС.КаталогСуществует(ИмяФайла) Тогда + НайденныеФайлы = НайтиФайлы(ИмяФайла, , _Рекурсивно); + Для Каждого ИмяФайлаВКаталоге Из НайденныеФайлы Цикл + Если Файлы.Найти(ИмяФайлаВКаталоге) = Неопределено Тогда + Файлы.Добавить(ИмяФайлаВКаталоге); + КонецЕсли; + КонецЦикла; + Иначе + ПолноеИмяФайла = ПолноеИмяФайлаСценария(ИмяФайла); + Если Файлы.Найти(ПолноеИмяФайла) = Неопределено Тогда + Файлы.Добавить(ПолноеИмяФайла); + КонецЕсли; КонецЕсли; КонецЦикла; @@ -131,11 +167,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..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" @@ -1,21 +1,47 @@ #Использовать delegate +#Использовать validate +#Использовать reflector +#Использовать "../../dto" +&Сериализуемое("Type") +&Тип("Тип") +&Заполнено Перем _Тип; // Тип - Класс бенчмарков + +&Сериализуемое("Method") +&Тип("Строка") +&Заполнено Перем _Метод; // Строка - Метод бенчмарка + +&Сериализуемое("IsBaseline") +&Тип("Булево") Перем _ЭтоЭталон; // Булево + +&Сериализуемое("Category") +&Тип("Строка") Перем _Категория; // Строка -Перем _НаборыПараметров; // Массив из Массив из ПараметрБенчмарка -Перем _ИменаПараметров; // Массив из Строка + +&Сериализуемое("ParameterSets") +&Тип("Массив") +&ДляКаждого +&Тип("ПараметрыМетодаБенчмарка") +Перем _НаборыПараметров; // Массив из ПараметрыМетодаБенчмарка + +&Сериализуемое("ParameterSources") +&Тип("Массив") Перем _ИсточникиПараметров; // Массив из Строка, Делегат +&Несериализуемое +Перем _ИменаПараметров; // Массив из Строка + #Область Конструктор // Дескриптор бенчмарка // // Параметры: -// Объект - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// Объект - Произвольный - Тип или экземпляр класса бенчмарков // Метод - Строка - Метод бенчмарка -Процедура ПриСозданииОбъекта(Объект, Метод) +Процедура ПриСозданииОбъекта(Объект = Неопределено, Метод = "") _Тип = ?(ТипЗнч(Объект) = Тип("Тип"), Объект, ТипЗнч(Объект)); _Метод = Метод; @@ -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..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 @@ Тип = _ДескрипторыБенчмарков.ПолучитьПервый().ТипОбъекта(); ИмяФайлаИсполняющейСреды = ИмяФайлаИсполняющейСреды(Версия); ИмяФайлаТочкиВхода = ТочкаВходаКонсольногоПриложения(); - ИмяФайлаКонфигурации = ПолучитьИмяФайлаКонфигурацииДляПроцесса(Конфигурация); + ИмяФайлаКонфигурации = ЗаписатьНастройкиВФайл(_ДескрипторыБенчмарков, Конфигурация); ИмяФайлаТипа = Новый РасширениеТипа(Тип).Источник; КаталогБиблиотек = ИсполняющаяСредаБенчмарков.КаталогБиблиотек(); @@ -193,8 +193,8 @@ // --worker СтрокаКоманды.Добавить("--worker"); - // --config - СтрокаКоманды.Добавить("--config"); + // --settings + СтрокаКоманды.Добавить("--settings"); СтрокаКоманды.Добавить(ОбернутьВКавычки(ИмяФайлаКонфигурации)); // FILE @@ -238,12 +238,12 @@ КонецФункции -Функция ПолучитьИмяФайлаКонфигурацииДляПроцесса(Конфигурация) +Функция ЗаписатьНастройкиВФайл(ДескрипторыБенчмарков, Конфигурация) ПутьКФайлу = _МенеджерВременныхФайлов.СоздатьФайл("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..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,17 +1,22 @@ #Использовать fluent +&Сериализуемое("Items") +&Тип("Массив") +&ДляКаждого +&Тип("ДескрипторБенчмарка") Перем _ДескрипторыБенчмарков; // Массив из ДескрипторБенчмарка // Коллекция дескрипторов бенчмарков // // Параметры: -// ИсточникБенчмарков - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// ИсточникБенчмарков - Произвольный - Тип или экземпляр класса бенчмарков, +// откуда будут прочитаны дескрипторы Процедура ПриСозданииОбъекта(ИсточникБенчмарков = Неопределено) Экспорт _ДескрипторыБенчмарков = Новый Массив(); Если Не ИсточникБенчмарков = Неопределено Тогда - ИзвлекательДескрипторовБенчмарков.Извлечь(ИсточникБенчмарков, ЭтотОбъект); + Прочитать(ИсточникБенчмарков); КонецЕсли; КонецПроцедуры @@ -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 bae77c0..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" @@ -1,71 +1,146 @@ #Использовать asserts #Использовать delegate +#Использовать validate +#Использовать reflector +&Сериализуемое("Strategy") +&Тип("Строка") +&Геттер("Стратегия") Перем _Стратегия; // см. СтратегииЗапускаБенчмарка -Перем _СтратегияПоУмолчанию; // см. СтратегииЗапускаБенчмарка + +&Сериализуемое("IterationCount") +&Тип("Число") +&Геттер("КоличествоИтераций") Перем _КоличествоИтераций; // Число -Перем _КоличествоИтерацийПоУмолчанию; // Число + +&Сериализуемое("InvocationCount") +&Тип("Число") +&Геттер("КоличествоВызововЗаИтерацию") Перем _КоличествоВызововЗаИтерацию; // Число -Перем _КоличествоВызововЗаИтерациюПоУмолчанию; // Число + +&Сериализуемое("WarmupCount") +&Тип("Число") +&Геттер("КоличествоПрогревочныхИтераций") Перем _КоличествоПрогревочныхИтераций; // Число -Перем _КоличествоПрогревочныхИтерацийПоУмолчанию; // Число + +&Сериализуемое("MinIterationTime") +&Тип("Число") +&Геттер("МинимальноеВремяИтерации") Перем _МинимальноеВремяИтерации; // Число - мс -Перем _МинимальноеВремяИтерацииПоУмолчанию; // Число - мс + +&Сериализуемое("MinInvocationCount") +&Тип("Число") +&Геттер("МинимальноеКоличествоВызововЗаИтерацию") Перем _МинимальноеКоличествоВызововЗаИтерацию; // Число -Перем _МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию; // Число + +&Сериализуемое("ReportSorting") +&Тип("Строка") +&Геттер("СортировкаОтчета") Перем _СортировкаОтчета; // см. СортировкиОтчетаБенчмарков -Перем _СортировкаОтчетаПоУмолчанию; // см. СортировкиОтчетаБенчмарков + +&Сериализуемое("Memory") +&Тип("Булево") +&Геттер("ТребуетсяМониторингПамяти") Перем _ТребуетсяМониторингПамяти; // Булево -Перем _ТребуетсяМониторингПамятиПоУмолчанию; // Булево + +&Сериализуемое("ArtifactsDirectory") +&Тип("Строка") +&Геттер("КаталогАртефактов") Перем _КаталогАртефактов; // Строка -Перем _КаталогАртефактовПоУмолчанию; // Строка + +&Сериализуемое("Parameters") +&Тип("Массив") +&ДляКаждого +&Тип("ПараметрБенчмарка") +&Геттер("Параметры") Перем _Параметры; // Массив из ПараметрБенчмарка + +&Сериализуемое("ParameterSources") +&СериализуемыйКлюч("ИмяПоля", "FieldName") +&СериализуемыйКлюч("Источник", "Source") +&Тип("ТаблицаЗначений") +&Геттер("ИсточникиПараметров") Перем _ИсточникиПараметров; // ТаблицаЗначений -Перем _Обработчики; // Соответствие + +&Сериализуемое("Handlers") +&СериализуемыйКлюч("Событие", "Event") +&СериализуемыйКлюч("Обработчик", "Handler") +&Тип("ТаблицаЗначений") +&Геттер("ОбработчикиСобытий") +Перем _Обработчики; // ТаблицаЗначений + +&Сериализуемое("Columns") +&Тип("Массив") +&Геттер("Колонки") Перем _Колонки; // Массив из Строка - см. КолонкиОтчетаБенчмарков -Перем _Экспортеры; // Массив из см. ЭкспортерыРезультатовБенчмарков + +&Несериализуемое +&Геттер("Экспортеры") +Перем _Экспортеры; // Массив из Произвольный - см. ЭкспортерыРезультатовБенчмарков + +&Сериализуемое("Exporters") +&Тип("Массив") +Перем _ЭкспортерыСериализуемое; // Массив из Строка + +&Сериализуемое("RuntimeVersions") +&СериализуемыйКлюч("Версия", "Version") +&СериализуемыйКлюч("Наименование", "Name") +&СериализуемыйКлюч("ЭтоЭталон", "IsBaseline") +&Тип("ТаблицаЗначений") +&Геттер("ВерсииИсполняющейСреды") Перем _ВерсииИсполняющейСреды; // ТаблицаЗначений +&Несериализуемое +Перем _ЗначенияПолейПоУмолчанию; // Соответствие + +&Несериализуемое Перем _МодифицированныеПоля; // Соответствие -Перем _Рефлектор; // Рефлектор, Неопределено + +&Несериализуемое +Перем _ОписанияПолей; // ТаблицаЗначений, Неопределено + +&Несериализуемое +Перем _Рефлектор; // Рефлектор #Область Конструктор // Конфигурация бенчмарков // // Параметры: -// ИсточникБенчмарков - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// ИсточникБенчмарков - Произвольный - Тип или экземпляр класса бенчмарков Процедура ПриСозданииОбъекта(ИсточникБенчмарков = Неопределено) - _СтратегияПоУмолчанию = СтратегииЗапускаБенчмарка.ПропускнаяСпособность; - _КоличествоИтерацийПоУмолчанию = 15; - _КоличествоВызововЗаИтерациюПоУмолчанию = 0; - _КоличествоПрогревочныхИтерацийПоУмолчанию = 6; - _МинимальноеВремяИтерацииПоУмолчанию = 100; - _МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию = 4; - _СортировкаОтчетаПоУмолчанию = СортировкиОтчетаБенчмарков.ПоУмолчанию; - _КаталогАртефактовПоУмолчанию = ".\BenchmarkArtifacts"; - _ТребуетсяМониторингПамятиПоУмолчанию = Ложь; + СтратегияПоУмолчанию = СтратегииЗапускаБенчмарка.ПропускнаяСпособность; + КоличествоИтерацийПоУмолчанию = 15; + КоличествоВызововЗаИтерациюПоУмолчанию = 0; + КоличествоПрогревочныхИтерацийПоУмолчанию = 6; + МинимальноеВремяИтерацииПоУмолчанию = 100; + МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию = 4; + СортировкаОтчетаПоУмолчанию = СортировкиОтчетаБенчмарков.ПоУмолчанию; + КаталогАртефактовПоУмолчанию = ".\BenchmarkArtifacts"; + ТребуетсяМониторингПамятиПоУмолчанию = Ложь; _Параметры = Новый Массив(); _ИсточникиПараметров = ПустаяТаблицаИсточникиПараметров(); - _Обработчики = Новый Соответствие(); + _Обработчики = ПустаяТаблицаОбработчикиСобытий(); _Колонки = Новый Массив(); _Экспортеры = Новый Массив(); - _МодифицированныеПоля = Новый Соответствие(); _ВерсииИсполняющейСреды = ПустаяТаблицаВерсииИсполняющейСреды(); - _ТребуетсяМониторингПамяти = _ТребуетсяМониторингПамятиПоУмолчанию; + _ТребуетсяМониторингПамяти = ТребуетсяМониторингПамятиПоУмолчанию; + _МодифицированныеПоля = Новый Соответствие(); + _Рефлектор = Новый Рефлектор(); - УстановитьСтратегию(_СтратегияПоУмолчанию); - УстановитьКоличествоИтераций(_КоличествоИтерацийПоУмолчанию); - УстановитьКоличествоВызововЗаИтерацию(_КоличествоВызововЗаИтерациюПоУмолчанию); - УстановитьКоличествоПрогревочныхИтераций(_КоличествоПрогревочныхИтерацийПоУмолчанию); - УстановитьМинимальноеВремяИтерации(_МинимальноеВремяИтерацииПоУмолчанию); - УстановитьМинимальноеКоличествоВызововЗаИтерацию(_МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию); - УстановитьСортировкуОтчета(_СортировкаОтчетаПоУмолчанию); - УстановитьКаталогАртефактов(_КаталогАртефактовПоУмолчанию); + УстановитьСтратегию(СтратегияПоУмолчанию); + УстановитьКоличествоИтераций(КоличествоИтерацийПоУмолчанию); + УстановитьКоличествоВызововЗаИтерацию(КоличествоВызововЗаИтерациюПоУмолчанию); + УстановитьКоличествоПрогревочныхИтераций(КоличествоПрогревочныхИтерацийПоУмолчанию); + УстановитьМинимальноеВремяИтерации(МинимальноеВремяИтерацииПоУмолчанию); + УстановитьМинимальноеКоличествоВызововЗаИтерацию(МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию); + УстановитьСортировкуОтчета(СортировкаОтчетаПоУмолчанию); + УстановитьКаталогАртефактов(КаталогАртефактовПоУмолчанию); _МодифицированныеПоля.Очистить(); + ЗапомнитьЗначенияПолейПоУмолчанию(); Если Не ИсточникБенчмарков = Неопределено Тогда ИзвлекательКонфигурацииБенчмарков.Извлечь(ИсточникБенчмарков, ЭтотОбъект); @@ -485,11 +560,15 @@ // ЭтотОбъект Функция ДобавитьОбработчикСобытия(ИмяСобытия, Обработчик) Экспорт - Если _Обработчики[ИмяСобытия] = Неопределено Тогда - _Обработчики[ИмяСобытия] = Новый Соответствие(); + Отбор = Новый Структура("Событие, Обработчик", ИмяСобытия, Обработчик); + Если _Обработчики.НайтиСтроки(Отбор).Количество() > 0 Тогда + Возврат ЭтотОбъект; КонецЕсли; - _Обработчики[ИмяСобытия][Обработчик] = Новый Структура("ЕстьПараметры"); + СтрокаТаблицы = _Обработчики.Добавить(); + СтрокаТаблицы.Событие = ИмяСобытия; + СтрокаТаблицы.Обработчик = Обработчик; + УстановитьМодифицированность(ИмяПоля_ОбработчикиСобытий()); Возврат ЭтотОбъект; @@ -505,9 +584,12 @@ // ЭтотОбъект Функция УдалитьОбработчикиСобытия(ИмяСобытия) Экспорт - Если Не _Обработчики[ИмяСобытия] = Неопределено Тогда - _Обработчики[ИмяСобытия].Очистить(); - КонецЕсли; + НайденныеСтроки = _Обработчики.НайтиСтроки(Новый Структура("Событие", ИмяСобытия)); + Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл + _Обработчики.Удалить(СтрокаТаблицы); + КонецЦикла; + + УстановитьМодифицированность(ИмяПоля_ОбработчикиСобытий()); Возврат ЭтотОбъект; @@ -534,26 +616,7 @@ // * Обработчик - Строка - Экспортный метод экземпляра класса бенчмарков // - Делегат - Делегат Функция ОбработчикиСобытий() Экспорт - - Результат = Новый ТаблицаЗначений(); - Результат.Колонки.Добавить("Событие"); - Результат.Колонки.Добавить("Обработчик"); - - Для Каждого ОбработчикиСобытия Из _Обработчики Цикл - - Событие = ОбработчикиСобытия.Ключ; - Обработчики = ОбработчикиСобытия.Значение; - - Для Каждого КлючЗначение Из Обработчики Цикл - СтрокаТаблицы = Результат.Добавить(); - СтрокаТаблицы.Событие = Событие; - СтрокаТаблицы.Обработчик = КлючЗначение.Ключ; - КонецЦикла; - - КонецЦикла; - - Возврат Результат; - + Возврат _Обработчики.Скопировать(); КонецФункции // Обработчики события @@ -568,13 +631,9 @@ Результат = Новый Массив(); - ОбработчикиСобытия = _Обработчики[ИмяСобытия]; - Если ОбработчикиСобытия = Неопределено Тогда - Возврат Результат; - КонецЕсли; - - Для Каждого Строка Из ОбработчикиСобытия Цикл - Результат.Добавить(Строка.Ключ); + НайденныеСтроки = _Обработчики.НайтиСтроки(Новый Структура("Событие", ИмяСобытия)); + Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл + Результат.Добавить(СтрокаТаблицы.Обработчик); КонецЦикла; Возврат Результат; @@ -594,23 +653,12 @@ МассивДелегатов = Новый Массив(); - ОбработчикиСобытия = _Обработчики[ИмяСобытия]; - Если ОбработчикиСобытия = Неопределено Тогда - Возврат МассивДелегатов; - КонецЕсли; - - Для Каждого Строка Из ОбработчикиСобытия Цикл + НайденныеСтроки = _Обработчики.НайтиСтроки(Новый Структура("Событие", ИмяСобытия)); + Для Каждого СтрокаТаблицы Из НайденныеСтроки Цикл - Обработчик = Строка.Ключ; - Описание = Строка.Значение; + Делегат = ДелегатОбработчика(СтрокаТаблицы.Обработчик, ОбъектБенчмарков); - Делегат = ДелегатОбработчика(Обработчик, ОбъектБенчмарков); - - Если Описание.ЕстьПараметры = Неопределено Тогда - Описание.ЕстьПараметры = ЕстьПараметрыМетода(Делегат); - КонецЕсли; - - Если Описание.ЕстьПараметры Тогда + Если ЕстьПараметрыМетода(Делегат) Тогда Делегат.УстановитьПараметры(Контекст); КонецЕсли; @@ -653,6 +701,7 @@ Инд = _Колонки.Найти(Колонка); Если Не Инд = Неопределено Тогда _Колонки.Удалить(Инд); + УстановитьМодифицированность(ИмяПоля_Колонки()); КонецЕсли; Возврат ЭтотОбъект; @@ -923,23 +972,13 @@ Таблица.Колонки.Добавить("Значение"); Таблица.Колонки.Добавить("Модифицирован", Новый ОписаниеТипов("Булево")); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Стратегия(), Стратегия()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоИтераций(), КоличествоИтераций()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоВызововЗаИтерацию(), КоличествоВызововЗаИтерацию()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоПрогревочныхИтераций(), КоличествоПрогревочныхИтераций()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_МинимальноеВремяИтерации(), МинимальноеВремяИтерации()); - ДобавитьСтрокуВТаблицу( - Таблица, ИмяПоля_МинимальноеКоличествоВызововЗаИтерацию(), МинимальноеКоличествоВызововЗаИтерацию()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_СортировкаОтчета(), СортировкаОтчета()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КаталогАртефактов(), КаталогАртефактов()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ТребуетсяМониторингПамяти(), ТребуетсяМониторингПамяти()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Параметры(), Параметры()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ИсточникиПараметров(), ИсточникиПараметров()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ОбработчикиСобытий(), ОбработчикиСобытий()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Колонки(), Колонки()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Экспортеры(), Экспортеры()); - ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ВерсииИсполняющейСреды(), ВерсииИсполняющейСреды()); - + Для Каждого ОписаниеПоля Из ОписанияПолей() Цикл + СтрокаТаблицы = Таблица.Добавить(); + СтрокаТаблицы.Имя = ОписаниеПоля.Имя; + СтрокаТаблицы.Значение = ОписаниеПоля.Геттер.Исполнить(); + СтрокаТаблицы.Модифицирован = _МодифицированныеПоля[ОписаниеПоля.Имя]; + КонецЦикла; + Возврат Таблица; КонецФункции @@ -989,6 +1028,26 @@ #КонецОбласти +#Область Сериализация + +Процедура ПередСериализацией() Экспорт + + ПроверитьОбработчикиСобытийПередСериализацией(); + ПроверитьИсточникиПараметровПередСериализацией(); + ОбработатьЭкспортерыПередСериализацией(); + +КонецПроцедуры + +Процедура ПослеДесериализации() Экспорт + + ОбработатьЭкспортерыПослеДесериализации(); + ОпределитьМодифицированныеПоля(); + Валидировать(); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1013,15 +1072,67 @@ КонецФункции -Функция ДобавитьСтрокуВТаблицу(Таблица, Имя, Значение) +Процедура ОпределитьМодифицированныеПоля() - Строка = Таблица.Добавить(); - Строка.Имя = Имя; - Строка.Значение = Значение; - Строка.Модифицирован = _МодифицированныеПоля[Имя]; + Для Каждого ОписаниеПоля Из ОписанияПолей() Цикл + Значение = _Рефлектор.ПолучитьСвойство(ЭтотОбъект, ОписаниеПоля.ИмяВнутреннее); + ЗначениеПоУмолчанию = _ЗначенияПолейПоУмолчанию[ОписаниеПоля.Имя]; - Возврат Строка; + Если Не Компаратор.Совпадают(Значение, ЗначениеПоУмолчанию) Тогда + УстановитьМодифицированность(ОписаниеПоля.Имя); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ЗапомнитьЗначенияПолейПоУмолчанию() + + _ЗначенияПолейПоУмолчанию = Новый Соответствие(); + + Для Каждого ОписаниеПоля Из ОписанияПолей() Цикл + _ЗначенияПолейПоУмолчанию[ОписаниеПоля.Имя] = _Рефлектор.ПолучитьСвойство(ЭтотОбъект, ОписаниеПоля.ИмяВнутреннее); + КонецЦикла; + +КонецПроцедуры +Функция ОписанияПолей() + + Если Не _ОписанияПолей = Неопределено Тогда + Возврат _ОписанияПолей; + КонецЕсли; + + _ОписанияПолей = Новый ТаблицаЗначений(); + _ОписанияПолей.Колонки.Добавить("Имя"); + _ОписанияПолей.Колонки.Добавить("ИмяВнутреннее"); + _ОписанияПолей.Колонки.Добавить("Геттер"); + + СвойстваОбъекта = _Рефлектор.ПолучитьТаблицуСвойств(ЭтотОбъект, Истина); + + Для Каждого Свойство Из СвойстваОбъекта Цикл + ИмяПоля = Сред(Свойство.Имя, 2); + + АннотацияГеттер = РаботаСАннотациями.ПолучитьАннотацию(Свойство, "Геттер"); + Если АннотацияГеттер = Неопределено Тогда + Продолжить; + КонецЕсли; + + Геттер = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияГеттер, "Значение", Свойство.Имя); + + ОписаниеПоля = _ОписанияПолей.Добавить(); + ОписаниеПоля.Имя = ИмяПоля; + ОписаниеПоля.ИмяВнутреннее = Свойство.Имя; + ОписаниеПоля.Геттер = Новый Делегат(ЭтотОбъект, Геттер); + КонецЦикла; + + Возврат _ОписанияПолей; + +КонецФункции + +Функция ПустаяТаблицаОбработчикиСобытий() + Таблица = Новый ТаблицаЗначений(); + Таблица.Колонки.Добавить("Событие"); + Таблица.Колонки.Добавить("Обработчик"); + Возврат Таблица; КонецФункции Функция ПустаяТаблицаВерсииИсполняющейСреды() @@ -1039,18 +1150,69 @@ Возврат Таблица; КонецФункции -#Область Модифицированность +#Область Сериализация + +Процедура ПроверитьОбработчикиСобытийПередСериализацией() Экспорт + + Для Каждого Строка Из _Обработчики Цикл + Тип = ТипЗнч(Строка.Обработчик); + Если Тип <> Тип("Строка") Тогда + ВызватьИсключение СтрШаблон("Обработчик события типа <%1> не поддерживает сериализацию.", Тип); + КонецЕсли; + КонецЦикла; -Процедура УстановитьМодифицированность(ИмяПоля_) - _МодифицированныеПоля[ИмяПоля_] = Истина; КонецПроцедуры -Процедура ПрименитьМодифицированноеПоле(ИмяПоля, МетодУстановки, ЗначенияМодифицированныхПолей) +Процедура ПроверитьИсточникиПараметровПередСериализацией() + + Для Каждого ИсточникПараметров Из _ИсточникиПараметров Цикл + Тип = ТипЗнч(ИсточникПараметров.Источник); + Если Тип <> Тип("Строка") Тогда + ВызватьИсключение СтрШаблон("Источник параметров типа <%1> не поддерживает сериализацию.", Тип); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ОбработатьЭкспортерыПередСериализацией() + + _ЭкспортерыСериализуемое = Новый Массив; + + Для Каждого Экспортер Из _Экспортеры Цикл + _ЭкспортерыСериализуемое.Добавить(Строка(ТипЗнч(Экспортер))); + КонецЦикла; + +КонецПроцедуры + +Процедура ОбработатьЭкспортерыПослеДесериализации() + + Для Каждого СтрокаТип Из _ЭкспортерыСериализуемое Цикл + ДобавитьЭкспортер(Новый(СтрокаТип)); + КонецЦикла; - Если _Рефлектор = Неопределено Тогда - _Рефлектор = Новый Рефлектор(); +КонецПроцедуры + +Процедура Валидировать() + + Валидатор = Новый Валидатор; + + Результат = Валидатор.Валидировать(ЭтотОбъект); + Если Результат.Количество() > 0 Тогда + ВызватьИсключение Валидатор.ОписаниеОшибокВалидации(Результат); КонецЕсли; +КонецПроцедуры + +#КонецОбласти + +#Область Модифицированность + +Процедура УстановитьМодифицированность(ИмяПоля) + _МодифицированныеПоля[ИмяПоля] = Истина; +КонецПроцедуры + +Процедура ПрименитьМодифицированноеПоле(ИмяПоля, МетодУстановки, ЗначенияМодифицированныхПолей) + Если Не ЗначенияМодифицированныхПолей[ИмяПоля] = Неопределено Тогда Параметры = Новый Массив(); @@ -1195,7 +1357,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..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,10 +1,15 @@ // 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" new file mode 100644 index 0000000..e17ab6b --- /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 + +&Сериализуемое("Items") +&Тип("Массив") +&ДляКаждого +&Тип("ПараметрБенчмарка") +Перем _Параметры; // Массив из ПараметрБенчмарка + +Процедура ПриСозданииОбъекта() + _Параметры = Новый Массив(); +КонецПроцедуры + +// Добавляет параметр бенчмарка в коллекцию +// +// Параметры: +// Параметр - ПараметрБенчмарка +Процедура Добавить(Параметр) Экспорт + + Ожидаем.Что(Параметр).ИмеетТип("ПараметрБенчмарка"); + Ожидаем.Что(Параметр.ЭтоПараметрМетода).ЭтоИстина(); + + _Параметры.Добавить(Параметр); + +КонецПроцедуры + +// Возвращает количество параметров +// +// Возвращаемое значение: +// Число +Функция Количество() Экспорт + Возврат _Параметры.Количество(); +КонецФункции + +// Возвращает параметр метода по индексу +// +// Параметры: +// Индекс - Число +// +// Возвращаемое значение: +// ПараметрБенчмарка +Функция Получить(Индекс) Экспорт + Возврат _Параметры[Индекс]; +КонецФункции + +// Возвращает массив параметров +// +// Возвращаемое значение: +// Массив из ПараметрБенчмарка +Функция ВМассив() Экспорт + Возврат Новый Массив(Новый ФиксированныйМассив(_Параметры)); +КонецФункции \ 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\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" new file mode 100644 index 0000000..5fb9a56 --- /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\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" @@ -0,0 +1,65 @@ +#Использовать logos +#Использовать "../../dto" +#Использовать "../../jason" + +Перем _Лог; // Лог + +// Сериализатор настроек бенчмарков +Процедура ПриСозданииОбъекта() + _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.СериализаторНастроекБенчмарков"); +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Сериализует настройки бенчмарков в JSON-файл +// +// Параметры: +// Дескрипторы - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов бенчмарков +// Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков +// ИмяФайла - Строка - Имя файла, в который будет записана конфигурация +Процедура ЗаписатьВJson(Дескрипторы, Конфигурация, ИмяФайла) Экспорт + + _Лог.Отладка("Начало формирования файла: %1", ИмяФайла); + + ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб); + + Сериализатор = Новый СериализаторJsonBench(); + + Настройки = Новый НастройкиБенчмарковДто(); + Настройки.ДескрипторыБенчмарков = Дескрипторы; + Настройки.Конфигурация = Конфигурация; + + ЗаписьJSON = Новый ЗаписьJSON(); + ЗаписьJSON.ОткрытьФайл(ИмяФайла, "UTF-8", , ПараметрыЗаписиJSON); + ЗаписьJSON.ЗаписатьБезОбработки(Сериализатор.Сериализовать(Настройки)); + ЗаписьJSON.Закрыть(); + + _Лог.Отладка("Завершение формирования файла: %1", ИмяФайла); + +КонецПроцедуры + +// Десериализует настройки бенчмарков из JSON-файла +// +// Параметры: +// ИмяФайла - Строка - Имя файла, из которого будет прочитана конфигурация. +// +// Возвращаемое значение: +// НастройкиБенчмарковДто +Функция ПрочитатьИзJson(ИмяФайла) Экспорт + + _Лог.Отладка("Начало чтения файла: %1", ИмяФайла); + + ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, "UTF-8"); + Строка = ЧтениеТекста.Прочитать(); + ЧтениеТекста.Закрыть(); + + Десериализатор = Новый ДесериализаторJsonBench(); + Настройки = Десериализатор.Десериализовать(Строка, Тип("НастройкиБенчмарковДто")); + + _Лог.Отладка("Завершение чтения файла: %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\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..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" @@ -1,11 +1,12 @@ #Использовать annotations +#Использовать reflector #Область ПрограммныйИнтерфейс // Извлекает конфигурацию бенчмарков // // Параметры: -// ИсточникБенчмарков - Тип, Произвольный - Тип или экземпляр класса бенчмарков +// ИсточникБенчмарков - Произвольный - Тип или экземпляр класса бенчмарков // Конфигурация - КонфигурацияБенчмарков - Конфигурация, в которую будут записаны данные // // Возвращаемое значение: @@ -33,13 +34,13 @@ ПрочитатьАннотациюМинимальноеКоличествоВызововЗаИтерацию(СвойстваКонструктора, КонфигурацияБенчмарков); ПрочитатьАннотациюСортировка(СвойстваКонструктора, КонфигурацияБенчмарков); ПрочитатьАннотациюМониторингПамяти(СвойстваКонструктора, КонфигурацияБенчмарков); - ПрочитатьАннотацииКолонок(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюКаталогАртефактов(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортMarkdown(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортJson(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортXml(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюЭкспортHtml(СвойстваКонструктора, Конфигурация); - ПрочитатьАннотациюИсполняющаяСреда(СвойстваКонструктора, Конфигурация); + ПрочитатьАннотацииКолонок(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюКаталогАртефактов(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортMarkdown(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортJson(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортXml(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюЭкспортHtml(СвойстваКонструктора, КонфигурацияБенчмарков); + ПрочитатьАннотациюИсполняющаяСреда(СвойстваКонструктора, КонфигурацияБенчмарков); КонецЕсли; Для Каждого СвойстваПоля Из ТаблицаСвойств Цикл @@ -47,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\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/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..7c76283 --- /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/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..600a431 --- /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,14 @@ +// BSLLS:ExportVariables-off + +&Сериализуемое("BenchmarkDescriptors") +&Тип("КоллекцияДескрипторовБенчмарков") +Перем ДескрипторыБенчмарков Экспорт; // КоллекцияДескрипторовБенчмарков + +&Сериализуемое("Configuration") +&Тип("КонфигурацияБенчмарков") +Перем Конфигурация Экспорт; // КонфигурацияБенчмарков + +Процедура ПриСозданииОбъекта() + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(); + Конфигурация = Новый КонфигурацияБенчмарков(); +КонецПроцедуры \ 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\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" new file mode 100644 index 0000000..97021d7 --- /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,302 @@ +// 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' не соответствует ожидаемому типу '%2'", ТипЗнч(ЗначениеСвойства), ТипСвойства); + Продолжить; + КонецЕсли; + + Рефлектор.УстановитьСвойство(Результат, ИмяСвойства, ЗначениеСвойства); + + КонецЦикла; + + Если Рефлектор.МетодСуществует(Результат, "ПослеДесериализации") Тогда + Результат.ПослеДесериализации(); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьТипыСвойства(Свойство, ЗначениеСвойства) + + ОписаниеСвойства = Новый Структура(); + ОписаниеСвойства.Вставить("БазовыйТип", ТипЗнч(ЗначениеСвойства)); + ОписаниеСвойства.Вставить("ТипЭлементов"); + + КонтейнерАннотаций = Новый КонтейнерАннотаций; + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияТип")); + КонтейнерАннотаций.ДобавитьАннотацию(Тип("АннотацияДляКаждого")); + + ТекущийРежимДляКаждого = Неопределено; + + Для Каждого Аннотация Из Свойство.Аннотации Цикл + + ОпределениеАннотации = КонтейнерАннотаций.ПолучитьОпределениеАннотации(Аннотация.Имя); + Если ОпределениеАннотации = Неопределено Тогда + Продолжить; + КонецЕсли; + + ОбъектАннотации = ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация); + + // Директива &ДляКаждого - переключает режим обхода + Если ТипЗнч(ОбъектАннотации) = Тип("АннотацияДляКаждого") Тогда + + ТекущийРежимДляКаждого = ОбъектАннотации.Режим(); + + ИначеЕсли ТипЗнч(ОбъектАннотации) = Тип("АннотацияТип") Тогда + + ТипСвойства = ОбъектАннотации.ТипЗначения(); + + Если ТекущийРежимДляКаждого = Неопределено Тогда + ОписаниеСвойства.БазовыйТип = ТипСвойства; + ИначеЕсли ТекущийРежимДляКаждого = "Значение" Тогда + ОписаниеСвойства.ТипЭлементов = ТипСвойства; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Возврат ОписаниеСвойства; + +КонецФункции + +Функция ПолучитьДесериализуемыеКлючи(СвойствоОбъекта) + + ДесериализуемыеКлючи = Новый Структура(); + + АннотацииСериализуемыеКлючи = РаботаСАннотациями.НайтиАннотации(СвойствоОбъекта.Аннотации, "СериализуемыйКлюч"); + Для Каждого Аннотация Из АннотацииСериализуемыеКлючи Цикл + КоличествоПараметров = Аннотация.Параметры.Количество(); + Если КоличествоПараметров > 1 Тогда + ДесериализуемыеКлючи.Вставить(Аннотация.Параметры[1].Значение, Аннотация.Параметры[0].Значение); + КонецЕсли; + КонецЦикла; + + Возврат ДесериализуемыеКлючи; + +КонецФункции + +#КонецОбласти + +Процедура ПриСозданииОбъекта() + + Лог = Логирование.ПолучитьЛог("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..5289e6d --- /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,232 @@ +// Copyright © 2025 Nikita Fedkin (nixel2007@gmail.com). +// Адаптированная версия библиотеки jason (https://github.com/nixel2007/jason) + +#Использовать annotations +#Использовать logos +#Использовать collectionos + +#Область ОписаниеПеременных + +// Лог +// +Перем Лог; + +// Рефлектор +// +Перем Рефлектор; + +// Множество - список известных пользовательских типов +// +Перем КэшИзвестныхТипов; + +// Множество - список примитивных типов +// +Перем ПримитивныеТипы; + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Сериализация объекта в JSON-строку. +// +// Параметры: +// Объект - Произвольный - Сериализуемый объект. Поддерживаются пользовательские классы, +// коллекции и примитивы. +// Возвращаемое значение: +// Строка +// +Функция Сериализовать(Объект) Экспорт + ОбъектСериализации = ПреобразоватьОбъектСериализации(Объект); + + Запись = Новый ЗаписьJSON; + Запись.УстановитьСтроку(); + ЗаписатьJSON(Запись, ОбъектСериализации); + + Возврат Запись.Закрыть(); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПреобразоватьОбъектСериализации(Объект, СериализуемыеКлючи = Неопределено) + + ТипОбъекта = ТипЗнч(Объект); + + Если ТипОбъекта = Тип("Массив") Тогда + Результат = ПреобразоватьМассив(Объект); + ИначеЕсли ТипОбъекта = Тип("Структура") ИЛИ ТипОбъекта = Тип("Соответствие") Тогда + Результат = ПреобразоватьСтруктуру(Объект); + ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда + Результат = ПреобразоватьТаблицуЗначений(Объект, СериализуемыеКлючи); + ИначеЕсли ЭтоПримитивныйТип(ТипОбъекта) Тогда + Результат = ПреобразоватьПримитивныйТип(Объект); + ИначеЕсли ТипОбъекта = Тип("Тип") Тогда + Результат = ПреобразоватьТип(Объект); + Иначе + Результат = ПреобразоватьКомплексныйТип(Объект); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ЭтоПримитивныйТип(ТипОбъекта) + Возврат ПримитивныеТипы.Содержит(ТипОбъекта); +КонецФункции + +Функция ПреобразоватьМассив(Массив) + Результат = Новый Массив; + + Для Каждого Элемент Из Массив Цикл + ПреобразованныйЭлемент = ПреобразоватьОбъектСериализации(Элемент); + Результат.Добавить(ПреобразованныйЭлемент); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция ПреобразоватьСтруктуру(Структура) Экспорт + Результат = Новый Соответствие(); + + Для Каждого Элемент Из Структура Цикл + ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(Элемент.Значение); + Результат.Вставить(Элемент.Ключ, ПреобразованноеЗначение); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений, СериализуемыеКлючи = Неопределено) Экспорт + + Результат = Новый Массив(); + + Если СериализуемыеКлючи = Неопределено Тогда + СериализуемыеКлючи = Новый Структура(); + КонецЕсли; + + СериализоватьВсеКолонки = СериализуемыеКлючи.Количество() = 0; + + Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл + + ЗначенияКолонок = Новый Структура(); + + Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл + + Если СериализуемыеКлючи.Свойство(Колонка.Имя) Тогда + ИмяКлюча = СериализуемыеКлючи[Колонка.Имя]; + ИначеЕсли СериализоватьВсеКолонки Тогда + ИмяКлюча = Колонка.Имя; + Иначе + Продолжить; + КонецЕсли; + + ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]); + ЗначенияКолонок.Вставить(ИмяКлюча, ПреобразованноеЗначение); + + КонецЦикла; + + Результат.Добавить(ЗначенияКолонок); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПреобразоватьПримитивныйТип(Объект) Экспорт + Возврат Объект; +КонецФункции + +Функция ПреобразоватьТип(Объект) Экспорт + Возврат Строка(Объект); +КонецФункции + +Функция ПреобразоватьКомплексныйТип(Объект) Экспорт + + ТипОбъекта = ТипЗнч(Объект); + + ЭтоПользовательскийТип = КэшИзвестныхТипов.Содержит(ТипОбъекта); + + Если НЕ ЭтоПользовательскийТип Тогда + Лог.Предупреждение("Неизвестный тип объекта для преобразования: %1", ТипОбъекта); + Возврат Неопределено; + КонецЕсли; + + Результат = Новый Соответствие(); + + СвойстваОбъекта = Рефлектор.ПолучитьТаблицуСвойств(ТипОбъекта, Истина); + + Если Рефлектор.МетодСуществует(Объект, "ПередСериализацией") Тогда + Объект.ПередСериализацией(); + КонецЕсли; + + Для Каждого СвойствоОбъекта Из СвойстваОбъекта Цикл + // Проверяем, не помечено ли поле как несериализуемое + Несериализуемое = РаботаСАннотациями.НайтиАннотацию(СвойствоОбъекта.Аннотации, "Несериализуемое"); + Если Несериализуемое <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Обязательное = Ложь; + ИмяСвойства = СвойствоОбъекта.Имя; + АннотацияСериализуемое = РаботаСАннотациями.НайтиАннотацию(СвойствоОбъекта.Аннотации, "Сериализуемое"); + Если АннотацияСериализуемое <> Неопределено Тогда + ИмяСвойства = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Значение", СвойствоОбъекта.Имя); + Обязательное = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(АннотацияСериализуемое, "Обязательное", Обязательное); + КонецЕсли; + + СериализуемыеКлючи = ПолучитьСериализуемыеКлючи(СвойствоОбъекта); + + ЗначениеСвойства = Рефлектор.ПолучитьСвойство(Объект, СвойствоОбъекта.Имя); + ЗначениеСвойства = ПреобразоватьОбъектСериализации(ЗначениеСвойства, СериализуемыеКлючи); + Если Обязательное ИЛИ ЗначениеСвойства <> Неопределено Тогда + Результат.Вставить(ИмяСвойства, ЗначениеСвойства); + КонецЕсли; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьСериализуемыеКлючи(СвойствоОбъекта) + + СериализуемыеКлючи = Новый Структура(); + + АннотацииСериализуемыеКлючи = РаботаСАннотациями.НайтиАннотации(СвойствоОбъекта.Аннотации, "СериализуемыйКлюч"); + Для Каждого Аннотация Из АннотацииСериализуемыеКлючи Цикл + КоличествоПараметров = Аннотация.Параметры.Количество(); + Если КоличествоПараметров = 1 Тогда + СериализуемыеКлючи.Вставить(Аннотация.Параметры[0].Значение, Аннотация.Параметры[0].Значение); + ИначеЕсли КоличествоПараметров > 1 Тогда + СериализуемыеКлючи.Вставить(Аннотация.Параметры[0].Значение, Аннотация.Параметры[1].Значение); + КонецЕсли; + КонецЦикла; + + Возврат СериализуемыеКлючи; + +КонецФункции + +#КонецОбласти + +Процедура ПриСозданииОбъекта() + + Рефлектор = Новый Рефлектор(); + Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.jason.СериализаторJson"); + + КэшИзвестныхТипов = Новый МножествоСоответствие; + ИзвестныеТипы = Рефлектор.ИзвестныеТипы(Новый Структура("Пользовательский", Истина)); + Для Каждого ИзвестныйТип Из ИзвестныеТипы Цикл + КэшИзвестныхТипов.Добавить(ИзвестныйТип.Значение); + КонецЦикла; + + ПримитивныеТипы = Новый МножествоСоответствие; + ПримитивныеТипы.Добавить(Тип("Строка")); + ПримитивныеТипы.Добавить(Тип("Булево")); + ПримитивныеТипы.Добавить(Тип("Дата")); + ПримитивныеТипы.Добавить(Тип("Число")); + ПримитивныеТипы.Добавить(Тип("Null")); + ПримитивныеТипы.Добавить(Тип("Неопределено")); + +КонецПроцедуры \ No newline at end of file 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 5a40d0f..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" @@ -3,28 +3,15 @@ #Использовать asserts #Использовать fluent -#Использовать tempfiles #Использовать "helpers" -Перем МенеджерВременныхФайлов; // МенеджерВременныхФайлов - -&Инициализация -Процедура ПередВсеми() Экспорт - МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); -КонецПроцедуры - -&Завершение -Процедура ПослеВсех() Экспорт - МенеджерВременныхФайлов.Удалить(); -КонецПроцедуры - &Тест Процедура Тест_АннотацииКонфигурации() Экспорт Тип = Тип("БенчмаркСАннотациямиКонфигурации"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); - ПроверитьКонфигурациюБенчмаркСАннотациямиКонфигурации(Конфигурация); + ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации(Конфигурация); КонецПроцедуры @@ -758,23 +745,7 @@ КонецПроцедуры -&Тест -Процедура Тест_ДолженПроверитьСериализациюКонфигурацииJson() Экспорт - - Тип = Тип("БенчмаркСАннотациямиКонфигурации"); - Конфигурация = Новый КонфигурацияБенчмарков(Тип); - - ИмяФайла = МенеджерВременныхФайлов.НовоеИмяФайла(); - - Сериализатор = Новый СериализаторКонфигурацииБенчмарков(); - Сериализатор.СериализоватьВJSON(Конфигурация, ИмяФайла); - КонфигурацияПрочитанная = Сериализатор.ДесериализоватьИзJSON(ИмяФайла); - - ПроверитьКонфигурациюБенчмаркСАннотациямиКонфигурации(КонфигурацияПрочитанная); - -КонецПроцедуры - -Процедура ПроверитьКонфигурациюБенчмаркСАннотациямиКонфигурации(Конфигурация) +Процедура ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации(Конфигурация) Экспортеры = Конфигурация.Экспортеры(); КоллекцияЭкспортеры = ПроцессорыКоллекций.ИзКоллекции(Экспортеры); @@ -812,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" new file mode 100644 index 0000000..dd7bec1 --- /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,106 @@ +// 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], "Параметры").ИмеетТип("ПараметрБенчмарка"); + Ожидаем.Что(Параметры[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