From 25afedb8f4297beb9b577ad3e7192dad41d89090 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 7 Mar 2026 02:36:22 +0300 Subject: [PATCH 01/11] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE=20=D1=81=D0=BE=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=B1=D0=B5?= =?UTF-8?q?=D0=BD=D1=87=D0=BC=D0=B0=D1=80=D0=BA=D0=BE=D0=B2=20=D1=81=20?= =?UTF-8?q?=D1=8D=D1=82=D0=B0=D0=BB=D0=BE=D0=BD=D0=BD=D1=8B=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=B5=D0=B9=D1=81=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\261\321\213\321\202\320\270\320\271.md" | 10 +- ...20\267\320\260\321\206\320\270\321\217.md" | 4 +- ...20\275\320\265\320\275\320\270\321\217.md" | 14 +- ...20\260\320\273\320\276\320\275\321\213.md" | 2 +- ...1\201\320\270\321\217\321\205OneScript.os" | 4 +- ...20\265\321\202\321\200\320\276\320\262.os" | 6 +- ...20\260\320\266\320\264\321\213\320\274.os" | 3 +- ...20\265\320\222\321\201\320\265\321\205.os" | 8 +- ...20\266\320\264\320\276\320\263\320\276.os" | 5 +- ...20\277\321\203\321\201\320\272\320\260.os" | 8 +- ...321\200\320\272\320\276\320\262RatioSD.os" | 10 +- ...20\241\321\200\320\265\320\264\321\213.os" | 9 +- ...21\200\321\202\320\270\320\273\321\214.os" | 6 +- ...20\260\320\274\321\217\321\202\321\214.os" | 6 +- ...20\263\320\276\321\200\320\270\321\217.os" | 6 +- ...20\275\320\276\321\201\321\202\320\270.os" | 10 +- ...20\262\320\234\320\260\320\272\321\201.os" | 6 +- ...20\264\320\270\320\260\320\275\320\260.os" | 6 +- ...20\234\320\265\321\202\320\276\320\264.os" | 6 +- ...20\276\320\262\320\234\320\270\320\275.os" | 6 +- ...21\200\321\202\320\270\320\273\321\214.os" | 6 +- ...20\272\321\203\320\275\320\264\321\203.os" | 6 +- ...20\260\320\274\320\265\321\202\321\200.os" | 6 +- ...20\275\321\202\320\270\320\273\321\214.os" | 6 +- ...20\265\320\264\320\275\320\265\320\265.os" | 6 +- ...21\210\320\270\320\261\320\272\320\260.os" | 6 +- ...20\275\320\265\320\275\320\270\320\265.os" | 6 +- ...21\202\320\260\320\273\320\276\320\275.os" | 6 +- ...20\260\321\200\320\272\320\276\320\262.os" | 117 +++---- ...20\260\321\200\320\272\320\276\320\262.os" | 74 ++-- ...20\260\321\200\320\272\320\276\320\262.os" | 146 ++++++++ ...20\274\320\260\321\200\320\272\320\260.os" | 7 +- ...20\260\321\200\320\272\320\276\320\262.os" | 329 ++++++------------ ...20\260\320\273\320\276\320\263\320\260.os" | 28 +- ...20\260\321\200\320\272\320\276\320\262.os" | 194 +++++------ ...20\260\321\200\320\272\320\276\320\262.os" | 12 +- ...20\274\320\260\321\200\320\272\320\260.os" | 66 ++++ ...20\260\321\200\320\272\320\276\320\262.os" | 6 +- ...20\260\321\200\320\272\320\276\320\262.os" | 111 +++--- ...20\273\320\265\320\263\320\260\321\202.os" | 90 ----- ...20\260\321\200\320\272\320\276\320\262.os" | 52 +-- ...20\260\321\200\320\272\320\276\320\262.os" | 4 + ...20\274\320\260\321\200\320\272\320\260.os" | 8 +- ...20\260\321\200\320\272\320\276\320\262.os" | 72 ++-- ...20\260\321\200\320\272\320\276\320\262.os" | 203 ++++++----- ...20\232\320\265\320\271\321\201\320\260.os" | 70 ++-- ...20\232\320\265\320\271\321\201\320\260.os" | 96 +++++ ...20\260\321\200\320\272\320\276\320\262.os" | 7 +- ...20\274\320\260\321\200\320\272\320\260.os" | 4 +- ...20\274\320\260\321\200\320\272\320\260.os" | 50 ++- ...20\265\320\263\320\260\321\202\320\260.os" | 118 +++++++ ...20\260\321\200\320\272\320\276\320\262.os" | 10 +- ...20\260\321\200\320\272\320\276\320\262.os" | 218 ++++++++---- ...21\200\320\272\320\270\320\275\320\263.os" | 63 ++-- ...20\260\321\200\320\272\320\276\320\262.os" | 4 +- ...20\260\321\200\320\272\320\276\320\262.os" | 6 +- ...20\272\320\260\320\224\321\202\320\276.os" | 41 --- ...20\261\321\213\321\202\320\270\320\271.os" | 6 +- ...21\202\321\200\320\260\320\274\320\270.os" | 2 + ...20\260\321\200\320\272\320\276\320\262.os" | 8 +- ...20\265\321\202\321\200\320\276\320\262.os" | 11 + tests/fixtures/verified-report.json | 10 +- ...20\260\321\200\320\272\320\276\320\262.os" | 6 +- ...20\260\321\200\320\272\320\276\320\262.os" | 13 +- ...21\203\321\201\320\272\320\276\320\262.os" | 36 +- ...20\265\321\202\321\200\320\276\320\262.os" | 2 +- ...21\200\320\260\321\206\320\270\320\270.os" | 38 +- ...20\260\321\200\320\272\320\276\320\262.os" | 18 +- ...20\260\321\200\320\272\320\276\320\262.os" | 39 ++- ...21\201\321\202\320\270\320\272\320\270.os" | 4 +- ...20\273\320\276\320\275\320\276\320\262.os" | 156 ++++++--- 71 files changed, 1587 insertions(+), 1151 deletions(-) rename "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\320\276\320\273\320\262\320\265\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" => "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\260\320\277\321\202\320\265\321\200\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" (63%) create mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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" rename "src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\260\321\217\320\241\321\200\320\265\320\264\320\260\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" => "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\260\321\217\320\241\321\200\320\265\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" (68%) create mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\265\320\271\321\201\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" delete mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\320\265\320\275\320\270\320\262\321\213\320\271\320\224\320\265\320\273\320\265\320\263\320\260\321\202.os" rename "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\227\320\260\320\277\321\203\321\201\320\272\320\260\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" => "src/BenchmarkOneScript/core/\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\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" (83%) rename "src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260\320\224\321\202\320\276.os" => "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\232\320\265\320\271\321\201\320\260.os" (55%) create mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\230\321\202\320\265\321\200\320\260\321\206\320\270\320\270\320\232\320\265\320\271\321\201\320\260.os" create mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\224\320\265\320\273\320\265\320\263\320\260\321\202\320\260.os" delete mode 100644 "src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\230\321\202\320\265\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\260\320\224\321\202\320\276.os" rename "tests/\320\242\320\265\321\201\321\202\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\245\320\276\320\273\320\276\320\264\320\275\321\213\320\271\320\227\320\260\320\277\321\203\321\201\320\272.os" => "tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" (82%) diff --git "a/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" "b/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" index cb37157..bf0e800 100644 --- "a/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" +++ "b/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" @@ -29,7 +29,7 @@ // * Контекст - Структура: // ** Конфигурация - КонфигурацияБенчмарков // ** ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков -// ** Запуски - Массив из РезультатЗапускаБенчмаркаДто +// ** Запуски - Массив из РезультатЗапускаКейса // ** Отчет - ОтчетБенчмарков // ** СредаОкружения - СредаОкруженияБенчмарков &ПослеВсех @@ -43,8 +43,7 @@ ```bsl // Параметры: // * Контекст - Структура: -// ** ДескрипторБенчмарка - ДескрипторБенчмарка -// ** ПараметрыМетода - Массив из Произвольный +// ** Кейс - ДКейсБенчмарка &ПередКаждым Процедура ПередКаждым(Контекст) Экспорт ``` @@ -56,9 +55,8 @@ ```bsl // Параметры: // * Контекст - Структура: -// ** ДескрипторБенчмарка - ДескрипторБенчмарка -// ** Параметры - Массив из ПараметрБенчмарка -// ** Замеры - Массив из РезультатИтерацииБенчмаркаДто +// ** Кейс - КейсБенчмарка +// ** Замеры - Массив из РезультатИтерацииКейса // ** Статистика - СтатистикаБенчмарка &ПослеКаждого Процедура ПослеКаждого(Контекст) Экспорт diff --git "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" index eba144d..d2ca942 100644 --- "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" +++ "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" @@ -56,8 +56,8 @@ **Параметры бенчмарка, полученные из функции** -Используйте аннотацию `&ИсточникПараметров` для указания функции, возвращающей коллекцию наборов параметров. -Функция должна возвращать `Массив` или `ТаблицаЗначений`, где каждый элемент соответствует набору параметров. +Используйте аннотацию `&ИсточникПараметров` для указания функции, возвращающей параметры бенчмарка. +Если метод бенчмарка принимает более одного параметра, функция должна возвращать `Массив` или `ТаблицаЗначений`, где каждый элемент соответствует набору параметров. Функция может быть определена в самом сценарии бенчмарка, любом другом модуле/классе. ```bsl diff --git "a/docs/\320\241\321\200\320\265\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.md" "b/docs/\320\241\321\200\320\265\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.md" index d0c6bfa..6a7285e 100644 --- "a/docs/\320\241\321\200\320\265\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.md" +++ "b/docs/\320\241\321\200\320\265\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.md" @@ -40,26 +40,26 @@ 1. Простой вариант указания версий ```bsl Конфигурация - .ДобавитьВерсиюИсполняющейСреды("stable") - .ДобавитьВерсиюИсполняющейСреды("dev") - .ДобавитьВерсиюИсполняющейСреды("1.9.3"); + .ДобавитьИсполняющуюСреду("stable") + .ДобавитьИсполняющуюСреду("dev") + .ДобавитьИсполняющуюСреду("1.9.3"); ``` 2. С кастомным именем для отчётов ```bsl Конфигурация - .ДобавитьВерсиюИсполняющейСреды("1.9.3", "Стабильная сборка") - .ДобавитьВерсиюИсполняющейСреды("dev", "Ночная сборка"); + .ДобавитьИсполняющуюСреду("1.9.3", "Стабильная сборка") + .ДобавитьИсполняющуюСреду("dev", "Ночная сборка"); ``` 3. Указание эталонной версии ```bsl -Конфигурация.ДобавитьВерсиюИсполняющейСреды("stable", "Стабильная сборка", Истина); +Конфигурация.ДобавитьИсполняющуюСреду("stable", "Стабильная сборка", Истина); ``` 4. Путь к исполняющему файлу ```bsl -Конфигурация.ДобавитьВерсиюИсполняющейСреды("path/to/oscript.exe", "Моя сборка"); +Конфигурация.ДобавитьИсполняющуюСреду("path/to/oscript.exe", "Моя сборка"); ``` ### CLI diff --git "a/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" "b/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" index b918b49..61f532c 100644 --- "a/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" +++ "b/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" @@ -178,7 +178,7 @@ #### API ```bsl -Конфигурация.ДобавитьВерсиюИсполняющейСреды("stable", "Стабильная сборка", Истина); +Конфигурация.ДобавитьИсполняющуюСреду("stable", "Стабильная сборка", Истина); ``` ### Пример выполнения diff --git "a/samples/api/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\240\320\260\320\267\320\275\321\213\321\205\320\222\320\265\321\200\321\201\320\270\321\217\321\205OneScript.os" "b/samples/api/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\240\320\260\320\267\320\275\321\213\321\205\320\222\320\265\321\200\321\201\320\270\321\217\321\205OneScript.os" index 105ccc2..aede806 100644 --- "a/samples/api/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\240\320\260\320\267\320\275\321\213\321\205\320\222\320\265\321\200\321\201\320\270\321\217\321\205OneScript.os" +++ "b/samples/api/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\240\320\260\320\267\320\275\321\213\321\205\320\222\320\265\321\200\321\201\320\270\321\217\321\205OneScript.os" @@ -4,7 +4,7 @@ Тип = Тип("БенчмаркБазовый"); Конфигурация = Новый КонфигурацияБенчмарков(Тип) - .ДобавитьВерсиюИсполняющейСреды("dev") - .ДобавитьВерсиюИсполняющейСреды("stable", , Истина); + .ДобавитьИсполняющуюСреду("dev") + .ДобавитьИсполняющуюСреду("stable", , Истина); Бенчмаркинг.Запустить(Тип, Конфигурация); \ No newline at end of file diff --git "a/src/BenchmarkOneScript/annotations/\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\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/src/BenchmarkOneScript/annotations/\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\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" index 074f24e..b226656 100644 --- "a/src/BenchmarkOneScript/annotations/\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\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/annotations/\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\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -10,8 +10,10 @@ // Применяется к экспортным полям и методам бенчмарков. // // Параметры: -// Значение - Строка - Имя экспортного метода. Может быть задано в формате: -// <ИмяТипаИлиМодуля>.<ИмяМетода> или <ИмяМетода> (метод класса бенчмарков) +// Значение - Строка - Имя экспортного метода-источника данных. +// Форматы: +// - <ИмяМетода> - Метод из текущего класса бенчмарков +// - <ИмяТипа>.<ИмяМетода> - Метод из указанного типа/модуля // // Примеры: // &ИсточникПараметров("ПолучитьВерсии") diff --git "a/src/BenchmarkOneScript/annotations/\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\237\320\265\321\200\320\265\320\264\320\232\320\260\320\266\320\264\321\213\320\274.os" "b/src/BenchmarkOneScript/annotations/\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\237\320\265\321\200\320\265\320\264\320\232\320\260\320\266\320\264\321\213\320\274.os" index 359e1da..34ee6b0 100644 --- "a/src/BenchmarkOneScript/annotations/\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\237\320\265\321\200\320\265\320\264\320\232\320\260\320\266\320\264\321\213\320\274.os" +++ "b/src/BenchmarkOneScript/annotations/\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\237\320\265\321\200\320\265\320\264\320\232\320\260\320\266\320\264\321\213\320\274.os" @@ -5,8 +5,7 @@ // // Параметры: // Контекст - Структура: -// * ДескрипторБенчмарка - ДескрипторБенчмарка -// * ПараметрыМетода - Массив из Произвольный +// * Кейс - КейсБенчмарка // // Примеры: // &ПередКаждым diff --git "a/src/BenchmarkOneScript/annotations/\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\237\320\276\321\201\320\273\320\265\320\222\321\201\320\265\321\205.os" "b/src/BenchmarkOneScript/annotations/\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\237\320\276\321\201\320\273\320\265\320\222\321\201\320\265\321\205.os" index 1217453..a9faa69 100644 --- "a/src/BenchmarkOneScript/annotations/\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\237\320\276\321\201\320\273\320\265\320\222\321\201\320\265\321\205.os" +++ "b/src/BenchmarkOneScript/annotations/\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\237\320\276\321\201\320\273\320\265\320\222\321\201\320\265\321\205.os" @@ -5,11 +5,11 @@ // // Параметры: // Контекст - Структура: -// * Конфигурация - КонфигурацияБенчмарков +// * Конфигурация - КонфигурацияБенчмарков // * ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков -// * Запуски - Массив из РезультатЗапускаБенчмаркаДто -// * Отчет - ОтчетБенчмарков -// * СредаОкружения - СредаОкруженияБенчмарков +// * Запуски - Массив из РезультатЗапускаКейса +// * Отчет - ОтчетБенчмарков +// * СредаОкружения - СредаОкруженияБенчмарков // // Примеры: // &ПослеВсех diff --git "a/src/BenchmarkOneScript/annotations/\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\237\320\276\321\201\320\273\320\265\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" "b/src/BenchmarkOneScript/annotations/\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\237\320\276\321\201\320\273\320\265\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" index 77087d4..b077a10 100644 --- "a/src/BenchmarkOneScript/annotations/\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\237\320\276\321\201\320\273\320\265\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" +++ "b/src/BenchmarkOneScript/annotations/\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\237\320\276\321\201\320\273\320\265\320\232\320\260\320\266\320\264\320\276\320\263\320\276.os" @@ -5,9 +5,8 @@ // // Параметры: // Контекст - Структура: -// * ДескрипторБенчмарка - ДескрипторБенчмарка -// * Параметры - Массив из ПараметрБенчмарка -// * Замеры - Массив из РезультатИтерацииБенчмаркаДто +// * Кейс - КейсБенчмарка +// * Замеры - Массив из РезультатИтерацииКейса // * Статистика - СтатистикаБенчмарка // // Примеры: 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 4cba6ed..909a0f8 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" @@ -246,15 +246,15 @@ Возврат; КонецЕсли; - Конфигурация.ОчиститьВерсииИсполняющейСреды(); + Конфигурация.ОчиститьИсполняющиеСреды(); Если НРег(_ИсполняющаяСреда) = "current" Тогда Возврат; КонецЕсли; - ВерсииИсполняющейСреды = СтрРазделить(_ИсполняющаяСреда, ","); - Для Каждого Версия Из ВерсииИсполняющейСреды Цикл - Конфигурация.ДобавитьВерсиюИсполняющейСреды(Версия); + ИсполняющиеСреды = СтрРазделить(_ИсполняющаяСреда, ","); + Для Каждого Версия Из ИсполняющиеСреды Цикл + Конфигурация.ДобавитьИсполняющуюСреду(Версия); КонецЦикла; КонецПроцедуры diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262RatioSD.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262RatioSD.os" index 697b7c8..430c2f8 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262RatioSD.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262RatioSD.os" @@ -25,22 +25,22 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Если РезультатЗапускаБенчмарка.ЭтоЭталон Тогда + Если РезультатЗапускаКейса.ЭтоЭталон Тогда Возврат 0; КонецЕсли; - Если РезультатЗапускаБенчмарка.Эталон = Неопределено Тогда + Если РезультатЗапускаКейса.Эталон = Неопределено Тогда Возврат "?"; КонецЕсли; - Статистика = РезультатЗапускаБенчмарка.Статистика.Разделить(РезультатЗапускаБенчмарка.Эталон.Статистика); + Статистика = РезультатЗапускаКейса.Статистика.Разделить(РезультатЗапускаКейса.Эталон.Статистика); Возврат Статистика.СтандартноеОтклонение; diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\265\321\200\321\201\320\270\321\217\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\265\320\271\320\241\321\200\320\265\320\264\321\213.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\265\321\200\321\201\320\270\321\217\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\265\320\271\320\241\321\200\320\265\320\264\321\213.os" index c2dec40..14e9810 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\265\321\200\321\201\320\270\321\217\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\265\320\271\320\241\321\200\320\265\320\264\321\213.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\265\321\200\321\201\320\270\321\217\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\265\320\271\320\241\321\200\320\265\320\264\321\213.os" @@ -15,18 +15,19 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Строка -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - ИсполняющаяСреда = РезультатЗапускаБенчмарка.ИсполняющаяСреда; + ИсполняющаяСреда = РезультатЗапускаКейса.Кейс.ИсполняющаяСреда(); + Если ЗначениеЗаполнено(ИсполняющаяСреда.Наименование) Тогда Возврат СтрШаблон("%1 (%2)", ИсполняющаяСреда.Наименование, ИсполняющаяСреда.Версия); КонецЕсли; - Возврат РезультатЗапускаБенчмарка.ИсполняющаяСреда.Версия; + Возврат ИсполняющаяСреда.Версия; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\265\321\200\321\205\320\275\320\270\320\271\320\232\320\262\320\260\321\200\321\202\320\270\320\273\321\214.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\265\321\200\321\205\320\275\320\270\320\271\320\232\320\262\320\260\321\200\321\202\320\270\320\273\321\214.os" index 02a7773..e10a232 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\265\321\200\321\205\320\275\320\270\320\271\320\232\320\262\320\260\321\200\321\202\320\270\320\273\321\214.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\320\265\321\200\321\205\320\275\320\270\320\271\320\232\320\262\320\260\321\200\321\202\320\270\320\273\321\214.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().ВерхнийКвартиль; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().ВерхнийКвартиль; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\321\213\320\264\320\265\320\273\321\217\320\265\320\274\320\260\321\217\320\237\320\260\320\274\321\217\321\202\321\214.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\321\213\320\264\320\265\320\273\321\217\320\265\320\274\320\260\321\217\320\237\320\260\320\274\321\217\321\202\321\214.os" index 83f54db..484165f 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\321\213\320\264\320\265\320\273\321\217\320\265\320\274\320\260\321\217\320\237\320\260\320\274\321\217\321\202\321\214.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\222\321\213\320\264\320\265\320\273\321\217\320\265\320\274\320\260\321\217\320\237\320\260\320\274\321\217\321\202\321\214.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВыделяемаяПамять; + Возврат РезультатЗапускаКейса.Статистика.ВыделяемаяПамять; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\232\320\260\321\202\320\265\320\263\320\276\321\200\320\270\321\217.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\232\320\260\321\202\320\265\320\263\320\276\321\200\320\270\321\217.os" index 64f4c44..477653f 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\232\320\260\321\202\320\265\320\263\320\276\321\200\320\270\321\217.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\232\320\260\321\202\320\265\320\263\320\276\321\200\320\270\321\217.os" @@ -15,13 +15,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.ДескрипторБенчмарка.Категория(); + Возврат РезультатЗапускаКейса.Кейс.ДескрипторБенчмарка().Категория(); КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\232\320\276\321\215\321\204\321\204\320\270\321\206\320\270\320\265\320\275\321\202\320\237\321\200\320\276\320\270\320\267\320\262\320\276\320\264\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\232\320\276\321\215\321\204\321\204\320\270\321\206\320\270\320\265\320\275\321\202\320\237\321\200\320\276\320\270\320\267\320\262\320\276\320\264\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270.os" index 3c4c178..bbe8840 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\232\320\276\321\215\321\204\321\204\320\270\321\206\320\270\320\265\320\275\321\202\320\237\321\200\320\276\320\270\320\267\320\262\320\276\320\264\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\232\320\276\321\215\321\204\321\204\320\270\321\206\320\270\320\265\320\275\321\202\320\237\321\200\320\276\320\270\320\267\320\262\320\276\320\264\320\270\321\202\320\265\320\273\321\214\320\275\320\276\321\201\321\202\320\270.os" @@ -23,22 +23,22 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Если РезультатЗапускаБенчмарка.ЭтоЭталон Тогда + Если РезультатЗапускаКейса.ЭтоЭталон Тогда Возврат 1; КонецЕсли; - Если РезультатЗапускаБенчмарка.Эталон = Неопределено Тогда + Если РезультатЗапускаКейса.Эталон = Неопределено Тогда Возврат "?"; КонецЕсли; - Статистика = РезультатЗапускаБенчмарка.Статистика.Разделить(РезультатЗапускаБенчмарка.Эталон.Статистика); + Статистика = РезультатЗапускаКейса.Статистика.Разделить(РезультатЗапускаКейса.Эталон.Статистика); Возврат Статистика.Среднее; diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\260\320\272\321\201.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\260\320\272\321\201.os" index 8290b18..458080d 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\260\320\272\321\201.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\260\320\272\321\201.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().Макс; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().Макс; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\265\320\264\320\270\320\260\320\275\320\260.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\265\320\264\320\270\320\260\320\275\320\260.os" index 7c34e10..09bb95a 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\265\320\264\320\270\320\260\320\275\320\260.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\265\320\264\320\270\320\260\320\275\320\260.os" @@ -20,13 +20,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().Медиана; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().Медиана; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264.os" index fab2a89..20e24e2 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\265\321\202\320\276\320\264.os" @@ -15,13 +15,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.ДескрипторБенчмарка.Метод(); + Возврат РезультатЗапускаКейса.Кейс.ДескрипторБенчмарка().Метод(); КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\270\320\275.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\270\320\275.os" index 72c7d49..8ef5343 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\270\320\275.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\234\320\270\320\275.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().Мин; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().Мин; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\235\320\270\320\266\320\275\320\270\320\271\320\232\320\262\320\260\321\200\321\202\320\270\320\273\321\214.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\235\320\270\320\266\320\275\320\270\320\271\320\232\320\262\320\260\321\200\321\202\320\270\320\273\321\214.os" index 487dc41..3df0f5b 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\235\320\270\320\266\320\275\320\270\320\271\320\232\320\262\320\260\321\200\321\202\320\270\320\273\321\214.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\235\320\270\320\266\320\275\320\270\320\271\320\232\320\262\320\260\321\200\321\202\320\270\320\273\321\214.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().НижнийКвартиль; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().НижнийКвартиль; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\271\320\222\320\241\320\265\320\272\321\203\320\275\320\264\321\203.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\271\320\222\320\241\320\265\320\272\321\203\320\275\320\264\321\203.os" index a69a565..03d2509 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\271\320\222\320\241\320\265\320\272\321\203\320\275\320\264\321\203.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\236\320\277\320\265\321\200\320\260\321\206\320\270\320\271\320\222\320\241\320\265\320\272\321\203\320\275\320\264\321\203.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().ОперацийВСекунду; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().ОперацийВСекунду; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200.os" index e8652ce..e381ef9 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200.os" @@ -19,16 +19,16 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт ИмяПараметра = ИмяПараметра(Колонка); - Для Каждого Параметр Из РезультатЗапускаБенчмарка.Параметры Цикл + Для Каждого Параметр Из РезультатЗапускаКейса.Кейс.Параметры() Цикл Если Параметр.Имя() = ИмяПараметра Тогда Если Параметр.Значение() <> Неопределено И СериализацияОбъектовБенчмаркинга.ЭтоПримитив(Параметр.Значение()) Тогда Возврат Параметр.Значение(); diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\237\321\200\320\276\321\206\320\265\320\275\321\202\320\270\320\273\321\214.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\237\321\200\320\276\321\206\320\265\320\275\321\202\320\270\320\273\321\214.os" index 6614ebe..5f63e46 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\237\321\200\320\276\321\206\320\265\320\275\321\202\320\270\320\273\321\214.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\237\321\200\320\276\321\206\320\265\320\275\321\202\320\270\320\273\321\214.os" @@ -23,16 +23,16 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Число -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off Процентиль = ПроцентильПоКолонке(Колонка.Имя); - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().Квантиль(Процентиль / 100); + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().Квантиль(Процентиль / 100); КонецФункции diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\200\320\265\320\264\320\275\320\265\320\265.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\200\320\265\320\264\320\275\320\265\320\265.os" index a73428e..3a42ebb 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\200\320\265\320\264\320\275\320\265\320\265.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\200\320\265\320\264\320\275\320\265\320\265.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().Среднее; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().Среднее; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\260\321\217\320\236\321\210\320\270\320\261\320\272\320\260.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\260\321\217\320\236\321\210\320\270\320\261\320\272\320\260.os" index 9a49b83..00b4047 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\260\321\217\320\236\321\210\320\270\320\261\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\260\321\217\320\236\321\210\320\270\320\261\320\272\320\260.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().СтандартнаяОшибкаСреднего; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().СтандартнаяОшибкаСреднего; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\276\320\265\320\236\321\202\320\272\320\273\320\276\320\275\320\265\320\275\320\270\320\265.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\276\320\265\320\236\321\202\320\272\320\273\320\276\320\275\320\265\320\275\320\270\320\265.os" index 221544f..fc85a31 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\276\320\265\320\236\321\202\320\272\320\273\320\276\320\275\320\265\320\275\320\270\320\265.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\241\321\202\320\260\320\275\320\264\320\260\321\200\321\202\320\275\320\276\320\265\320\236\321\202\320\272\320\273\320\276\320\275\320\265\320\275\320\270\320\265.os" @@ -18,13 +18,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.Статистика.ВНаносекунды().СтандартноеОтклонение; + Возврат РезультатЗапускаКейса.Статистика.ВНаносекунды().СтандартноеОтклонение; КонецФункции \ No newline at end of file diff --git "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\255\321\202\320\260\320\273\320\276\320\275.os" "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\255\321\202\320\260\320\273\320\276\320\275.os" index 9228a0f..4aeb0d4 100644 --- "a/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\255\321\202\320\260\320\273\320\276\320\275.os" +++ "b/src/BenchmarkOneScript/columns/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262\320\255\321\202\320\260\320\273\320\276\320\275.os" @@ -16,13 +16,13 @@ // Возвращает значение колонки // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт // BSLLS:UnusedParameters-off +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт // BSLLS:UnusedParameters-off - Возврат РезультатЗапускаБенчмарка.ЭтоЭталон; + Возврат РезультатЗапускаКейса.ЭтоЭталон; КонецФункции \ 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\240\320\265\320\267\320\276\320\273\320\262\320\265\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\260\320\277\321\202\320\265\321\200\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" similarity index 63% rename from "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\320\276\320\273\320\262\320\265\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" rename to "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\260\320\277\321\202\320\265\321\200\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index d910966..5565128 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\320\276\320\273\320\262\320\265\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\260\320\277\321\202\320\265\321\200\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,19 +1,17 @@ -Перем _ИсточникБенчмарков; // Произвольный -Перем _ОбъектБенчмарков; // Произвольный - Кэшированный экземпляр класса бенчмарков -Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков - Кэшированная коллекция дескрипторов +Перем _ИсточникБенчмарков; // Произвольный #Область ОбработчикиСобыий -// Конструктор резолвера бенчмарков +// Конструктор адаптера источника бенчмарков // // Адаптирует различные типы источников бенчмарков к единому интерфейсу, // позволяя работать с ними единообразно независимо от способа передачи. // // Параметры: -// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки +// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки +// - ДескрипторБенчмарка - Отдельный дескриптор // - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов -// - ДескрипторБенчмарка - Отдельный дескриптор -// - Произвольный - Экземпляр класса с бенчмарками +// - Произвольный - Экземпляр класса с бенчмарками Процедура ПриСозданииОбъекта(ИсточникБенчмарков) _ИсточникБенчмарков = ИсточникБенчмарков; КонецПроцедуры @@ -22,43 +20,21 @@ #Область ПрограммныйИнтерфейс -// Возвращает экземпляр объекта бенчмарков +// Возвращает тип класса бенчмарков // -// Создает и кэширует объект при первом обращении. При повторных вызовах -// возвращает ранее созданный экземпляр. +// Метод извлекает информацию о типе класса из переданного источника. // // Поведение в зависимости от типа источника: -// - Тип - Создаёт новый экземпляр -// - ДескрипторБенчмарка - Извлекает тип и создаёт экземпляр -// - КоллекцияДескрипторовБенчмарков - Берёт первый дескриптор и создаёт экземпляр -// - Произвольный - Возвращает источник как есть -// -// Возвращаемое значение: -// Произвольный - Экземпляр класса бенчмарков -// -// Вызывает исключение: -// Если коллекция дескрипторов пуста -Функция ОбъектБенчмарков() Экспорт - - Если Не _ОбъектБенчмарков = Неопределено Тогда - Возврат _ОбъектБенчмарков; - КонецЕсли; - - _ОбъектБенчмарков = СоздатьОбъектБенчмарков(); - - Возврат _ОбъектБенчмарков; - -КонецФункции - -// Возвращает тип класса бенчмарков -// -// Определяет тип класса на основе переданного источника +// - Тип - Возвращает переданный тип как есть +// - ДескрипторБенчмарка - Извлекает тип из дескриптора +// - КоллекцияДескрипторовБенчмарков - Извлекает тип из первого дескриптора +// - Произвольный - Определяет тип через ТипЗнч() // // Возвращаемое значение: // Тип - Тип класса бенчмарков // // Вызывает исключение: -// Если коллекция дескрипторов пуста +// Когда источник - пустая коллекция дескрипторов Функция ТипКласса() Экспорт ТипИсточника = ТипЗнч(_ИсточникБенчмарков); @@ -83,36 +59,24 @@ КонецФункции -// Возвращает коллекцию дескрипторов бенчмарков +// Возвращает экземпляр объекта бенчмарков // -// Создает и кэширует коллекцию при первом обращении. При повторных вызовах -// возвращает ранее созданную коллекцию. +// В зависимости от типа источника либо создаёт новый экземпляр класса, +// либо возвращает уже существующий объект. // // Поведение в зависимости от типа источника: -// - КоллекцияДескрипторовБенчмарков - Возвращает источник как есть -// - ДескрипторБенчмарка - Создаёт коллекцию с одним элементом -// - Тип, Произвольный - Создаёт коллекцию на основе объекта бенчмарков +// - Тип - Создаёт новый экземпляр класса +// - ДескрипторБенчмарка - Извлекает тип из дескриптора и создаёт экземпляр +// - КоллекцияДескрипторовБенчмарков - Извлекает тип из первого дескриптора и создаёт экземпляр +// - Произвольный - Возвращает переданный объект без изменений // // Возвращаемое значение: -// КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов -Функция Дескрипторы() Экспорт - - Если Не _ДескрипторыБенчмарков = Неопределено Тогда - Возврат _ДескрипторыБенчмарков; - КонецЕсли; - - _ДескрипторыБенчмарков = СоздатьКоллекциюДескрипторов(); - - Возврат _ДескрипторыБенчмарков; - -КонецФункции - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции +// Произвольный - Экземпляр класса бенчмарков +// +// Вызывает исключение: +// Когда источник - пустая коллекция дескрипторов +Функция ПолучитьОбъектБенчмарков() Экспорт -Функция СоздатьОбъектБенчмарков() - ТипИсточника = ТипЗнч(_ИсточникБенчмарков); Если ТипИсточника = Тип("Тип") Тогда @@ -133,11 +97,24 @@ Возврат _ИсточникБенчмарков; КонецЕсли; - + КонецФункции -Функция СоздатьКоллекциюДескрипторов() - +// Возвращает коллекцию дескрипторов бенчмарков +// +// В зависимости от типа источника либо создаёт новую коллекцию, +// либо возвращает уже существующую. +// +// Поведение в зависимости от типа источника: +// - Тип - Создаёт новую коллекцию, анализируя структуру класса +// - ДескрипторБенчмарка - Создаёт новую коллекцию с единственным элементом +// - КоллекцияДескрипторовБенчмарков - Возвращает переданную коллекцию без изменений +// - Произвольный - Создаёт новую коллекцию, анализируя экземпляр +// +// Возвращаемое значение: +// КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов бенчмарков +Функция ПолучитьКоллекциюДескрипторов() Экспорт + ТипИсточника = ТипЗнч(_ИсточникБенчмарков); Если ТипИсточника = Тип("КоллекцияДескрипторовБенчмарков") Тогда @@ -156,9 +133,21 @@ Возврат Новый КоллекцияДескрипторовБенчмарков(_ИсточникБенчмарков); КонецЕсли; - + КонецФункции +// Создает конфигурацию бенчмарков +// +// Возвращаемое значение: +// КонфигурацияБенчмарков +Функция СоздатьКонфигурацию() Экспорт + Возврат Новый КонфигурацияБенчмарков(ТипКласса()); +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + Функция ПолучитьТипИзКоллекцииДескрипторов() ПервыйДескриптор = _ИсточникБенчмарков.ПолучитьПервый(); diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 19caa59..7a2979a 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,23 +1,30 @@ #Использовать logos +#Использовать fluent Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков -Перем _Конфигурация; // КонфигурацияБенчмарков -Перем _СписокОшибок; // Массив из Строка +Перем _Конфигурация; // КонфигурацияБенчмарков +Перем _СписокОшибок; // Массив из Строка -// Выполняет комплексную проверку для запуска бенчмарков +#Область ОбработчикиСобытий + +// Создает валидатор конфигурации запуска бенчмарков // // Параметры: // ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков -// Конфигурация - КонфигурацияБенчмарков +// Конфигурация - КонфигурацияБенчмарков Процедура ПриСозданииОбъекта(ДескрипторыБенчмарков, Конфигурация) + _ДескрипторыБенчмарков = ДескрипторыБенчмарков; - _Конфигурация = Конфигурация; - _СписокОшибок = Новый Массив(); + _Конфигурация = Конфигурация; + _СписокОшибок = Новый Массив(); + КонецПроцедуры +#КонецОбласти + #Область ПрограммныйИнтерфейс -// Проверяет возможность выполнения бенчмарков +// Проверяет корректность конфигурации запуска бенчмарков // // Возвращаемое значение: // Булево - Истина, если все проверки пройдены (ошибок нет), @@ -26,33 +33,36 @@ _СписокОшибок.Очистить(); + ПроверитьНаличиеДескрипторов(); ПроверитьТипыБенчмарков(); - ПроверитьЭталоннуюВерсиюИсполняющейСреды(); + ПроверитьЭталоннуюИсполняющуюСреду(); ПроверитьЭталонныеБенчмарки(); - ПроверитьПараметрыНаВозможностьСериализации(); + ПроверитьСериализуемостьПараметров(); + + Результат = _СписокОшибок.Количество() = 0; - Возврат _СписокОшибок.Количество() = 0; + Возврат Результат; КонецФункции -// Формирует сводный отчет об ошибках валидации в виде строки +// Возвращает сводный текст всех обнаруженных ошибок валидации // // Возвращаемое значение: // Строка Функция ПолучитьТекстОшибок() Экспорт - Подстроки = Новый Массив(); Если _СписокОшибок.Количество() = 0 Тогда Возврат ""; КонецЕсли; - Подстроки.Добавить("Валидация запуска не пройдена. Обнаружены ошибки:"); + Строки = Новый Массив(); + Строки.Добавить("Конфигурация запуска бенчмарков содержит следующие ошибки:"); Для Каждого ТекстОшибки Из _СписокОшибок Цикл - Подстроки.Добавить("- " + ТекстОшибки); + Строки.Добавить(" • " + ТекстОшибки); КонецЦикла; - Возврат СтрСоединить(Подстроки, Символы.ПС); + Возврат СтрСоединить(Строки, Символы.ПС); КонецФункции @@ -60,19 +70,33 @@ #Область СлужебныеПроцедурыИФункции +Процедура ПроверитьНаличиеДескрипторов() + + Если _ДескрипторыБенчмарков.Количество() = 0 Тогда + _СписокОшибок.Добавить("Дескрипторы бенчмарков не найдены"); + КонецЕсли; + +КонецПроцедуры + Процедура ПроверитьТипыБенчмарков() ПредыдущийТип = Неопределено; + Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл ТекущийТип = ДескрипторБенчмарка.ТипКласса(); + Если ПредыдущийТип = Неопределено Тогда ПредыдущийТип = ТекущийТип; КонецЕсли; - Если Не ПредыдущийТип = ТекущийТип Тогда - ТекстОшибки = СтрШаблон("Запрещается запускать бенчмарки с разными типами: %1, %2...", ПредыдущийТип, ТекущийТип); - _СписокОшибок.Добавить(ТекстОшибки); + Если ПредыдущийТип <> ТекущийТип Тогда + ТекстОшибки = СтрШаблон( + "Запрещается запускать бенчмарки с разными типами: %1, %2...", + ПредыдущийТип, + ТекущийТип); + + _СписокОшибок.Добавить(ТекстОшибки); Возврат; КонецЕсли; @@ -80,12 +104,15 @@ КонецПроцедуры -Процедура ПроверитьЭталоннуюВерсиюИсполняющейСреды() +Процедура ПроверитьЭталоннуюИсполняющуюСреду() - Отбор = Новый Структура("ЭтоЭталон", Истина); - НайденныеСтроки = _Конфигурация.ВерсииИсполняющейСреды().НайтиСтроки(Отбор); + КоличествоЭталонов = ПроцессорыКоллекций + .ИзКоллекции(_Конфигурация.ИсполняющиеСреды()) + .Фильтровать("Среда -> Среда.ЭтоЭталон") + .ВМассив() + .Количество(); - Если НайденныеСтроки.Количество() > 1 Тогда + Если КоличествоЭталонов > 1 Тогда _СписокОшибок.Добавить("Допускается только одна эталонная версия исполняющей среды"); КонецЕсли; @@ -94,6 +121,7 @@ Процедура ПроверитьЭталонныеБенчмарки() БылЭталонПоКатегории = Новый Соответствие(); + Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл Если Не ДескрипторБенчмарка.ЭтоЭталон() Тогда @@ -116,7 +144,7 @@ КонецПроцедуры -Процедура ПроверитьПараметрыНаВозможностьСериализации() +Процедура ПроверитьСериализуемостьПараметров() // Параметры полей Для Каждого Параметр Из _Конфигурация.Параметры() Цикл diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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" new file mode 100644 index 0000000..35b638d --- /dev/null +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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" @@ -0,0 +1,146 @@ +#Использовать fluent + +Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков +Перем _Конфигурация; // КонфигурацияБенчмарков +Перем _ЧитательПараметровБенчмарков; // ЧитательПараметровБенчмарков + +#Область ОбработчикиСобытий + +Процедура ПриСозданииОбъекта(ДескрипторыБенчмарков, Конфигурация) + + АдаптерИсточникаБенчмарков = Новый АдаптерИсточникаБенчмарков(ДескрипторыБенчмарков); + ОбъектБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьОбъектБенчмарков(); + + _ДескрипторыБенчмарков = ДескрипторыБенчмарков; + _Конфигурация = Конфигурация; + _ЧитательПараметровБенчмарков = Новый ЧитательПараметровБенчмарков(ОбъектБенчмарков); + +КонецПроцедуры + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +Функция Сгенерировать() Экспорт + + Кейсы = Новый Массив; + ПараметрыКонфигурации = _Конфигурация.Параметры(); + ПараметрыКонфигурацииИзИсточников = ПрочитатьОбщиеПараметрыИзИсточников(); + ВерсииСреды = ПолучитьИсполняющиеСреды(); + СчетчикИдентификаторов = 0; + + Для Каждого ИсполняющаяСреда Из ВерсииСреды Цикл + + Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл + + НаборыПараметров = Новый Массив(); + + ДополнитьМассив(НаборыПараметров, ПараметрыКонфигурации); + ДополнитьМассив(НаборыПараметров, ПараметрыКонфигурацииИзИсточников); + ДополнитьМассив(НаборыПараметров, ДескрипторБенчмарка.НаборыПараметров()); + ДополнитьМассив(НаборыПараметров, ПрочитатьПараметрыБенчмаркаИзИсточников(ДескрипторБенчмарка)); + + КомбинацииПараметров = КомбинаторПараметровБенчмарка.Комбинировать(НаборыПараметров); + + Если КомбинацииПараметров.Количество() = 0 Тогда + КомбинацииПараметров.Добавить(Новый Массив()); + КонецЕсли; + + Для Каждого Параметры Из КомбинацииПараметров Цикл + + СчетчикИдентификаторов = СчетчикИдентификаторов + 1; + + Кейс = Новый КейсБенчмарка( + СчетчикИдентификаторов, + ДескрипторБенчмарка, + Параметры, + ИсполняющаяСреда + ); + + Кейсы.Добавить(Кейс); + + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + + Возврат Кейсы; + +КонецФункции + +Функция СгенерироватьПоИдентификаторам(Идентификаторы) Экспорт + + Кейсы = Сгенерировать(); + + Контекст = Новый Структура("Идентификаторы", Идентификаторы); + + Возврат ПроцессорыКоллекций + .ИзКоллекции(Кейсы) + .Фильтровать("Элемент -> Идентификаторы.Найти(Элемент.Идентификатор()) <> Неопределено", Контекст) + .ВМассив(); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПрочитатьОбщиеПараметрыИзИсточников() + + Результат = Новый Массив(); + + Для Каждого ИсточникПараметров Из _Конфигурация.ИсточникиПараметров() Цикл + + Параметры = _ЧитательПараметровБенчмарков.ПрочитатьКакОбщиеПараметры( + ИсточникПараметров.Источник, + ИсточникПараметров.ИмяПоля + ); + + ДополнитьМассив(Результат, Параметры); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПрочитатьПараметрыБенчмаркаИзИсточников(ДескрипторБенчмарка) + + Результат = Новый Массив(); + + Для Каждого ИсточникПараметров Из ДескрипторБенчмарка.ИсточникиПараметров() Цикл + + Параметры = _ЧитательПараметровБенчмарков.ПрочитатьКакПараметрыБенчмарка( + ИсточникПараметров, + ДескрипторБенчмарка + ); + + ДополнитьМассив(Результат, Параметры); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПолучитьИсполняющиеСреды() + + ВерсииСреды = _Конфигурация.ИсполняющиеСреды(); + ВыполнятьВТекущейВерсии = ВерсииСреды.Количество() = 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\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 a676504..c97fff9 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" @@ -2,7 +2,6 @@ #Использовать validate #Использовать reflector #Использовать asserts -#Использовать "../../dto" &Сериализуемое("Type") &Тип("Тип") @@ -213,8 +212,10 @@ // * СтрокаТаблицыЗначений - Колонки таблицы сопоставляются с именами параметров метода. // // Параметры: -// Источник - Строка - Имя экспортного метода. Может быть задано в формате: -// <ИмяТипаИлиМодуля>.<ИмяМетода> или <ИмяМетода> (в сценарии бенчмарка). +// Источник - Строка - Имя экспортного метода-источника данных. +// Форматы: +// - <ИмяМетода> - Метод из текущего класса бенчмарков +// - <ИмяТипа>.<ИмяМетода> - Метод из указанного типа/модуля // // Возвращаемое значение: // ЭтотОбъект 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 ac42f18..be357a9 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" @@ -11,37 +11,33 @@ Перем _ЭтоДочернийПроцесс; // Булево Перем _Чекпоинт; // ЧекпоинтЗапускаБенчмарков, Неопределено Перем _НовыйЧекпоинт; // ЧекпоинтЗапускаБенчмарков, Неопределено -Перем _ТекущийИндексПараметров; // Число Перем _БылоВыполнениеИтерации; // Булево Перем _Лог; // Лог // Запускает бенчмарки в текущем процессе // // Параметры: -// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки -// - КоллекцияДескрипторовБенчмарков -// - ДескрипторБенчмарка -// - Произвольный - Экземпляр класса с бенчмарками +// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки +// - ДескрипторБенчмарка - Отдельный дескриптор +// - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов +// - Произвольный - Экземпляр класса с бенчмарками // Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков -// Чекпоинт - ЧекпоинтЗапускаБенчмарков - Чекпоинт запуска -Процедура ПриСозданииОбъекта(ИсточникБенчмарков, Конфигурация = Неопределено, Чекпоинт = Неопределено) +Процедура ПриСозданииОбъекта(ИсточникБенчмарков, Конфигурация = Неопределено) - РезолверБенчмарков = Новый РезолверБенчмарков(ИсточникБенчмарков); + АдаптерИсточникаБенчмарков = Новый АдаптерИсточникаБенчмарков(ИсточникБенчмарков); - _ОбъектБенчмарков = РезолверБенчмарков.ОбъектБенчмарков(); - _ДескрипторыБенчмарков = РезолверБенчмарков.Дескрипторы(); - _Чекпоинт = Чекпоинт; + _ОбъектБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьОбъектБенчмарков(); + _ДескрипторыБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьКоллекциюДескрипторов(); _Хронометр = Новый Хронометр(); _Репортер = Новый КонсольныйРепортерБенчмарков(); _ЭтоДочернийПроцесс = Бенчмаркинг.ЭтоДочернийПроцесс(); - _ТекущийИндексПараметров = 0; _БылоВыполнениеИтерации = Ложь; _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.ЗапускательБенчмарков"); Если Не Конфигурация = Неопределено Тогда _Конфигурация = Конфигурация; Иначе - _Конфигурация = Новый КонфигурацияБенчмарков(РезолверБенчмарков.ТипКласса()); + _Конфигурация = АдаптерИсточникаБенчмарков.СоздатьКонфигурацию(); КонецЕсли; Если _Конфигурация.ТребуетсяМониторингПамяти() Тогда @@ -52,18 +48,30 @@ #Область ПрограммныйИнтерфейс -// Запускает бенчмарки +// Устанавливает чекпоинт +// +// Параметры: +// Чекпоинт - ЧекпоинтЗапускаБенчмарков - Точка восстановления для продолжения выполнения +Процедура УстановитьЧекпоинт(Чекпоинт) Экспорт + _Чекпоинт = Чекпоинт; +КонецПроцедуры + +// Запускает бенчмарки в текущем процессе +// +// Параметры: +// Кейсы - Массив из КейсБенчмарка - Кейсы бенчмарков // // Возвращаемое значение: // РезультатЗапускаБенчмарков -Функция Запустить() Экспорт - +Функция Запустить(Кейсы = Неопределено) Экспорт + + // TODO: Проверка кейсов в валидаторе Валидатор = Новый ВалидаторЗапускаБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); Если Не Валидатор.ЗапускВозможен() Тогда ВызватьИсключение Валидатор.ПолучитьТекстОшибок(); КонецЕсли; - РезультатЗапуска = ПодготовитьИЗапуститьБенчмарки(); + РезультатЗапуска = ПодготовитьИЗапуститьБенчмарки(Кейсы); Если Не _ЭтоДочернийПроцесс Тогда РепортерРезультатов = _Репортер; @@ -84,9 +92,8 @@ #Область СлужебныеПроцедурыИФункции -Функция ПодготовитьИЗапуститьБенчмарки() +Функция ПодготовитьИЗапуститьБенчмарки(Кейсы) - _ТекущийИндексПараметров = 0; _БылоВыполнениеИтерации = Ложь; _НовыйЧекпоинт = Неопределено; @@ -110,13 +117,13 @@ ВызватьОбработчикСобытия(СобытияБенчмарков.ПередВсеми, КонтекстСобытия); // Запуск бенчмарков - ЗапуститьБенчмарки(РезультатЗапуска); + ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска); // Подготовка результатов РезультатЗапуска.Чекпоинт = _НовыйЧекпоинт; - РезультатЗапуска.ОпределитьЭталоны(); - РезультатЗапуска.ОбновитьСтатистику(); - РезультатЗапуска.ПостроитьОтчет(); + РезультатЗапуска.УстановитьСвязиСЭталонами(); + РезультатЗапуска.ПересчитатьСтатистику(); + РезультатЗапуска.СформироватьОтчет(); // Событие ПослеВсех КонтекстСобытия = Новый Структура(); @@ -132,58 +139,34 @@ КонецФункции -Процедура ЗапуститьБенчмарки(РезультатЗапуска) +Процедура ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска) - ПараметрыКонфигурации = _Конфигурация.Параметры(); - ПараметрыКонфигурацииИзИсточников = ПрочитатьОбщиеПараметрыИзИсточников(); - - Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл - - Если ТребуетсяПропуститьБенчмарк(ДескрипторБенчмарка) Тогда - _Лог.Отладка("Пропущен бенчмарк <%1>", ДескрипторБенчмарка.Метод()); - Продолжить; - КонецЕсли; + Если Кейсы = Неопределено Тогда + ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); + Кейсы = ГенераторКейсов.Сгенерировать(); + КонецЕсли; - НаборыПараметров = Новый Массив(); - ДополнитьМассив(НаборыПараметров, ПараметрыКонфигурации); - ДополнитьМассив(НаборыПараметров, ПараметрыКонфигурацииИзИсточников); - ДополнитьМассив(НаборыПараметров, ДескрипторБенчмарка.НаборыПараметров()); - ДополнитьМассив(НаборыПараметров, ПрочитатьПараметрыБенчмаркаИзИсточников(ДескрипторБенчмарка)); + Для Каждого Кейс Из Кейсы Цикл - КомбинацииПараметров = КомбинаторПараметровБенчмарка.Комбинировать(НаборыПараметров); + ПроверитьИСоздатьЧекпоинт(Кейс); - Если КомбинацииПараметров.Количество() = 0 Тогда - КомбинацииПараметров.Добавить(Новый Массив()); + Если _НовыйЧекпоинт <> Неопределено Тогда + Возврат; КонецЕсли; - _ТекущийИндексПараметров = 0; - Для Каждого Параметры Из КомбинацииПараметров Цикл - - _ТекущийИндексПараметров = _ТекущийИндексПараметров + 1; - - ПроверитьИСоздатьТочкуВосстановления(ДескрипторБенчмарка.Метод(), _ТекущийИндексПараметров); - - Если _НовыйЧекпоинт <> Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТребуетсяПропуститьПараметры(_ТекущийИндексПараметров) Тогда - _Лог.Отладка("Пропущены параметры индекс <%1>", _ТекущийИндексПараметров); - Продолжить; - КонецЕсли; - - РезультатЗапускаБенчмарка = ЗапуститьБенчмарк(ДескрипторБенчмарка, Параметры); - РезультатЗапуска.Запуски.Добавить(РезультатЗапускаБенчмарка); - - КонецЦикла; + РезультатЗапускаКейса = ЗапуститьКейс(Кейс); + РезультатЗапуска.Запуски.Добавить(РезультатЗапускаКейса); КонецЦикла; КонецПроцедуры -Функция ЗапуститьБенчмарк(ДескрипторБенчмарка, Параметры) +Функция ЗапуститьКейс(Кейс) - Если ЭтоПервыйЗапускКейса() Тогда + ДескрипторБенчмарка = Кейс.ДескрипторБенчмарка(); + Параметры = Кейс.Параметры(); + + Если ЭтоПервыйЗапуск() Тогда _Репортер.ВывестиЗаголовокБенчмарка(ДескрипторБенчмарка); _Репортер.ВывестиПараметры(Параметры); КонецЕсли; @@ -191,17 +174,13 @@ ПараметрыМетода = ПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры); УстановитьПараметрыОбъекта(Параметры); - // Инициализация результата - РезультатЗапускаБенчмарка = Новый РезультатЗапускаБенчмаркаДто(); - РезультатЗапускаБенчмарка.ДескрипторБенчмарка = ДескрипторБенчмарка; - РезультатЗапускаБенчмарка.Параметры = Параметры; - РезультатЗапускаБенчмарка.Статистика = Новый СтатистикаБенчмарка(); - РезультатЗапускаБенчмарка.ИсполняющаяСреда.Версия = Новый СистемнаяИнформация().Версия; + РезультатЗапускаКейса = Новый РезультатЗапускаКейса(); + РезультатЗапускаКейса.Кейс = Кейс; + РезультатЗапускаКейса.Статистика = Новый СтатистикаБенчмарка(); // Событие ПередКаждым КонтекстСобытия = Новый Структура(); - КонтекстСобытия.Вставить("ДескрипторБенчмарка", ДескрипторБенчмарка); - КонтекстСобытия.Вставить("ПараметрыМетода", ПараметрыМетода); + КонтекстСобытия.Вставить("Кейс", Кейс); ВызватьОбработчикСобытия(СобытияБенчмарков.ПередКаждым, КонтекстСобытия); @@ -215,26 +194,25 @@ КонецЕсли; ЗапуститьЭтапПрогрева(Делегат, КоличествоВызововЗаИтерацию); - ЗапуститьЭтапИзмерения(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаБенчмарка.Замеры); - ЗапуститьМониторингПамяти(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаБенчмарка.Замеры); + ЗапуститьЭтапИзмерения(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса); + ЗапуститьМониторингПамяти(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса); // Сбор статистики - РезультатЗапускаБенчмарка.Статистика.Прочитать(РезультатЗапускаБенчмарка.Замеры); + РезультатЗапускаКейса.Статистика.Прочитать(РезультатЗапускаКейса.Замеры); - Если Не ИзолироватьКаждыйЗапускКейса() Тогда - _Репортер.ВывестиСтатистику(РезультатЗапускаБенчмарка.Статистика); + Если Не ИзолироватьИтерации() Тогда + _Репортер.ВывестиСтатистику(РезультатЗапускаКейса.Статистика); КонецЕсли; // Событие ПослеКаждого КонтекстСобытия = Новый Структура(); - КонтекстСобытия.Вставить("ДескрипторБенчмарка", ДескрипторБенчмарка); - КонтекстСобытия.Вставить("Параметры", Параметры); - КонтекстСобытия.Вставить("Замеры", РезультатЗапускаБенчмарка.Замеры); - КонтекстСобытия.Вставить("Статистика", РезультатЗапускаБенчмарка.Статистика); + КонтекстСобытия.Вставить("Кейс", Кейс); + КонтекстСобытия.Вставить("Замеры", РезультатЗапускаКейса.Замеры); + КонтекстСобытия.Вставить("Статистика", РезультатЗапускаКейса.Статистика); ВызватьОбработчикСобытия(СобытияБенчмарков.ПослеКаждого, КонтекстСобытия); - Возврат РезультатЗапускаБенчмарка; + Возврат РезультатЗапускаКейса; КонецФункции @@ -308,71 +286,46 @@ КонецПроцедуры -Процедура ЗапуститьЭтапИзмерения(Делегат, КоличествоВызововЗаИтерацию, Замеры) +Процедура ЗапуститьЭтапИзмерения(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса) Для НомерИтерации = 1 По _Конфигурация.КоличествоИтераций() Цикл - РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Измерение, НомерИтерации, КоличествоВызововЗаИтерацию); - Если РезультатИтерации <> Неопределено Тогда - Замеры.Добавить(РезультатИтерации); + ПроверитьИСоздатьЧекпоинт(РезультатЗапускаКейса.Кейс, ЭтапыБенчмарка.Измерение, НомерИтерации); + + Если ТребуетсяПропуститьИтерацию(ЭтапыБенчмарка.Измерение, НомерИтерации) Тогда + Продолжить; КонецЕсли; - Если _НовыйЧекпоинт <> Неопределено Тогда - Возврат; - КонецЕсли; + РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Измерение, НомерИтерации, КоличествоВызововЗаИтерацию); + РезультатЗапускаКейса.Замеры.Добавить(РезультатИтерации); КонецЦикла; КонецПроцедуры -Процедура ЗапуститьМониторингПамяти(Делегат, КоличествоВызововЗаИтерацию, Замеры) +Процедура ЗапуститьМониторингПамяти(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса) Если Не _Конфигурация.ТребуетсяМониторингПамяти() Тогда Возврат; КонецЕсли; Для НомерИтерации = 1 По _Конфигурация.КоличествоИтераций() Цикл - - РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Память, НомерИтерации, КоличествоВызововЗаИтерацию); - Если РезультатИтерации <> Неопределено Тогда - Замеры.Добавить(РезультатИтерации); + + ПроверитьИСоздатьЧекпоинт(РезультатЗапускаКейса.Кейс, ЭтапыБенчмарка.Память, НомерИтерации); + + Если ТребуетсяПропуститьИтерацию(ЭтапыБенчмарка.Память, НомерИтерации) Тогда + Продолжить; КонецЕсли; - Если _НовыйЧекпоинт <> Неопределено Тогда - Возврат; - КонецЕсли; + РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Память, НомерИтерации, КоличествоВызововЗаИтерацию); + РезультатЗапускаКейса.Замеры.Добавить(РезультатИтерации); КонецЦикла; КонецПроцедуры -Процедура ПрогретьИнструментыЗамера() - - ТребуетсяМониторингПамяти = _Конфигурация.ТребуетсяМониторингПамяти(); - КоличествоИтераций = 5; - - Для НомерИтерации = 1 По КоличествоИтераций Цикл - - _Хронометр.Старт(); - _Хронометр.Стоп(); - - Если ТребуетсяМониторингПамяти Тогда - _МониторПамяти.Начать(); - _МониторПамяти.Завершить(); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - Функция ВыполнитьИтерацию(Делегат, Этап, НомерИтерации, КоличествоВызовов) - ПроверитьИСоздатьТочкуВосстановления(Делегат.ИмяМетода(), _ТекущийИндексПараметров, Этап, НомерИтерации); - - Если ТребуетсяПропуститьИтерацию(Этап, НомерИтерации) Тогда - Возврат Неопределено; - КонецЕсли; - Наносекунд = 0; ВыделяемаяПамять = 0; @@ -382,20 +335,20 @@ Наносекунд = ЗамеритьВремя(Делегат, КоличествоВызовов); КонецЕсли; - РезультатИтерации = Новый РезультатИтерацииБенчмаркаДто(); - РезультатИтерации.Этап = Этап; - РезультатИтерации.НомерИтерации = НомерИтерации; - РезультатИтерации.КоличествоОпераций = КоличествоВызовов; - РезультатИтерации.Наносекунд = Наносекунд; - РезультатИтерации.НаносекундЗаОперацию = Наносекунд / КоличествоВызовов; - РезультатИтерации.ВыделяемаяПамять = ВыделяемаяПамять; + РезультатИтерации = Новый РезультатИтерацииКейса(); + РезультатИтерации.Этап = Этап; + РезультатИтерации.НомерИтерации = НомерИтерации; + РезультатИтерации.КоличествоОпераций = КоличествоВызовов; + РезультатИтерации.Наносекунд = Наносекунд; + РезультатИтерации.НаносекундЗаОперацию = Наносекунд / КоличествоВызовов; + РезультатИтерации.ВыделяемаяПамять = ВыделяемаяПамять; РезультатИтерации.ВыделяемаяПамятьЗаОперацию = ВыделяемаяПамять / КоличествоВызовов; Если НомерИтерации = 1 Тогда _Репортер.ВывестиСтроку(" "); КонецЕсли; - _Репортер.ВывестиСтроку(ПредставлениеРезультатаИтерации(РезультатИтерации), "Серый"); + _Репортер.ВывестиСтроку(Строка(РезультатИтерации), "Серый"); _БылоВыполнениеИтерации = Истина; @@ -412,6 +365,7 @@ ОсталосьВызовов = КоличествоВызовов; _Лог.Отладка("Начало замера времени <%1>", ИмяМетода); + _Хронометр.Старт(); // Хронометр должен быть "прогрет" Пока ОсталосьВызовов > 0 Цикл @@ -420,6 +374,7 @@ КонецЦикла; _Хронометр.Стоп(); + _Лог.Отладка("Окончание замера времени <%1>", ИмяМетода); Возврат _Хронометр.Наносекунд; @@ -435,6 +390,7 @@ ОсталосьВызовов = КоличествоВызовов; _Лог.Отладка("Начало замера памяти <%1>", ИмяМетода); + _МониторПамяти.Начать(); // Объект должен быть "прогрет" Пока ОсталосьВызовов > 0 Цикл @@ -443,6 +399,7 @@ КонецЦикла; ВыделеноБайт = _МониторПамяти.Завершить(); + _Лог.Отладка("Завершение замера памяти <%1>", ИмяМетода); Возврат ВыделеноБайт; @@ -512,87 +469,31 @@ КонецПроцедуры -Функция ПрочитатьОбщиеПараметрыИзИсточников() - - Результат = Новый Массив(); +Процедура ПрогретьИнструментыЗамера() - Для Каждого ИсточникПараметров Из _Конфигурация.ИсточникиПараметров() Цикл - Читатель = Новый ЧитательПараметровБенчмарков(ИсточникПараметров.Источник, _ОбъектБенчмарков); - ДополнитьМассив(Результат, Читатель.ПрочитатьКакОбщиеПараметры(ИсточникПараметров.ИмяПоля)); - КонецЦикла; + ТребуетсяМониторингПамяти = _Конфигурация.ТребуетсяМониторингПамяти(); + КоличествоИтераций = 5; - Возврат Результат; - -КонецФункции + Для НомерИтерации = 1 По КоличествоИтераций Цикл -Функция ПрочитатьПараметрыБенчмаркаИзИсточников(ДескрипторБенчмарка) + _Хронометр.Старт(); + _Хронометр.Стоп(); - Результат = Новый Массив(); + Если ТребуетсяМониторингПамяти Тогда + _МониторПамяти.Начать(); + _МониторПамяти.Завершить(); + КонецЕсли; - Для Каждого ИсточникПараметров Из ДескрипторБенчмарка.ИсточникиПараметров() Цикл - Читатель = Новый ЧитательПараметровБенчмарков(ИсточникПараметров, _ОбъектБенчмарков); - ДополнитьМассив(Результат, Читатель.ПрочитатьКакПараметрыБенчмарка(ДескрипторБенчмарка)); КонецЦикла; - - Возврат Результат; - -КонецФункции - -Функция ПредставлениеРезультатаИтерации(РезультатИтерации) - - ДлинаЭтапа = Макс( - СтрДлина(ЭтапыБенчмарка.Оценка), - СтрДлина(ЭтапыБенчмарка.Прогрев), - СтрДлина(ЭтапыБенчмарка.Измерение), - СтрДлина(ЭтапыБенчмарка.Память) - ); - ДлинаЭтапа = ДлинаЭтапа + 1; - - Представление = СтрШаблон("%1 %2: %3 op, ", - Лев(РезультатИтерации.Этап + " ", ДлинаЭтапа), - Лев("" + РезультатИтерации.НомерИтерации + " ", 2), - Формат(РезультатИтерации.КоличествоОпераций, "ЧГ=") - ); - - Если РезультатИтерации.Этап = ЭтапыБенчмарка.Память Тогда - - Возврат Представление + СтрШаблон( - "%1, %2/op", - ПредставленияПоказателейБенчмарков.ПредставлениеЧитаемое( - РезультатИтерации.ВыделяемаяПамять, - ЕдиницыИзмеренийБенчмарков.Байт - ), - ПредставленияПоказателейБенчмарков.ПредставлениеЧитаемое( - РезультатИтерации.ВыделяемаяПамятьЗаОперацию, - ЕдиницыИзмеренийБенчмарков.Байт - ) - ); - - Иначе - - Возврат Представление + СтрШаблон( - "%1, %2/op", - ПредставленияПоказателейБенчмарков.ПредставлениеЧитаемое( - РезультатИтерации.Наносекунд, - ЕдиницыИзмеренийБенчмарков.Наносекунда - ), - ПредставленияПоказателейБенчмарков.ПредставлениеЧитаемое( - РезультатИтерации.НаносекундЗаОперацию, - ЕдиницыИзмеренийБенчмарков.Наносекунда - ) - ); - - КонецЕсли; - -КонецФункции +КонецПроцедуры -Функция ЭтоПервыйЗапускКейса() +Функция ЭтоПервыйЗапуск() Возврат _Чекпоинт = Неопределено Или _Чекпоинт.Этап = ЭтапыБенчмарка.Измерение И _Чекпоинт.НомерИтерации = 1; КонецФункции -Процедура ПроверитьИСоздатьТочкуВосстановления(ИмяМетода, ИндексПараметров, Этап = "", НомерИтерации = 1) +Процедура ПроверитьИСоздатьЧекпоинт(Кейс, Этап = "", НомерИтерации = 1) Если _НовыйЧекпоинт <> Неопределено Тогда Возврат; @@ -603,8 +504,8 @@ КонецЕсли; _НовыйЧекпоинт = Новый ЧекпоинтЗапускаБенчмарков(); - _НовыйЧекпоинт.ИмяМетода = ИмяМетода; - _НовыйЧекпоинт.ИндексПараметров = ИндексПараметров; + _НовыйЧекпоинт.ИмяМетода = Кейс.ДескрипторБенчмарка().Метод(); + _НовыйЧекпоинт.ИдентификаторКейса = Кейс.Идентификатор(); Если ЗначениеЗаполнено(Этап) Тогда @@ -629,7 +530,7 @@ Возврат Ложь; КонецЕсли; - Если ИзолироватьКаждыйЗапускКейса() Тогда + Если ИзолироватьИтерации() Тогда Возврат _БылоВыполнениеИтерации; КонецЕсли; @@ -637,22 +538,6 @@ КонецФункции -Функция ТребуетсяПропуститьБенчмарк(ДескрипторБенчмарка) - - Возврат _НовыйЧекпоинт = Неопределено - И _Чекпоинт <> Неопределено - И _Чекпоинт.ИмяМетода <> ДескрипторБенчмарка.Метод() - И Не ТребуетсяЗапускНовогоПроцесса(); - -КонецФункции - -Функция ТребуетсяПропуститьПараметры(ИндексПараметров) - - Возврат _Чекпоинт <> Неопределено - И _Чекпоинт.ИндексПараметров > ИндексПараметров; - -КонецФункции - Функция ТребуетсяПропуститьИтерацию(Этап, НомерИтерации) Если _НовыйЧекпоинт <> Неопределено Тогда @@ -672,16 +557,8 @@ КонецФункции -Функция ИзолироватьКаждыйЗапускКейса() +Функция ИзолироватьИтерации() Возврат _Конфигурация.Стратегия() = СтратегииЗапускаБенчмарка.ХолодныйЗапуск; КонецФункции -Процедура ДополнитьМассив(Приемник, Источник) - - Для Каждого Значение Из Источник Цикл - Приемник.Добавить(Значение); - КонецЦикла; - -КонецПроцедуры - #КонецОбласти \ 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\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 f263afb..95c34a2 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" @@ -1,22 +1,24 @@ #Использовать logos -Перем _Лог; // Лог -Перем _Каталог; // Строка +Перем _Лог; // Лог +Перем _Каталог; // Строка Перем _ИскатьВПодкаталогах; // Булево -Перем _Конфигурация; // КонфигурацияБенчмарков +Перем _Конфигурация; // КонфигурацияБенчмарков // Запускает все бенчмарки, найденные в указанном каталоге // // Параметры: -// Каталог - Строка - Путь к каталогу с бенчмарками -// ИскатьВПодкаталогах - Булево - Сканировать все вложенные каталоги -// Конфигурация - КонфигурацияБенчмарков - Конфигурация, которая с приоритетом будет объединена -// с каждой конфигурацией бенчмарка +// Каталог - Строка - Путь к каталогу с бенчмарками +// ИскатьВПодкаталогах - Булево - Сканировать все вложенные каталоги +// Конфигурация - КонфигурацияБенчмарков - Конфигурация, которая с приоритетом будет объединена +// с каждой конфигурацией бенчмарка Процедура ПриСозданииОбъекта(Каталог, ИскатьВПодкаталогах = Ложь, Конфигурация = Неопределено) - _Каталог = Каталог; + + _Каталог = Каталог; _ИскатьВПодкаталогах = ИскатьВПодкаталогах; - _Конфигурация = Конфигурация; - _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.ЗапускательБенчмарковИзКаталога"); + _Конфигурация = Конфигурация; + _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.ЗапускательБенчмарковИзКаталога"); + КонецПроцедуры #Область ПрограммныйИнтерфейс @@ -25,10 +27,10 @@ // // Возвращаемое значение: // ТаблицаЗначений: -// * Результат - см. Бенчмаркинг.Запустить, Неопределено -// * ИмяФайла - Строка - Имя файла +// * Результат - РезультатЗапускаБенчмарков, Неопределено - см. Бенчмаркинг.Запустить +// * ИмяФайла - Строка - Имя файла // * ПолноеИмяФайла - Строка - Путь к файлу сценария -// * Успешно - Булево - Индикатор корректного выполнения +// * Успешно - Булево - Индикатор корректного выполнения Функция Запустить() Экспорт Результат = ТаблицаРезультата(); diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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 aec2a6d..31ad77c 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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" @@ -1,10 +1,12 @@ #Использовать fs #Использовать tempfiles #Использовать logos +#Использовать fluent Перем _Конфигурация; // КонфигурацияБенчмарков Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков Перем _Репортер; // КонсольныйРепортерБенчмарков, НулевойРепортерБенчмарков +Перем _МенеджерПроцессов; // МенеджерПроцессовБенчмарков, Неопределено Перем _ПортОтладки; // Число #Область ОбработчикиСобытий @@ -12,24 +14,23 @@ // Запускает бенчмарки // // Параметры: -// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки -// - КоллекцияДескрипторовБенчмарков -// - ДескрипторБенчмарка -// - Произвольный - Экземпляр класса с бенчмарками +// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки +// - ДескрипторБенчмарка - Отдельный дескриптор +// - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов +// - Произвольный - Экземпляр класса с бенчмарками // Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков Процедура ПриСозданииОбъекта(ИсточникБенчмарков, Конфигурация = Неопределено) - РезолверБенчмарков = Новый РезолверБенчмарков(ИсточникБенчмарков); - ТипКласса = РезолверБенчмарков.ТипКласса(); + АдаптерИсточникаБенчмарков = Новый АдаптерИсточникаБенчмарков(ИсточникБенчмарков); - _ДескрипторыБенчмарков = РезолверБенчмарков.Дескрипторы(); + _ДескрипторыБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьКоллекциюДескрипторов(); _Репортер = Новый КонсольныйРепортерБенчмарков(); _ПортОтладки = 0; Если Не Конфигурация = Неопределено Тогда _Конфигурация = Конфигурация; Иначе - _Конфигурация = Новый КонфигурацияБенчмарков(ТипКласса); + _Конфигурация = АдаптерИсточникаБенчмарков.СоздатьКонфигурацию(); КонецЕсли; КонецПроцедуры @@ -78,52 +79,99 @@ РезультатЗапуска.ДескрипторыБенчмарков = _ДескрипторыБенчмарков; РезультатЗапуска.Конфигурация = _Конфигурация; - МенеджерПроцессов = Новый МенеджерПроцессовБенчмарков( + _МенеджерПроцессов = Новый МенеджерПроцессовБенчмарков( _ДескрипторыБенчмарков, _Конфигурация, _Репортер, - _ПортОтладки); + _ПортОтладки + ); - ВерсииСреды = ПолучитьВерсииИсполняющейСреды(); + ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); + Кейсы = ГенераторКейсов.Сгенерировать(); - Для Каждого ИсполняющаяСреда Из ВерсииСреды Цикл - ЗапуститьБенчмаркиДляСреды(РезультатЗапуска, МенеджерПроцессов, ИсполняющаяСреда); - КонецЦикла; + ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска); - Если ВерсииСреды.Количество() > 1 Тогда + Если _Конфигурация.ИсполняющиеСреды().Количество() > 1 Тогда РезультатЗапуска.СредаОкружения.ВерсияИсполняющейСреды = ""; КонецЕсли; - РезультатЗапуска.ОпределитьЭталоны(); - РезультатЗапуска.ОбновитьСтатистику(); - РезультатЗапуска.ПостроитьОтчет(); + ВосстановитьКейсыЗапусков(РезультатЗапуска, Кейсы); + + РезультатЗапуска.УстановитьСвязиСЭталонами(); + РезультатЗапуска.ПересчитатьСтатистику(); + РезультатЗапуска.СформироватьОтчет(); Возврат РезультатЗапуска; КонецФункции -Процедура ЗапуститьБенчмаркиДляСреды(РезультатЗапуска, МенеджерПроцессов, ИсполняющаяСреда) +Процедура ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска) - Чекпоинт = Неопределено; + ВерсииСред = Новый Соответствие(); - Пока Истина Цикл + Для Каждого Кейс Из Кейсы Цикл - Если ЭтоПервыйЗапускКейса(Чекпоинт) Тогда - ВывестиЗаголовокСреды(ИсполняющаяСреда); + ИсполняющаяСреда = Кейс.ИсполняющаяСреда(); + + Если ВерсииСред[ИсполняющаяСреда] = Неопределено Тогда + ВерсииСред[ИсполняющаяСреда] = Новый Массив(); КонецЕсли; - ТекущийРезультат = МенеджерПроцессов.ЗапуститьПроцесс(ИсполняющаяСреда, Чекпоинт); + ВерсииСред[ИсполняющаяСреда].Добавить(Кейс); + + КонецЦикла; + + Для Каждого Строка Из ВерсииСред Цикл + + ИсполняющаяСреда = Строка.Ключ; + КейсыСреды = Строка.Значение; + + Если ИзолироватьИтерации() Тогда + + ЗапуститьКейсыВИзолированныхИтерациях(КейсыСреды, РезультатЗапуска); + + Иначе + + ЗапуститьКейсыИсполняющейСреде(КейсыСреды, ИсполняющаяСреда, РезультатЗапуска); - Если ТекущийРезультат = Неопределено Тогда - Продолжить; КонецЕсли; - Чекпоинт = ТекущийРезультат.Чекпоинт; + КонецЦикла; + +КонецПроцедуры + +Процедура ЗапуститьКейсыИсполняющейСреде(КейсыСреды, ИсполняющаяСреда, РезультатЗапуска) - ПрименитьИнформациюОСредеКЗапускам(ТекущийРезультат, ИсполняющаяСреда); - РезультатЗапуска.СредаОкружения = ТекущийРезультат.СредаОкружения; - - Если ИзолироватьКаждыйЗапускКейса() Тогда + ВывестиЗаголовокСреды(ИсполняющаяСреда); + + ТекущийРезультат = _МенеджерПроцессов.ЗапуститьПроцесс(КейсыСреды, ИсполняющаяСреда); + + Если ТекущийРезультат = Неопределено Тогда + Возврат; + КонецЕсли; + + РезультатЗапуска.СредаОкружения = ТекущийРезультат.СредаОкружения; + + ДобавитьВсеЗапускиВРезультат(РезультатЗапуска, ТекущийРезультат); + +КонецПроцедуры + +Процедура ЗапуститьКейсыВИзолированныхИтерациях(Кейсы, РезультатЗапуска) + + Чекпоинт = Неопределено; + + Для Каждого Кейс Из Кейсы Цикл + + Пока Истина Цикл + + ТекущийРезультат = _МенеджерПроцессов.ЗапуститьПроцесс(Кейс, Кейс.ИсполняющаяСреда(), Чекпоинт); + + Если ТекущийРезультат = Неопределено Тогда + Прервать; + КонецЕсли; + + Чекпоинт = ТекущийРезультат.Чекпоинт; + РезультатЗапуска.СредаОкружения = ТекущийРезультат.СредаОкружения; ОбработатьИзолированныйЗапуск(РезультатЗапуска, ТекущийРезультат, Чекпоинт); @@ -132,12 +180,7 @@ Прервать; КонецЕсли; - Иначе - - ДобавитьВсеЗапускиВРезультат(РезультатЗапуска, ТекущийРезультат); - Прервать; - - КонецЕсли; + КонецЦикла; КонецЦикла; @@ -178,33 +221,13 @@ КонецФункции -// Проверяет возможность объединения замеров текущего запуска с предыдущим -// Объединение возможно если: -// - Предыдущий запуск существует -// - Запуски относятся к одному методу бенчмарка -// - Нет пересечений по итерациям замеров Функция МожноОбъединитьСПредыдущимЗапуском(ПредыдущийЗапуск, ТекущийЗапуск) Если ПредыдущийЗапуск = Неопределено Тогда Возврат Ложь; КонецЕсли; - - Если ПредыдущийЗапуск.ДескрипторБенчмарка.Метод() <> ТекущийЗапуск.ДескрипторБенчмарка.Метод() Тогда - Возврат Ложь; - КонецЕсли; - - // Проверяем, что нет пересечений замеров - Для Каждого ТекущийЗамер Из ТекущийЗапуск.Замеры Цикл - НайденныйЗамер = ПредыдущийЗапуск.НайтиИтерациюЗамера( - ТекущийЗамер.Этап, - ТекущийЗамер.НомерИтерации); - - Если НайденныйЗамер <> Неопределено Тогда - Возврат Ложь; - КонецЕсли; - КонецЦикла; - - Возврат Истина; + + Возврат ПредыдущийЗапуск.Кейс.Идентификатор() = ТекущийЗапуск.Кейс.Идентификатор(); КонецФункции @@ -224,39 +247,23 @@ КонецПроцедуры -Функция ПолучитьВерсииИсполняющейСреды() - - ВерсииСреды = _Конфигурация.ВерсииИсполняющейСреды(); - ВыполнятьВТекущейВерсии = ВерсииСреды.Количество() = 0; - - Если ВыполнятьВТекущейВерсии Тогда - ВерсииСреды.Добавить(); - КонецЕсли; +Процедура ВосстановитьКейсыЗапусков(РезультатЗапускаБенчмарка, Кейсы) - Возврат ВерсииСреды; + КартаКейсов = Новый Соответствие(); -КонецФункции + Для Каждого Кейс Из Кейсы Цикл + КартаКейсов.Вставить(Кейс.Идентификатор(), Кейс); + КонецЦикла; -Процедура ПрименитьИнформациюОСредеКЗапускам(РезультатЗапуска, ИсполняющаяСреда) - - ВыполнятьВТекущейВерсии = Не ЗначениеЗаполнено(ИсполняющаяСреда.Версия); - - Для Каждого Запуск Из РезультатЗапуска.Запуски Цикл - - Если ВыполнятьВТекущейВерсии Тогда - Запуск.ИсполняющаяСреда.Версия = ""; - Иначе - Запуск.ИсполняющаяСреда.Алиас = ИсполняющаяСреда.Версия; - Запуск.ИсполняющаяСреда.Наименование = ИсполняющаяСреда.Наименование; - КонецЕсли; - + Для Каждого РезультатЗапускаКейса Из РезультатЗапускаБенчмарка.Запуски Цикл + РезультатЗапускаКейса.Кейс = КартаКейсов[РезультатЗапускаКейса.Кейс.Идентификатор()]; КонецЦикла; - + КонецПроцедуры Процедура ВывестиЗаголовокСреды(ИсполняющаяСреда) - Если ЗначениеЗаполнено(ИсполняющаяСреда.Версия) Тогда + Если ИсполняющаяСреда <> Неопределено И ЗначениеЗаполнено(ИсполняющаяСреда.Версия) Тогда Версия = ИсполняющаяСреда.Версия; Иначе Версия = Новый СистемнаяИнформация().Версия; @@ -274,31 +281,20 @@ КонецЕсли; Если ЧекпоинтПредыдущий = Неопределено И ЧекпоинтСледующий <> Неопределено Тогда - Возврат ЭтоПервыйЗапускКейса(ЧекпоинтСледующий); + Возврат ЭтоПервыйЗапуск(ЧекпоинтСледующий); КонецЕсли; - Возврат Не ЧекпоинтыСсылаютсяНаОдинКейс(ЧекпоинтПредыдущий, ЧекпоинтСледующий); + Возврат ЧекпоинтПредыдущий.ИдентификаторКейса <> ЧекпоинтСледующий.ИдентификаторКейса; КонецФункции -Функция ЭтоПервыйЗапускКейса(Чекпоинт) +Функция ЭтоПервыйЗапуск(Чекпоинт) Возврат Чекпоинт = Неопределено Или Чекпоинт.Этап = ЭтапыБенчмарка.Измерение И Чекпоинт.НомерИтерации = 1; КонецФункции -Функция ИзолироватьКаждыйЗапускКейса() +Функция ИзолироватьИтерации() Возврат _Конфигурация.Стратегия() = СтратегииЗапускаБенчмарка.ХолодныйЗапуск; КонецФункции -Функция ЧекпоинтыСсылаютсяНаОдинКейс(Чекпоинт1, Чекпоинт2) - - Если Чекпоинт1 = Неопределено Или Чекпоинт2 = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - Возврат Чекпоинт1.ИмяМетода = Чекпоинт2.ИмяМетода - И Чекпоинт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\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\260\321\217\320\241\321\200\320\265\320\264\320\260\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/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\260\321\217\320\241\321\200\320\265\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" similarity index 68% rename from "src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\260\321\217\320\241\321\200\320\265\320\264\320\260\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" rename to "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\260\321\217\320\241\321\200\320\265\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index eff176b..3ef6a47 100644 --- "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\260\321\217\320\241\321\200\320\265\320\264\320\260\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/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\321\217\321\216\321\211\320\260\321\217\320\241\321\200\320\265\320\264\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -4,18 +4,18 @@ &Тип("Строка") Перем Версия Экспорт; // Строка -&Сериализуемое("Alias") -&Тип("Строка") -Перем Алиас Экспорт; // Строка - &Сериализуемое("Name") &Тип("Строка") Перем Наименование Экспорт; // Строка +&Сериализуемое("Baseline") +&Тип("Булево") +Перем ЭтоЭталон Экспорт; // Булево + Процедура ПриСозданииОбъекта() - Версия = ""; - Алиас = ""; + Версия = ""; Наименование = ""; + ЭтоЭталон = Ложь; КонецПроцедуры \ No newline at end of file diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\265\320\271\321\201\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\232\320\265\320\271\321\201\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..228372e --- /dev/null +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\265\320\271\321\201\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -0,0 +1,66 @@ +Перем _Идентификатор; // Число +Перем _Дескриптор; // ДескрипторБенчмарка +Перем _Параметры; // Массив из ПараметрБенчмарка +Перем _ИсполняющаяСреда; // ИсполняющаяСредаБенчмарков + +#Область ОбработчикиСобытий + +Процедура ПриСозданииОбъекта(Идентификатор, Дескриптор, Параметры, ИсполняющаяСреда = Неопределено) + + _Идентификатор = Идентификатор; + _Дескриптор = Дескриптор; + _Параметры = Параметры; + + Если ИсполняющаяСреда = Неопределено Тогда + _ИсполняющаяСреда = Новый ИсполняющаяСредаБенчмарков(); + Иначе + _ИсполняющаяСреда = ИсполняющаяСреда; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Возвращает уникальный идентификатор кейса бенчмарка +// +// Возвращаемое значение: +// Число +Функция Идентификатор() Экспорт + Возврат _Идентификатор; +КонецФункции + +// Возвращает дескриптор бенчмарка +// +// Возвращаемое значение: +// ДескрипторБенчмарка +Функция ДескрипторБенчмарка() Экспорт + Возврат _Дескриптор; +КонецФункции + +// Устанавливает дескриптор бенчмарка +// +// Параметры: +// Дескриптор - ДескрипторБенчмарка +Процедура УстановитьДескрипторБенчмарка(Дескриптор) Экспорт + _Дескриптор = Дескриптор; +КонецПроцедуры + +// Возвращает параметры запуска бенчмарка +// +// Возвращаемое значение: +// Массив из ПараметрБенчмарка +Функция Параметры() Экспорт + Возврат _Параметры; +КонецФункции + +// Возвращает исполняющую среду бенчмарка +// +// Возвращаемое значение: +// ИсполняющаяСредаБенчмарков +Функция ИсполняющаяСреда() Экспорт + Возврат _ИсполняющаяСреда; +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\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\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 9e30155..4d1d492 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\273\320\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\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\276\320\275\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -38,13 +38,13 @@ // Значение по результатам замеров // // Параметры: -// РезультатЗапускаБенчмарка - РезультатЗапускаБенчмаркаДто +// РезультатЗапускаКейса - РезультатЗапускаКейса // Колонка - КолонкаОтчетаБенчмарков // // Возвращаемое значение: // Произвольный -Функция Значение(РезультатЗапускаБенчмарка, Колонка) Экспорт - Возврат ДелегатЗначение.Выполнить(РезультатЗапускаБенчмарка, Колонка); +Функция Значение(РезультатЗапускаКейса, Колонка) Экспорт + Возврат ДелегатЗначение.Выполнить(РезультатЗапускаКейса, Колонка); КонецФункции // Представление значения 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 8cd022a..5720d4b 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" @@ -75,12 +75,9 @@ Перем _Экспортеры; // Массив из Произвольный - см. ЭкспортерыРезультатовБенчмарков &Сериализуемое("RuntimeVersions") -&СериализуемыйКлюч("Версия", "Version") -&СериализуемыйКлюч("Наименование", "Name") -&СериализуемыйКлюч("ЭтоЭталон", "Baseline") -&Тип("ТаблицаЗначений") -&Геттер("ВерсииИсполняющейСреды") -Перем _ВерсииИсполняющейСреды; // ТаблицаЗначений +&Тип("Массив") &ДляКаждого &Тип("ИсполняющаяСредаБенчмарков") +&Геттер("ИсполняющиеСреды") +Перем _ИсполняющиеСреды; // Массив из ИсполняющаяСредаБенчмарков &Несериализуемое Перем _ЗначенияПолейПоУмолчанию; // Соответствие @@ -116,7 +113,7 @@ _Обработчики = Новый Массив(); _Колонки = Новый Массив(); _Экспортеры = Новый Массив(); - _ВерсииИсполняющейСреды = ПустаяТаблицаВерсииИсполняющейСреды(); + _ИсполняющиеСреды = Новый Массив(); _МодифицированныеПоля = Новый Соответствие(); _Рефлектор = Новый Рефлектор(); @@ -435,8 +432,10 @@ // // Параметры: // ИмяПоля - Строка - Имя экспортного поля в сценарии бенчмарка -// Источник - Строка - Имя экспортного метода. Может быть задано в формате: -// <ИмяТипаИлиМодуля>.<ИмяМетода> или <ИмяМетода> (в сценарии бенчмарков). +// Источник - Строка - Имя экспортного метода-источника данных. +// Форматы: +// - <ИмяМетода> - Метод из текущего класса бенчмарков +// - <ИмяТипа>.<ИмяМетода> - Метод из указанного типа/модуля // // Возвращаемое значение: // ЭтотОбъект @@ -566,7 +565,7 @@ // * Контекст - Структура: // ** Конфигурация - КонфигурацияБенчмарков // ** ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков -// ** Запуски - Массив из РезультатЗапускаБенчмаркаДто +// ** Запуски - Массив из РезультатЗапускаКейса // ** Отчет - ОтчетБенчмарков // ** СредаОкружения - СредаОкруженияБенчмарков // @@ -576,8 +575,7 @@ // // Параметры события: // * Контекст - Структура: -// ** ДескрипторБенчмарка - ДескрипторБенчмарка -// ** ПараметрыМетода - Массив из Произвольный +// ** Кейс - КейсБенчмарка // // ПослеКаждого - Вызывается после каждого запуска бенчмарка. // Он используется для постобработки: валидации результатов, сброса временных значений @@ -585,16 +583,15 @@ // // Параметры события: // * Контекст - Структура: -// ** ДескрипторБенчмарка - ДескрипторБенчмарка -// ** Параметры - Массив из ПараметрБенчмарка -// ** Замеры - Массив из РезультатИтерацииБенчмаркаДто +// ** Кейс - КейсБенчмарка +// ** Замеры - Массив из РезультатИтерацииКейса // ** Статистика - СтатистикаБенчмарка // // Параметры: // КвалифицированноеИмяМетода - Строка - Имя метода в формате: -// - <ИмяМетода> - Имя метода класса бенчмарков +// - <ИмяМетода> - Имя метода класса бенчмарков // - <ИмяМодуля>.<ИмяМетода> - Метод модуля -// - <ИмяТипа>.<ИмяМетода> - Метод экземпляра указанного типа +// - <ИмяТипа>.<ИмяМетода> - Метод экземпляра указанного типа // Событие - Строка - см. СобытияБенчмарков // // Возвращаемое значение: @@ -620,7 +617,7 @@ _Обработчики = ПроцессорыКоллекций.ИзКоллекции(_Обработчики) .Фильтровать("Обработчик -> Обработчик.Событие() <> ИмяСобытия", Новый Структура("ИмяСобытия", ИмяСобытия)) - .Получить(Тип("Массив")); + .ВМассив(); УстановитьМодифицированность(ИмяПоля_ОбработчикиСобытий()); @@ -660,7 +657,7 @@ Обработчики = ПроцессорыКоллекций.ИзКоллекции(_Обработчики) .Фильтровать("Обработчик -> Обработчик.Событие() = ИмяСобытия", Новый Структура("ИмяСобытия", ИмяСобытия)) - .Получить(Тип("Массив")); + .ВМассив(); Возврат Обработчики; @@ -786,64 +783,64 @@ КонецФункции -// Добавляет версию исполняющей среды OneScript +// Добавляет исполняющую среду OneScript // // Параметры: -// Версия - Строка - Версия OneScript (x.x.x, stable, dev) или путь к oscript.exe. -// Наименование - Строка - Имя среды для отчета. -// ЭтоЭталон - Булево - Использовать как эталонную среду для сравнения результатов. +// Версия - Строка - Версия OneScript (x.x.x, stable, dev) или путь к oscript.exe +// Наименование - Строка - Имя среды для отчета +// ЭтоЭталон - Булево - Использовать как эталонную среду для сравнения результатов // // Возвращаемое значение: // ЭтотОбъект -Функция ДобавитьВерсиюИсполняющейСреды(Версия, Наименование = "", ЭтоЭталон = Ложь) Экспорт +Функция ДобавитьИсполняющуюСреду(Версия, Наименование = "", ЭтоЭталон = Ложь) Экспорт + + ИсполняющаяСреда = Новый ИсполняющаяСредаБенчмарков(); + ИсполняющаяСреда.Версия = Версия; + ИсполняющаяСреда.Наименование = Наименование; + ИсполняющаяСреда.ЭтоЭталон = ЭтоЭталон; - ДанныеСреды = _ВерсииИсполняющейСреды.Добавить(); - ДанныеСреды.Версия = Версия; - ДанныеСреды.Наименование = Наименование; - ДанныеСреды.ЭтоЭталон = ЭтоЭталон; + _ИсполняющиеСреды.Добавить(ИсполняющаяСреда); - УстановитьМодифицированность(ИмяПоля_ВерсииИсполняющейСреды()); + УстановитьМодифицированность(ИмяПоля_ИсполняющиеСреды()); Возврат ЭтотОбъект; КонецФункции -// Версии исполняющей среды OneScript +// Исполняющие среды OneScript // // Возвращаемое значение: // ТаблицаЗначений: // * Версия - Строка - Версия OneScript (x.x.x, stable, dev) или путь к oscript.exe. // * Наименование - Строка - Имя для отчетов. // * ЭтоЭталон - Булево - Использовать как эталонную среду для сравнения результатов. -Функция ВерсииИсполняющейСреды() Экспорт - Возврат _ВерсииИсполняющейСреды.Скопировать(); +Функция ИсполняющиеСреды() Экспорт + Возврат Новый Массив(Новый ФиксированныйМассив(_ИсполняющиеСреды)); КонецФункции -// Очищает версии исполняющей среды OneScript +// Очищает исполняющие среды OneScript // // Возвращаемое значение: // ЭтотОбъект -Функция ОчиститьВерсииИсполняющейСреды() Экспорт +Функция ОчиститьИсполняющиеСреды() Экспорт - _ВерсииИсполняющейСреды.Очистить(); - УстановитьМодифицированность(ИмяПоля_ВерсииИсполняющейСреды()); + _ИсполняющиеСреды.Очистить(); + УстановитьМодифицированность(ИмяПоля_ИсполняющиеСреды()); Возврат ЭтотОбъект; КонецФункции -// Возвращает эталонную версию исполняющей среды OneScript +// Возвращает эталонную исполняющую среду OneScript // // Возвращаемое значение: -// Строка -Функция ЭталоннаяВерсияИсполняющейСреды() Экспорт - - НайденнаяСтрока = _ВерсииИсполняющейСреды.Найти(Истина, "ЭтоЭталон"); - Если НайденнаяСтрока = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; +// ИсполняющаяСредаБенчмарков, Неопределено +Функция ЭталоннаяИсполняющаяСреда() Экспорт - Возврат НайденнаяСтрока.Версия; + Возврат ПроцессорыКоллекций + .ИзКоллекции(_ИсполняющиеСреды) + .Фильтровать("Среда -> Среда.ЭтоЭталон") + .ПолучитьПервый(); КонецФункции @@ -933,7 +930,7 @@ ПрименитьМодифицированныеОбработчикиСобытий(ЗначенияМодифицированныхПолей); ПрименитьМодифицированныеКолонки(ЗначенияМодифицированныхПолей); ПрименитьМодифицированныеЭкспортеры(ЗначенияМодифицированныхПолей); - ПрименитьМодифицированныеВерсииИсполняющейСреды(ЗначенияМодифицированныхПолей); + ПрименитьМодифицированныеИсполняющиеСреды(ЗначенияМодифицированныхПолей); Возврат ЭтотОбъект; @@ -1030,14 +1027,6 @@ КонецФункции -Функция ПустаяТаблицаВерсииИсполняющейСреды() - Таблица = Новый ТаблицаЗначений(); - Таблица.Колонки.Добавить("Версия"); - Таблица.Колонки.Добавить("Наименование"); - Таблица.Колонки.Добавить("ЭтоЭталон"); - Возврат Таблица; -КонецФункции - Функция ПустаяТаблицаИсточникиПараметров() Таблица = Новый ТаблицаЗначений(); Таблица.Колонки.Добавить("ИмяПоля"); @@ -1202,16 +1191,16 @@ КонецПроцедуры -Процедура ПрименитьМодифицированныеВерсииИсполняющейСреды(ЗначенияМодифицированныхПолей) +Процедура ПрименитьМодифицированныеИсполняющиеСреды(ЗначенияМодифицированныхПолей) - Если ЗначенияМодифицированныхПолей[ИмяПоля_ВерсииИсполняющейСреды()] = Неопределено Тогда + Если ЗначенияМодифицированныхПолей[ИмяПоля_ИсполняющиеСреды()] = Неопределено Тогда Возврат; КонецЕсли; - ОчиститьВерсииИсполняющейСреды(); + ОчиститьИсполняющиеСреды(); - Для Каждого ДанныеСреды Из ЗначенияМодифицированныхПолей[ИмяПоля_ВерсииИсполняющейСреды()] Цикл - ДобавитьВерсиюИсполняющейСреды(ДанныеСреды.Версия, ДанныеСреды.Наименование, ДанныеСреды.ЭтоЭталон); + Для Каждого ДанныеСреды Из ЗначенияМодифицированныхПолей[ИмяПоля_ИсполняющиеСреды()] Цикл + ДобавитьИсполняющуюСреду(ДанныеСреды.Версия, ДанныеСреды.Наименование, ДанныеСреды.ЭтоЭталон); КонецЦикла; КонецПроцедуры @@ -1276,8 +1265,8 @@ Возврат "Экспортеры"; КонецФункции -Функция ИмяПоля_ВерсииИсполняющейСреды() - Возврат "ВерсииИсполняющейСреды"; +Функция ИмяПоля_ИсполняющиеСреды() + Возврат "ИсполняющиеСреды"; КонецФункции #КонецОбласти diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\320\265\320\275\320\270\320\262\321\213\320\271\320\224\320\265\320\273\320\265\320\263\320\260\321\202.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\320\265\320\275\320\270\320\262\321\213\320\271\320\224\320\265\320\273\320\265\320\263\320\260\321\202.os" deleted file mode 100644 index f13e37a..0000000 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\233\320\265\320\275\320\270\320\262\321\213\320\271\320\224\320\265\320\273\320\265\320\263\320\260\321\202.os" +++ /dev/null @@ -1,90 +0,0 @@ -Перем _КвалифицированноеИмяМетода; // Строка -Перем _Объект; // Произвольный -Перем _Действие; // Действие, Неопределено - -#Область ОбработчикиСобытий - -// Конструктор делегата. Инициализирует параметры для последующего создания делегата. -// -// Параметры: -// КвалифицированноеИмяМетода - Строка - Имя метода в формате: -// - <ИмяМетода> - Имя метода объекта. Требует указания параметра Объект -// - <ИмяМодуля>.<ИмяМетода> - Метод модуля -// - <ИмяТипа>.<ИмяМетода> - Метод экземпляра указанного типа -// Объект - Произвольный - Объект, содержащий метод. Обязателен для формата <ИмяМетода>. -// -Процедура ПриСозданииОбъекта(КвалифицированноеИмяМетода, Объект = Неопределено) - _КвалифицированноеИмяМетода = КвалифицированноеИмяМетода; - _Объект = Объект; -КонецПроцедуры - -#КонецОбласти - -#Область ПрограммныйИнтерфейс - -// Создает и возвращает объект Действие для указанного метода. -// Анализирует квалифицированное имя метода и определяет способ создания делегата. -// -// Возвращаемое значение: -// Действие - Делегат для вызова метода -Функция Получить() Экспорт - - Если _Действие <> Неопределено Тогда - Возврат _Действие; - КонецЕсли; - - Части = СтрРазделить(_КвалифицированноеИмяМетода, "."); - КоличествоЧастей = Части.Количество(); - - Если КоличествоЧастей = 1 Тогда - - Если Не ЗначениеЗаполнено(_Объект) Тогда - ВызватьИсключение СтрШаблон( - "Для создания делегата <%1> не указан объект", _КвалифицированноеИмяМетода); - КонецЕсли; - - _Действие = Новый Действие(_Объект, _КвалифицированноеИмяМетода); - - ИначеЕсли КоличествоЧастей = 2 Тогда - - Имя = Части[0]; - Метод = Части[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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\321\200\320\276\321\206\320\265\321\201\321\201\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\321\200\320\276\321\206\320\265\321\201\321\201\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 946e435..cb8f9cc 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\321\200\320\276\321\206\320\265\321\201\321\201\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\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\321\200\320\276\321\206\320\265\321\201\321\201\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" @@ -2,17 +2,17 @@ #Использовать tempfiles #Использовать logos -Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков -Перем _Конфигурация; // КонфигурацияБенчмарков -Перем _КонфигурацияЗапуска; // КонфигурацияБенчмарков, Неопределено -Перем _Репортер; // КонсольныйРепортерБенчмарков, НулевойРепортерБенчмарков -Перем _ПортОтладки; // Число -Перем _ЖурналСообщенийПроцесса; // Массив -Перем _ЛокаторИсполняющейСреды; // ЛокаторИсполняющейСреды -Перем _МенеджерВременныхФайлов; // МенеджерВременныхФайлов -Перем _СценарийЗапуска; // СценарийЗапускаБенчмарка +Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков +Перем _Конфигурация; // КонфигурацияБенчмарков +Перем _КонфигурацияЗапуска; // КонфигурацияБенчмарков, Неопределено +Перем _Репортер; // КонсольныйРепортерБенчмарков, НулевойРепортерБенчмарков +Перем _ПортОтладки; // Число +Перем _ЖурналСообщенийПроцесса; // Массив +Перем _ЛокаторИсполняющейСреды; // ЛокаторИсполняющейСреды +Перем _МенеджерВременныхФайлов; // МенеджерВременныхФайлов +Перем _СценарийЗапуска; // СценарийЗапускаБенчмарка Перем _МенеджерПараметровКонфигурации; // МенеджерПараметровКонфигурацииOneScript -Перем _Лог; // Лог +Перем _Лог; // Лог #Область ОбработчикиСобытий @@ -26,18 +26,18 @@ // ПортОтладки - Число - Порт для подключения отладчика к процессу Процедура ПриСозданииОбъекта(ДескрипторыБенчмарков, Конфигурация, Репортер, ПортОтладки = 0) - _ДескрипторыБенчмарков = ДескрипторыБенчмарков; - _Конфигурация = Конфигурация; - _Репортер = Репортер; - _ПортОтладки = ПортОтладки; + _ДескрипторыБенчмарков = ДескрипторыБенчмарков; + _Конфигурация = Конфигурация; + _Репортер = Репортер; + _ПортОтладки = ПортОтладки; _ЖурналСообщенийПроцесса = Новый Массив(); _ЛокаторИсполняющейСреды = Новый ЛокаторИсполняющейСреды(); _МенеджерВременныхФайлов = Новый МенеджерВременныхФайлов(); _КонфигурацияЗапуска = _Конфигурация - .Скопировать() - .УдалитьЭкспортеры() - .ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Json); + .Скопировать() + .УдалитьЭкспортеры() + .ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Json); _СценарийЗапуска = Новый СценарийЗапускаБенчмарка(_ДескрипторыБенчмарков, _КонфигурацияЗапуска); @@ -52,23 +52,25 @@ #Область ПрограммныйИнтерфейс -// Запускает бенчмарк в отдельном процессе с указанной исполняющей средой, +// Запускает бенчмарк в отдельном процессе для указанного кейса, // ожидает завершения выполнения и возвращает результаты. // // Параметры: -// ИсполняющаяСреда - ИсполняющаяСредаБенчмарковДто - Исполняющая среда -// Чекпоинт - ЧекпоинтЗапускаБенчмарков - Точка восстановления для продолжения выполнения +// Кейсы - Массив из КейсБенчмарка - Кейсы бенчмарков +// - КейсБенчмарка - Кейс бенчмарка +// ИсполняющаяСреда - ИсполняющаяСредаБенчмарков - Исполняющая среда +// Чекпоинт - ЧекпоинтЗапускаБенчмарков - Точка восстановления для продолжения выполнения // // Возвращаемое значение: // РезультатЗапускаБенчмарков, Неопределено -Функция ЗапуститьПроцесс(ИсполняющаяСреда, Чекпоинт) Экспорт +Функция ЗапуститьПроцесс(Кейсы, ИсполняющаяСреда = Неопределено, Чекпоинт = Неопределено) Экспорт КаталогАртефактов = _МенеджерВременныхФайлов.НовоеИмяФайла(); _ЖурналСообщенийПроцесса.Очистить(); _КонфигурацияЗапуска.УстановитьКаталогАртефактов(КаталогАртефактов); - Если ЗначениеЗаполнено(ИсполняющаяСреда.Версия) Тогда + Если ИсполняющаяСреда <> Неопределено И ЗначениеЗаполнено(ИсполняющаяСреда.Версия) Тогда ФайлИлиВерсия = ИсполняющаяСреда.Версия; Версия = ИсполняющаяСреда.Версия; Иначе @@ -80,7 +82,7 @@ ФС.ОбеспечитьПустойКаталог(КаталогАртефактов); - Процесс = СоздатьИЗапуститьПроцесс(ФайлИлиВерсия, Чекпоинт); + Процесс = СоздатьИЗапуститьПроцесс(ФайлИлиВерсия, Кейсы, Чекпоинт); ОжидатьЗавершениеПроцесса(Процесс); ОбработатьВыполнениеПроцесса(Процесс, Версия); @@ -99,13 +101,13 @@ #Область СлужебныеПроцедурыИФункции -Функция СоздатьИЗапуститьПроцесс(Версия, Чекпоинт) +Функция СоздатьИЗапуститьПроцесс(Версия, Кейсы, Чекпоинт = Неопределено) РабочийКаталог = _МенеджерВременныхФайлов.СоздатьКаталог(); ПутьИсполняемогоФайла = ОпределитьИсполняемыйФайл(Версия); ПутьФайлаСценария = ОбъединитьПути(РабочийКаталог, "benchmark-entry.os"); - _СценарийЗапуска.Записать(ПутьФайлаСценария, Чекпоинт); + _СценарийЗапуска.Записать(ПутьФайлаСценария, Кейсы, Чекпоинт); _МенеджерПараметровКонфигурации.ЗаписатьВКаталог(РабочийКаталог); СтрокаКоманды = СформироватьСтрокуКоманды(ПутьИсполняемогоФайла, ПутьФайлаСценария); 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\227\320\260\320\277\321\203\321\201\320\272\320\260\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/core/\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\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" similarity index 83% rename from "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\227\320\260\320\277\321\203\321\201\320\272\320\260\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" rename to "src/BenchmarkOneScript/core/\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\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 4943ee7..49eb1c9 100644 --- "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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/core/\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\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -8,6 +8,10 @@ &Тип("КонфигурацияБенчмарков") Перем Конфигурация Экспорт; // КонфигурацияБенчмарков +&Сериализуемое("CaseIds") +&Тип("Массив") &ДляКаждого &Тип("Число") +Перем ИдентификаторыКейсов Экспорт; // Массив из Число + &Сериализуемое("Checkpoint") &Тип("ЧекпоинтЗапускаБенчмарков") Перем Чекпоинт Экспорт; // ЧекпоинтЗапускаБенчмарков, Неопределено diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\241\320\276\320\261\321\213\321\202\320\270\321\217\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\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\241\320\276\320\261\321\213\321\202\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 7638967..a3b0bd5 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\241\320\276\320\261\321\213\321\202\320\270\321\217\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\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\241\320\276\320\261\321\213\321\202\320\270\321\217\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -18,9 +18,9 @@ // // Параметры: // КвалифицированноеИмяМетода - Строка - Имя метода в формате: -// - <ИмяМетода> - Имя метода класса бенчмарков +// - <ИмяМетода> - Имя метода класса бенчмарков // - <ИмяМодуля>.<ИмяМетода> - Метод модуля -// - <ИмяТипа>.<ИмяМетода> - Метод экземпляра указанного типа +// - <ИмяТипа>.<ИмяМетода> - Метод экземпляра указанного типа // Событие - Строка - см. СобытияБенчмарков Процедура ПриСозданииОбъекта(КвалифицированноеИмяМетода = "", Событие = "") _КвалифицированноеИмяМетода = КвалифицированноеИмяМетода; @@ -61,10 +61,10 @@ Возврат _Делегат; КонецЕсли; - ЛенивыйДелегат = Новый ЛенивыйДелегат(_КвалифицированноеИмяМетода, Объект); + ФабрикаДелегата = Новый ФабрикаДелегата(_КвалифицированноеИмяМетода, Объект); _Объект = Объект; - _Делегат = ЛенивыйДелегат.Получить(); + _Делегат = ФабрикаДелегата.Создать(); Возврат _Делегат; diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\236\321\202\321\207\320\265\321\202\320\260\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\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index a944ea6..0c2a200 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\236\321\202\321\207\320\265\321\202\320\260\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\237\320\276\321\201\321\202\321\200\320\276\320\270\321\202\320\265\320\273\321\214\320\236\321\202\321\207\320\265\321\202\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,23 +1,21 @@ #Использовать lambdas Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков -Перем _Конфигурация; // КонфигурацияБенчмарков -Перем _ЗапускиБенчмарков; // Массив из РезультатЗапускаБенчмаркаДто -Перем _Отчет; // ОтчетБенчмарков -Перем _КолонкиКонфигурации; // Массив из Строка +Перем _Конфигурация; // КонфигурацияБенчмарков +Перем _ЗапускиКейсов; // Массив из РезультатЗапускаКейса +Перем _Отчет; // ОтчетБенчмарков +Перем _КолонкиКонфигурации; // Массив из Строка // Построитель отчета по результатам запуска бенчмарков // // Параметры: -// ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков -// Конфигурация - КонфигурацияБенчмарков -// ЗапускиБенчмарков - Массив из РезультатЗапускаБенчмаркаДто -Процедура ПриСозданииОбъекта(ДескрипторыБенчмарков, Конфигурация, ЗапускиБенчмарков) +// РезультатЗапускаБенчмарков - РезультатЗапускаБенчмарков +Процедура ПриСозданииОбъекта(РезультатЗапускаБенчмарков) - _ДескрипторыБенчмарков = ДескрипторыБенчмарков; - _Конфигурация = Конфигурация; - _ЗапускиБенчмарков = ЗапускиБенчмарков; - _КолонкиКонфигурации = _Конфигурация.Колонки(); + _ДескрипторыБенчмарков = РезультатЗапускаБенчмарков.ДескрипторыБенчмарков; + _Конфигурация = РезультатЗапускаБенчмарков.Конфигурация; + _ЗапускиКейсов = РезультатЗапускаБенчмарков.Запуски; + _КолонкиКонфигурации = _Конфигурация.Колонки(); КонецПроцедуры @@ -51,7 +49,8 @@ Процедура ДобавитьКолонки() ДобавитьКолонкуПорядкаПоУмолчанию(); - ДобавитьКолонкуРезультатаЗапускаБенчмарка(); + ДобавитьКолонкуРезультатаЗапускаКейса(); + ДобавитьКолонкуГруппаЭталона(); ДобавитьКолонку(КолонкиОтчетаБенчмарков.СоздатьМетод()); ДобавитьКолонкуКатегория(); ДобавитьКолонкиПараметров(); @@ -77,16 +76,20 @@ _Отчет.Таблица.Колонки.Добавить(ИмяКолонкиПорядокПоУмолчанию()); КонецПроцедуры -Процедура ДобавитьКолонкуРезультатаЗапускаБенчмарка() - _Отчет.Таблица.Колонки.Добавить(ИмяКолонкиРезультатаЗапускаБенчмарка()); +Процедура ДобавитьКолонкуРезультатаЗапускаКейса() + _Отчет.Таблица.Колонки.Добавить(ИмяКолонкиРезультатаЗапускаКейса()); +КонецПроцедуры + +Процедура ДобавитьКолонкуГруппаЭталона() + _Отчет.Таблица.Колонки.Добавить(ИмяКолонкиГруппаЭталона()); КонецПроцедуры Процедура ДобавитьКолонкиПараметров() ДобавленныеИмена = Новый Соответствие(); - Для Каждого РезультатЗапускаБенчмарка Из _ЗапускиБенчмарков Цикл - Для Каждого Параметр Из РезультатЗапускаБенчмарка.Параметры Цикл + Для Каждого РезультатЗапускаКейса Из _ЗапускиКейсов Цикл + Для Каждого Параметр Из РезультатЗапускаКейса.Кейс.Параметры() Цикл Если ДобавленныеИмена[Параметр.Имя()] = Неопределено Тогда ДобавитьКолонку(КолонкиОтчетаБенчмарков.СоздатьПараметр(Параметр.Имя())); ДобавленныеИмена.Вставить(Параметр.Имя(), Истина); @@ -108,8 +111,8 @@ ЕстьВерсия = Ложь; - Для Каждого РезультатЗапускаБенчмарка Из _ЗапускиБенчмарков Цикл - Если ЗначениеЗаполнено(РезультатЗапускаБенчмарка.ИсполняющаяСреда.Версия) Тогда + Для Каждого РезультатЗапускаКейса Из _ЗапускиКейсов Цикл + Если ЗначениеЗаполнено(РезультатЗапускаКейса.Кейс.ИсполняющаяСреда().Версия) Тогда ЕстьВерсия = Истина; Прервать; КонецЕсли; @@ -209,7 +212,8 @@ СкрываемыеКолонки = Новый Массив(); СкрываемыеКолонки.Добавить(ИмяКолонкиПорядокПоУмолчанию()); - СкрываемыеКолонки.Добавить(ИмяКолонкиРезультатаЗапускаБенчмарка()); + СкрываемыеКолонки.Добавить(ИмяКолонкиРезультатаЗапускаКейса()); + СкрываемыеКолонки.Добавить(ИмяКолонкиГруппаЭталона()); Для Каждого Колонка Из _Отчет.Колонки Цикл Если СкрыватьКолонку(Колонка) Тогда @@ -245,7 +249,7 @@ Контекст = Новый Структура(); Контекст.Вставить("Значение", СтрокаОтчета[Колонка.Имя]); - Контекст.Вставить("Статистика", СтрокаОтчета[ИмяКолонкиРезультатаЗапускаБенчмарка()].Статистика); + Контекст.Вставить("Статистика", СтрокаОтчета[ИмяКолонкиРезультатаЗапускаКейса()].Статистика); Попытка Скрывать = Действие.Выполнить(Контекст) = Истина; @@ -256,6 +260,7 @@ Если Не Скрывать Тогда Прервать; КонецЕсли; + КонецЦикла; Возврат Скрывать; @@ -270,9 +275,9 @@ НомерБенчмарка = 0; ПредыдущийБенчмарк = ""; - Для Каждого РезультатЗапускаБенчмарка Из _ЗапускиБенчмарков Цикл + Для Каждого РезультатЗапускаКейса Из _ЗапускиКейсов Цикл - ИмяБенчмарка = РезультатЗапускаБенчмарка.ДескрипторБенчмарка.Метод(); + ИмяБенчмарка = РезультатЗапускаКейса.Кейс.ДескрипторБенчмарка().Метод(); Если Не ПредыдущийБенчмарк = ИмяБенчмарка Тогда НомерБенчмарка = НомерБенчмарка + 1; ПредыдущийБенчмарк = ИмяБенчмарка; @@ -280,10 +285,16 @@ СтрокаОтчета = _Отчет.Таблица.Добавить(); СтрокаОтчета[ИмяКолонкиПорядокПоУмолчанию()] = НомерБенчмарка; - СтрокаОтчета[ИмяКолонкиРезультатаЗапускаБенчмарка()] = РезультатЗапускаБенчмарка; + СтрокаОтчета[ИмяКолонкиРезультатаЗапускаКейса()] = РезультатЗапускаКейса; + + Если РезультатЗапускаКейса.ЭтоЭталон Тогда + СтрокаОтчета[ИмяКолонкиГруппаЭталона()] = РезультатЗапускаКейса.Кейс.Идентификатор(); + ИначеЕсли РезультатЗапускаКейса.Эталон <> Неопределено Тогда + СтрокаОтчета[ИмяКолонкиГруппаЭталона()] = РезультатЗапускаКейса.Эталон.Кейс.Идентификатор(); + КонецЕсли; Для Каждого Колонка Из _Отчет.Колонки Цикл - СтрокаОтчета[Колонка.Имя] = Колонка.Значение(РезультатЗапускаБенчмарка, Колонка); + СтрокаОтчета[Колонка.Имя] = Колонка.Значение(РезультатЗапускаКейса, Колонка); КонецЦикла; КонецЦИкла; @@ -403,6 +414,7 @@ КонецЕсли; ДобавитьСортировку(КолонкиСортировки, КолонкиОтчетаБенчмарков.Категория); + ДобавитьСортировку(КолонкиСортировки, ИмяКолонкиГруппаЭталона()); ДобавитьСортировкуПоПараметрам(КолонкиСортировки); ДобавитьСортировку(КолонкиСортировки, ИмяКолонкиПорядокПоУмолчанию()); @@ -431,7 +443,7 @@ Функция ИспользуетсяЭталон() - ЕстьЭталоннаяВерсия = _Конфигурация.ВерсииИсполняющейСреды().Найти(Истина, "ЭтоЭталон") <> Неопределено; + ЕстьЭталоннаяВерсия = _Конфигурация.ЭталоннаяИсполняющаяСреда() <> Неопределено; ЕстьЭталонныеБенчмарки = _ДескрипторыБенчмарков.ПолучитьЭталонные().Количество() > 0; Возврат ЕстьЭталоннаяВерсия Или ЕстьЭталонныеБенчмарки; @@ -456,8 +468,12 @@ Возврат "ПорядокПоУмолчанию"; КонецФункции -Функция ИмяКолонкиРезультатаЗапускаБенчмарка() - Возврат "РезультатЗапускаБенчмарка"; +Функция ИмяКолонкиРезультатаЗапускаКейса() + Возврат "РезультатЗапускаКейса"; +КонецФункции + +Функция ИмяКолонкиГруппаЭталона() + Возврат "ГруппаЭталона"; КонецФункции #КонецОбласти \ 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\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 7a08142..be16ed4 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -13,8 +13,8 @@ Перем ДескрипторыБенчмарков Экспорт; // КоллекцияДескрипторовБенчмарков &Сериализуемое("Runs") -&Тип("Массив") &ДляКаждого &Тип("РезультатЗапускаБенчмаркаДто") -Перем Запуски Экспорт; // Массив из РезультатЗапускаБенчмаркаДто +&Тип("Массив") &ДляКаждого &Тип("РезультатЗапускаКейса") +Перем Запуски Экспорт; // Массив из РезультатЗапускаКейса &Сериализуемое("Checkpoint") &Тип("ЧекпоинтЗапускаБенчмарков") @@ -23,6 +23,8 @@ &Несериализуемое Перем Отчет Экспорт; // ОтчетБенчмарков +#Область ОбработчикиСобыий + Процедура ПриСозданииОбъекта() ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(); @@ -34,47 +36,47 @@ КонецПроцедуры +#КонецОбласти + #Область ПрограммныйИнтерфейс -// Связывает каждую строку замеров с эталонной строкой. +// Связывает каждый результат запуска с соответствующим эталонным результатом // -// Алгоритм поиска эталонов (в порядке приоритета): -// 1. При наличии эталонной версии исполняющей среды: -// - Ищет строку бенчмарка с идентичным именем и набором параметров в соответствующей эталонной среде -// 2. При отсутствии эталонной среды, но при наличии эталонного бенчмарка: -// - Ищет строку бенчмарка в пределах текущей категории бенчмарков, наборов параметров и исполняющей среды -Процедура ОпределитьЭталоны() Экспорт - - ЭталоннаяВерсия = Конфигурация.ЭталоннаяВерсияИсполняющейСреды(); +// Для каждого результата запуска кейса выполняется поиск эталона по следующему алгоритму: +// 1. При наличии эталонной исполняющей среды в конфигурации: +// - Выполняется поиск результата с идентичным именем метода +// - Проверяется совпадение набора параметров (все параметры должны совпадать) +// - Эталоный запуск должен быть выполнен в соответствующей эталонной среде +// +// 2. При отсутствии эталонной исполняющей среды: +// - Выполняется поиск среди запусков кейсов с флагом "ЭтоЭталон" +// - Должны совпадать: категория бенчмарка, версия исполняющей среды, набор параметров +Процедура УстановитьСвязиСЭталонами() Экспорт - Для Каждого РезультатЗапускаБенчмарка Из Запуски Цикл - - РезультатЗапускаБенчмарка.Эталон = НайтиЭталонДляСтроки(РезультатЗапускаБенчмарка, ЭталоннаяВерсия); - - Если Не ЗначениеЗаполнено(ЭталоннаяВерсия) Тогда - РезультатЗапускаБенчмарка.ЭтоЭталон = РезультатЗапускаБенчмарка.ДескрипторБенчмарка.ЭтоЭталон(); - Иначе - РезультатЗапускаБенчмарка.ЭтоЭталон = - ЭталоннаяВерсия = РезультатЗапускаБенчмарка.ИсполняющаяСреда.Версия - Или ЭталоннаяВерсия = РезультатЗапускаБенчмарка.ИсполняющаяСреда.Алиас; - КонецЕсли; + ЭталоннаяСреда = Конфигурация.ЭталоннаяИсполняющаяСреда(); + ВерсияЭталоннойСреды = ?(ЭталоннаяСреда = Неопределено, "", ЭталоннаяСреда.Версия); + Для Каждого РезультатЗапуска Из Запуски Цикл + РезультатЗапуска.Эталон = НайтиЭталонДляРезультата(РезультатЗапуска, ВерсияЭталоннойСреды); + РезультатЗапуска.ЭтоЭталон = РезультатЯвляетсяЭталоном(РезультатЗапуска, ВерсияЭталоннойСреды); КонецЦикла; КонецПроцедуры -// Пересчитывает статистические показатели для всех замеров в таблице -Процедура ОбновитьСтатистику() Экспорт - Для Каждого РезультатЗапускаБенчмарка Из Запуски Цикл - РезультатЗапускаБенчмарка.Статистика.Прочитать(РезультатЗапускаБенчмарка.Замеры); +// Пересчитывает статистические показатели для всех результатов запусков +Процедура ПересчитатьСтатистику() Экспорт + + Для Каждого РезультатЗапуска Из Запуски Цикл + РезультатЗапуска.Статистика.Прочитать(РезультатЗапуска.Замеры); КонецЦикла; + КонецПроцедуры -// Строит отчет -Процедура ПостроитьОтчет() Экспорт +// Формирует итоговый отчет по результатам выполнения бенчмарков +Процедура СформироватьОтчет() Экспорт - Построитель = Новый ПостроительОтчетаБенчмарков(ДескрипторыБенчмарков, Конфигурация, Запуски); - Отчет = Построитель.Сформировать(); + ПостроительОтчета = Новый ПостроительОтчетаБенчмарков(ЭтотОбъект); + Отчет = ПостроительОтчета.Сформировать(); КонецПроцедуры @@ -82,68 +84,92 @@ #Область СлужебныеПроцедурыИФункции -Функция НайтиЭталонДляСтроки(ВходнаяСтрока, ЭталоннаяВерсияИсполняющейСреды) +Функция НайтиЭталонДляРезультата(ТекущийРезультат, ВерсияЭталоннойСреды) - Для Каждого РезультатЗапуска Из Запуски Цикл + Для Каждого КандидатВЭталоны Из Запуски Цикл + + Если КандидатВЭталоны = ТекущийРезультат Тогда + Продолжить; + КонецЕсли; + + Если Не НаборыПараметровИдентичны(КандидатВЭталоны.Кейс.Параметры(), ТекущийРезультат.Кейс.Параметры()) Тогда + Продолжить; + КонецЕсли; - ЭтоЭталон = РезультатЗапуска.ДескрипторБенчмарка.ЭтоЭталон(); - ЭтоРазныеСтроки = Не РезультатЗапуска = ВходнаяСтрока; - ИмяМетодаСовпадает = РезультатЗапуска.ДескрипторБенчмарка.Метод() = ВходнаяСтрока.ДескрипторБенчмарка.Метод(); - КатегорияСовпадает = РезультатЗапуска.ДескрипторБенчмарка.Категория() = ВходнаяСтрока.ДескрипторБенчмарка.Категория(); - ПараметрыСовпадают = ПараметрыСовпадают(РезультатЗапуска, ВходнаяСтрока); - ВерсияИсполняющейСредыСовпадает = РезультатЗапуска.ИсполняющаяСреда.Версия = ВходнаяСтрока.ИсполняющаяСреда.Версия; - ЭталоннаяВерсияИсполняющейСредыУказана = ЗначениеЗаполнено(ЭталоннаяВерсияИсполняющейСреды); - ЭталоннаяВерсияИсполняющейСредыСовпадает = ЭталоннаяВерсияИсполняющейСреды = РезультатЗапуска.ИсполняющаяСреда.Версия - Или ЭталоннаяВерсияИсполняющейСреды = РезультатЗапуска.ИсполняющаяСреда.Алиас; - - ПоискПоЭталоннойСреде = ЭталоннаяВерсияИсполняющейСредыУказана - И ЭталоннаяВерсияИсполняющейСредыСовпадает - И ИмяМетодаСовпадает; - - ПоискПоЭталонномуБенчмарку = Не ЭталоннаяВерсияИсполняющейСредыУказана - И ЭтоЭталон - И КатегорияСовпадает - И ВерсияИсполняющейСредыСовпадает; - - НайденЭталон = ЭтоРазныеСтроки - И ПараметрыСовпадают - И (ПоискПоЭталоннойСреде Или ПоискПоЭталонномуБенчмарку); - - Если НайденЭталон Тогда - Возврат РезультатЗапуска; + Если ПодходитВКачествеЭталона(КандидатВЭталоны, ТекущийРезультат, ВерсияЭталоннойСреды) Тогда + Возврат КандидатВЭталоны; КонецЕсли; КонецЦикла; КонецФункции -Функция ПараметрыСовпадают(СтрокаПервая, СтрокаВторая) +Функция НаборыПараметровИдентичны(ПервыйНабор, ВторойНабор) - Если СтрокаПервая.Параметры.Количество() <> СтрокаВторая.Параметры.Количество() Тогда + Если ПервыйНабор.Количество() <> ВторойНабор.Количество() Тогда Возврат Ложь; КонецЕсли; - ПараметрыСовпадают = Истина; - Для Каждого ПараметрПервой Из СтрокаПервая.Параметры Цикл - - ПараметрНайден = Ложь; - Для Каждого ПараметрВторой Из СтрокаВторая.Параметры Цикл - Если ПараметрПервой.Имя() = ПараметрВторой.Имя() - И ПараметрПервой.Значение() = ПараметрВторой.Значение() - И ПараметрПервой.Представление() = ПараметрВторой.Представление() Тогда - ПараметрНайден = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - - Если Не ПараметрНайден Тогда - ПараметрыСовпадают = Ложь; - Прервать; + Для Каждого ПараметрИзПервогоНабора Из ПервыйНабор Цикл + + Если Не ПараметрСуществуетВНаборе(ПараметрИзПервогоНабора, ВторойНабор) Тогда + Возврат Ложь; КонецЕсли; КонецЦикла; - Возврат ПараметрыСовпадают; + Возврат Истина; + +КонецФункции + +Функция ПараметрСуществуетВНаборе(ИскомыйПараметр, НаборПараметров) + + Для Каждого ПараметрИзНабора Из НаборПараметров Цикл + + ИменаСовпадают = (ИскомыйПараметр.Имя() = ПараметрИзНабора.Имя()); + ЗначенияСовпадают = (ИскомыйПараметр.Значение() = ПараметрИзНабора.Значение()); + + Если ИменаСовпадают И ЗначенияСовпадают Тогда + Возврат Истина; + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ПодходитВКачествеЭталона(КандидатВЭталоны, ТекущийРезультат, ВерсияЭталоннойСреды) + + ДескрипторКандидата = КандидатВЭталоны.Кейс.ДескрипторБенчмарка(); + СредаКандидата = КандидатВЭталоны.Кейс.ИсполняющаяСреда(); + ДескрипторТекущего = ТекущийРезультат.Кейс.ДескрипторБенчмарка(); + СредаТекущего = ТекущийРезультат.Кейс.ИсполняющаяСреда(); + + ЭтоЭталон = ДескрипторКандидата.ЭтоЭталон(); + ИмяМетодаСовпадает = ДескрипторКандидата.Метод() = ДескрипторТекущего.Метод(); + КатегорияСовпадает = ДескрипторКандидата.Категория() = ДескрипторТекущего.Категория(); + + ЭталоннаяСредаЗадана = ЗначениеЗаполнено(ВерсияЭталоннойСреды); + ВерсияЭталоннойСредыСовпадает = СредаКандидата.Версия = ВерсияЭталоннойСреды; + ВерсияСредыРезультатаСовпадает = СредаКандидата.Версия = СредаТекущего.Версия; + + Если ЭталоннаяСредаЗадана Тогда + Возврат ИмяМетодаСовпадает И ВерсияЭталоннойСредыСовпадает; + Иначе + Возврат ЭтоЭталон И КатегорияСовпадает И ВерсияСредыРезультатаСовпадает; + КонецЕсли; + +КонецФункции + +Функция РезультатЯвляетсяЭталоном(РезультатЗапуска, ВерсияЭталоннойСреды) + + Если Не ЗначениеЗаполнено(ВерсияЭталоннойСреды) Тогда + Возврат РезультатЗапуска.Кейс.ДескрипторБенчмарка().ЭтоЭталон(); + Иначе + СредаЗапуска = РезультатЗапуска.Кейс.ИсполняющаяСреда(); + Возврат ВерсияЭталоннойСреды = СредаЗапуска.Версия; + КонецЕсли; КонецФункции @@ -152,21 +178,28 @@ &ПослеДесериализации Процедура ПослеДесериализации() Экспорт - ПереопределитьДескрипторыВЗапусках(); - ОпределитьЭталоны(); - ОбновитьСтатистику(); - ПостроитьОтчет(); + ВосстановитьСсылкиНаДескрипторы(); + УстановитьСвязиСЭталонами(); + ПересчитатьСтатистику(); + СформироватьОтчет(); КонецПроцедуры -Процедура ПереопределитьДескрипторыВЗапусках() +Процедура ВосстановитьСсылкиНаДескрипторы() Для Каждого Запуск Из Запуски Цикл - Дескриптор = Запуск.ДескрипторБенчмарка; - НайденныйДескриптор = ДескрипторыБенчмарков.НайтиПоТипуИИмени(Дескриптор.ТипКласса(), Дескриптор.Метод()); - Если Не НайденныйДескриптор = Неопределено Тогда - Запуск.ДескрипторБенчмарка = НайденныйДескриптор; + + ДескрипторИзКейса = Запуск.Кейс.ДескрипторБенчмарка(); + + ДескрипторИзКоллекции = ДескрипторыБенчмарков.НайтиПоТипуИИмени( + ДескрипторИзКейса.ТипКласса(), + ДескрипторИзКейса.Метод() + ); + + Если ДескрипторИзКоллекции <> Неопределено Тогда + Запуск.Кейс.УстановитьДескрипторБенчмарка(ДескрипторИзКоллекции); КонецЕсли; + КонецЦикла; КонецПроцедуры diff --git "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260\320\224\321\202\320\276.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\232\320\265\320\271\321\201\320\260.os" similarity index 55% rename from "src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260\320\224\321\202\320\276.os" rename to "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\232\320\265\320\271\321\201\320\260.os" index 5f8c6ee..afabd3e 100644 --- "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260\320\224\321\202\320\276.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\232\320\265\320\271\321\201\320\260.os" @@ -2,7 +2,14 @@ // BSLLS:ExportVariables-off &Несериализуемое -Перем ДескрипторБенчмарка Экспорт; // ДескрипторБенчмарка, Неопределено +Перем Кейс Экспорт; // КейсБенчмарка, Неопределено + +&Несериализуемое +Перем Эталон Экспорт; // РезультатЗапускаКейса, Неопределено + +&Сериализуемое("CaseId") +&Тип("Число") +Перем ИдентификаторКейса; // Число &Сериализуемое("Type") &Тип("Тип") @@ -18,10 +25,7 @@ &Сериализуемое("Parameters") &Тип("Массив") &ДляКаждого &Тип("ПараметрБенчмарка") -Перем Параметры Экспорт; // Массив из ПараметрБенчмарка - -&Несериализуемое -Перем Эталон Экспорт; // РезультатЗапускаБенчмаркаДто, Неопределено +Перем Параметры; // Массив из ПараметрБенчмарка &Сериализуемое("Baseline") &Тип("Булево") @@ -32,24 +36,25 @@ Перем Статистика Экспорт; // СтатистикаБенчмарка &Сериализуемое("Runtime") -&Тип("ИсполняющаяСредаБенчмарковДто") -Перем ИсполняющаяСреда Экспорт; // ИсполняющаяСредаБенчмарковДто +&Тип("ИсполняющаяСредаБенчмарков") +Перем ИсполняющаяСреда; // ИсполняющаяСредаБенчмарков &Сериализуемое("Measurements") -&Тип("Массив") &ДляКаждого &Тип("РезультатИтерацииБенчмаркаДто") -Перем Замеры Экспорт; // Массив из РезультатИтерацииБенчмаркаДто +&Тип("Массив") &ДляКаждого &Тип("РезультатИтерацииКейса") +Перем Замеры Экспорт; // Массив из РезультатИтерацииКейса #Область ОбработчикиСобытий Процедура ПриСозданииОбъекта() - Метод = ""; - Категория = ""; - Параметры = Новый Массив(); - ЭтоЭталон = Ложь; - Статистика = Новый СтатистикаБенчмарка(); - ИсполняющаяСреда = Новый ИсполняющаяСредаБенчмарковДто(); - Замеры = Новый Массив(); + ИдентификаторКейса = 0; + Метод = ""; + Категория = ""; + Параметры = Новый Массив(); + ЭтоЭталон = Ложь; + Статистика = Новый СтатистикаБенчмарка(); + ИсполняющаяСреда = Новый ИсполняющаяСредаБенчмарков(); + Замеры = Новый Массив(); КонецПроцедуры @@ -76,10 +81,17 @@ &ПередСериализацией Процедура ПередСериализацией() Экспорт - Если ДескрипторБенчмарка <> Неопределено Тогда - Тип = ДескрипторБенчмарка.ТипКласса(); - Метод = ДескрипторБенчмарка.Метод(); - Категория = ДескрипторБенчмарка.Категория(); + Если Кейс <> Неопределено Тогда + + ДескрипторБенчмарка = Кейс.ДескрипторБенчмарка(); + + ИдентификаторКейса = Кейс.Идентификатор(); + Тип = ДескрипторБенчмарка.ТипКласса(); + Метод = ДескрипторБенчмарка.Метод(); + Категория = ДескрипторБенчмарка.Категория(); + Параметры = Кейс.Параметры(); + ИсполняющаяСреда = Кейс.ИсполняющаяСреда(); + КонецЕсли; КонецПроцедуры @@ -97,6 +109,24 @@ ДескрипторБенчмарка.ИспользоватьКакЭталон(ПрочитанныеСвойства["Baseline"]); КонецЕсли; + Параметры = Десериализатор.ПреобразоватьОбъектДесериализации( + ПрочитанныеСвойства["Parameters"], + Тип("Массив"), + Тип("ПараметрБенчмарка") + ); + + ИсполняющаяСреда = Десериализатор.ПреобразоватьОбъектДесериализации( + ПрочитанныеСвойства["Runtime"], + Тип("ИсполняющаяСредаБенчмарков") + ); + + Кейс = Новый КейсБенчмарка( + ПрочитанныеСвойства["CaseId"], + ДескрипторБенчмарка, + Параметры, + ИсполняющаяСреда + ); + КонецПроцедуры #КонецОбласти diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\230\321\202\320\265\321\200\320\260\321\206\320\270\320\270\320\232\320\265\320\271\321\201\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\230\321\202\320\265\321\200\320\260\321\206\320\270\320\270\320\232\320\265\320\271\321\201\320\260.os" new file mode 100644 index 0000000..9d90679 --- /dev/null +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\230\321\202\320\265\321\200\320\260\321\206\320\270\320\270\320\232\320\265\320\271\321\201\320\260.os" @@ -0,0 +1,96 @@ +// BSLLS:ExportVariables-off + +&Сериализуемое("Stage") +&Тип("Строка") +Перем Этап Экспорт; // см. ЭтапыБенчмарка + +&Сериализуемое("IterationNumber") +&Тип("Число") +Перем НомерИтерации Экспорт; // Число + +&Сериализуемое("OperationCount") +&Тип("Число") +Перем КоличествоОпераций Экспорт; // Число + +&Сериализуемое("Nanoseconds") +&Тип("Число") +Перем Наносекунд Экспорт; // Число + +&Сериализуемое("NanosecondsPerOperation") +&Тип("Число") +Перем НаносекундЗаОперацию Экспорт; // Число + +&Сериализуемое("AllocatedMemory") +&Тип("Число") +Перем ВыделяемаяПамять Экспорт; // Число + +&Сериализуемое("AllocatedMemoryPerOperation") +&Тип("Число") +Перем ВыделяемаяПамятьЗаОперацию Экспорт; // Число + +#Область ОбработчикиСобытий + +Процедура ПриСозданииОбъекта() + + Этап = ""; + НомерИтерации = 0; + КоличествоОпераций = 0; + Наносекунд = 0; + НаносекундЗаОперацию = 0; + ВыделяемаяПамять = 0; + ВыделяемаяПамятьЗаОперацию = 0; + +КонецПроцедуры + +Процедура ОбработкаПолученияПредставления(Значение, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ДлинаЭтапа = Макс( + СтрДлина(ЭтапыБенчмарка.Оценка), + СтрДлина(ЭтапыБенчмарка.Прогрев), + СтрДлина(ЭтапыБенчмарка.Измерение), + СтрДлина(ЭтапыБенчмарка.Память) + ); + + ДлинаЭтапа = ДлинаЭтапа + 1; + + Значение = СтрШаблон("%1 %2: %3 op, ", + Лев(Этап + " ", ДлинаЭтапа), + Лев("" + НомерИтерации + " ", 2), + Формат(КоличествоОпераций, "ЧГ=") + ); + + Если Этап = ЭтапыБенчмарка.Память Тогда + + Значение = Значение + СтрШаблон( + "%1, %2/op", + ПредставленияПоказателейБенчмарков.ПредставлениеЧитаемое( + ВыделяемаяПамять, + ЕдиницыИзмеренийБенчмарков.Байт + ), + ПредставленияПоказателейБенчмарков.ПредставлениеЧитаемое( + ВыделяемаяПамятьЗаОперацию, + ЕдиницыИзмеренийБенчмарков.Байт + ) + ); + + Иначе + + Значение = Значение + СтрШаблон( + "%1, %2/op", + ПредставленияПоказателейБенчмарков.ПредставлениеЧитаемое( + Наносекунд, + ЕдиницыИзмеренийБенчмарков.Наносекунда + ), + ПредставленияПоказателейБенчмарков.ПредставлениеЧитаемое( + НаносекундЗаОперацию, + ЕдиницыИзмеренийБенчмарков.Наносекунда + ) + ); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти \ 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\227\320\260\320\277\321\203\321\201\320\272\320\260\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\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 5880c68..86371d4 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,5 +1,4 @@ #Использовать logos -#Использовать "../../dto" Перем _Лог; // Лог @@ -17,7 +16,7 @@ // Сериализует настройки запуска бенчмарков в JSON-файл // // Параметры: -// НастройкиЗапуска - НастройкиЗапускаБенчмарковДто - Настройки запуска +// НастройкиЗапуска - НастройкиЗапускаБенчмарков - Настройки запуска // ИмяФайла - Строка - Имя файла, в который будет записаны настройки Процедура ЗаписатьВJson(НастройкиЗапуска, ИмяФайла) Экспорт @@ -35,14 +34,14 @@ // ИмяФайла - Строка - Имя файла, из которого будет прочитаны настройки. // // Возвращаемое значение: -// НастройкиЗапускаБенчмарковДто +// НастройкиЗапускаБенчмарков Функция ПрочитатьИзJson(ИмяФайла) Экспорт ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); Json = ЧтениеТекста.Прочитать(); ЧтениеТекста.Закрыть(); - Настройки = СериализацияОбъектовБенчмаркинга.ИзJson(Json, Тип("НастройкиЗапускаБенчмарковДто")); + Настройки = СериализацияОбъектовБенчмаркинга.ИзJson(Json, Тип("НастройкиЗапускаБенчмарков")); _Лог.Отладка("Прочитаны настройки запуска из JSON-файла: %1", ИмяФайла); diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\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\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index b2a232f..dab8f46 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\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\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -70,7 +70,7 @@ // Статистика бенчмарка // // Параметры: -// Замеры - Массив из РезультатИтерацииБенчмаркаДто +// Замеры - Массив из РезультатИтерацииКейса // - Структура: // * ЗамерыВремени - Массив из Число // * ЗамерыПамяти - Массив из Число @@ -202,7 +202,7 @@ // Читает замеры и формирует статистику // // Параметры: -// Замеры - Массив из РезультатИтерацииБенчмаркаДто +// Замеры - Массив из РезультатИтерацииКейса // - Структура: // * ЗамерыВремени - Массив из Число // * ЗамерыПамяти - Массив из Число diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\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\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 8cc7030..00362dd 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\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\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -12,11 +12,12 @@ // // Параметры: // ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков - Дескрипторов бенчмарков -// Конфигурация - КонфигурацияБенчмарков - Конфигурация запуска +// Конфигурация - КонфигурацияБенчмарков - Конфигурация запуска Процедура ПриСозданииОбъекта(ДескрипторыБенчмарков, Конфигурация) _ДескрипторыБенчмарков = ДескрипторыБенчмарков; - _Конфигурация = Конфигурация; + _Конфигурация = Конфигурация; + _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.СценарийЗапускаБенчмарка"); КонецПроцедуры @@ -31,13 +32,15 @@ // // Параметры: // ПутьКФайлу - Строка - Полный путь к формируемому файлу сценария -// Чекпоинт - ЧекпоинтЗапускаБенчмарков - Точка восстановления для продолжения выполнения -Процедура Записать(ПутьКФайлу, Чекпоинт = Неопределено) Экспорт +// Кейсы - Массив из КейсБенчмарка - Кейсы бенчмарков +// - КейсБенчмарка - Кейс бенчмарка +// Чекпоинт - ЧекпоинтЗапускаБенчмарков - Точка восстановления для продолжения выполнения +Процедура Записать(ПутьКФайлу, Кейсы, Чекпоинт = Неопределено) Экспорт Файл = Новый Файл(ПутьКФайлу); ПутьФайлаНастроекЗапуска = ОбъединитьПути(Файл.Путь, Файл.ИмяБезРасширения + ".settings.json"); - ПодготовитьФайлНастроекЗапуска(ПутьФайлаНастроекЗапуска, Чекпоинт); + ПодготовитьФайлНастроекЗапуска(ПутьФайлаНастроекЗапуска, Кейсы, Чекпоинт); ТекстСценария = ТекстСценария(ПутьФайлаНастроекЗапуска); @@ -68,30 +71,53 @@ | |Сериализатор = Новый СериализаторНастроекЗапускаБенчмарков(); |Настройки = Сериализатор.ПрочитатьИзJson(""" + ПутьФайлаНастроекЗапуска + """); + | |ДескрипторыБенчмарков = Настройки.ДескрипторыБенчмарков; |Конфигурация = Настройки.Конфигурация; + |ИдентификаторыКейсов = Настройки.ИдентификаторыКейсов; |Чекпоинт = Настройки.Чекпоинт; | - |Запускатель = Новый ЗапускательБенчмарков(ДескрипторыБенчмарков, Конфигурация, Чекпоинт); - |Запускатель.Запустить(); + |ГенераторКейсов = Новый ГенераторКейсовБенчмарков(ДескрипторыБенчмарков, Конфигурация); + |Кейсы = ГенераторКейсов.СгенерироватьПоИдентификаторам(ИдентификаторыКейсов); + | + |Запускатель = Новый ЗапускательБенчмарков(ДескрипторыБенчмарков, Конфигурация); + |Запускатель.УстановитьЧекпоинт(Чекпоинт); + |Запускатель.Запустить(Кейсы); |"; Возврат ТекстСценария; КонецФункции -Процедура ПодготовитьФайлНастроекЗапуска(ПутьКФайлу, Чекпоинт) - - НастройкиЗапуска = Новый НастройкиЗапускаБенчмарковДто(); +Процедура ПодготовитьФайлНастроекЗапуска(ПутьКФайлу, Кейсы, Чекпоинт = Неопределено) + + НастройкиЗапуска = Новый НастройкиЗапускаБенчмарков(); НастройкиЗапуска.ДескрипторыБенчмарков = _ДескрипторыБенчмарков; - НастройкиЗапуска.Конфигурация = _Конфигурация; - НастройкиЗапуска.Чекпоинт = Чекпоинт; + НастройкиЗапуска.Конфигурация = _Конфигурация; + НастройкиЗапуска.ИдентификаторыКейсов = ИдентификаторыКейсов(Кейсы); + НастройкиЗапуска.Чекпоинт = Чекпоинт; Сериализатор = Новый СериализаторНастроекЗапускаБенчмарков(); Сериализатор.ЗаписатьВJson(НастройкиЗапуска, ПутьКФайлу); КонецПроцедуры +Функция ИдентификаторыКейсов(Кейсы) + + Результат = Новый Массив(); + + Если ТипЗнч(Кейсы) = Тип("КейсБенчмарка") Тогда + Результат.Добавить(Кейсы.Идентификатор()); + Иначе + Для Каждого Кейс Из Кейсы Цикл + Результат.Добавить(Кейс.Идентификатор()); + КонецЦикла; + КонецЕсли; + + Возврат Результат; + +КонецФункции + Функция ПутьКФайлуБенчмарка() Возврат Новый РасширениеТипа(ТипКлассаБенчмарка()).Источник; КонецФункции diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\224\320\265\320\273\320\265\320\263\320\260\321\202\320\260.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\224\320\265\320\273\320\265\320\263\320\260\321\202\320\260.os" new file mode 100644 index 0000000..a0f95c4 --- /dev/null +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\244\320\260\320\261\321\200\320\270\320\272\320\260\320\224\320\265\320\273\320\265\320\263\320\260\321\202\320\260.os" @@ -0,0 +1,118 @@ +Перем _КвалифицированноеИмяМетода; // Строка +Перем _Объект; // Произвольный +Перем _КешированныйДелегат; // Действие, Неопределено + +#Область ОбработчикиСобытий + +// Инициализирует фабрику для создания делегата метода +// +// Фабрика создает объект Действие (делегат) на основе квалифицированного имени метода. +// Созданный делегат кешируется для повторного использования. +// +// Параметры: +// КвалифицированноеИмяМетода - Строка - Имя метода в формате: +// - <ИмяМетода> - Метод объекта (требует параметр Объект) +// - <ИмяМодуля>.<ИмяМетода> - Метод модуля +// - <ИмяТипа>.<ИмяМетода> - Метод экземпляра типа +// Объект - Произвольный - Объект-владелец метода для формата <ИмяМетода>. +// Для остальных форматов может быть Неопределено. +// Примеры: +// // Метод объекта: +// Фабрика = Новый ФабрикаДелегата("ВыполнитьОперацию", МойОбъект); +// +// // Метод общего модуля: +// Фабрика = Новый ФабрикаДелегата("ОбщийМодуль.Метод"); +// +// // Метод экземпляра типа: +// Фабрика = Новый ФабрикаДелегата("МойТип.ВыполнитьДействие"); +Процедура ПриСозданииОбъекта(КвалифицированноеИмяМетода, Объект = Неопределено) + + _КвалифицированноеИмяМетода = КвалифицированноеИмяМетода; + _Объект = Объект; + +КонецПроцедуры + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Создает и возвращает делегат метода. +// +// При первом вызове анализирует квалифицированное имя метода и создает +// соответствующий делегат. Последующие вызовы возвращают кешированный объект. +// +// Возвращаемое значение: +// Действие - Делегат для вызова метода +Функция Создать() Экспорт + + Если _КешированныйДелегат <> Неопределено Тогда + Возврат _КешированныйДелегат; + КонецЕсли; + + _КешированныйДелегат = СоздатьДелегатПоКвалифицированномуИмени(); + + Возврат _КешированныйДелегат; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьДелегатПоКвалифицированномуИмени() + + ЧастиИмени = СтрРазделить(_КвалифицированноеИмяМетода, "."); + КоличествоЧастей = ЧастиИмени.Количество(); + + Если КоличествоЧастей = 1 Тогда + Возврат СоздатьДелегатДляМетодаОбъекта(); + ИначеЕсли КоличествоЧастей = 2 Тогда + Возврат СоздатьДелегатДляКвалифицированногоМетода(ЧастиИмени); + Иначе + ВызватьИсключение СтрШаблон("Квалифицированное имя метода <%1> задано некорректно", _КвалифицированноеИмяМетода); + КонецЕсли; + +КонецФункции + +Функция СоздатьДелегатДляМетодаОбъекта() + + Если Не ЗначениеЗаполнено(_Объект) Тогда + ВызватьИсключение СтрШаблон("Для создания делегата <%1> не указан объект", _КвалифицированноеИмяМетода); + КонецЕсли; + + Возврат Новый Действие(_Объект, _КвалифицированноеИмяМетода); + +КонецФункции + +Функция СоздатьДелегатДляКвалифицированногоМетода(ЧастиИмени) + + ИмяМодуляИлиТипа = ЧастиИмени[0]; + ИмяМетода = ЧастиИмени[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\247\320\265\320\272\320\277\320\276\320\270\320\275\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\247\320\265\320\272\320\277\320\276\320\270\320\275\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 5fc5024..c553be0 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\265\320\272\320\277\320\276\320\270\320\275\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\247\320\265\320\272\320\277\320\276\320\270\320\275\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -4,9 +4,9 @@ &Тип("Строка") Перем ИмяМетода Экспорт; // Строка -&Сериализуемое("ParameterIndex") +&Сериализуемое("CaseId") &Тип("Число") -Перем ИндексПараметров Экспорт; // Число +Перем ИдентификаторКейса Экспорт; // Число &Сериализуемое("Stage") &Тип("Строка") @@ -21,7 +21,7 @@ Процедура ПриСозданииОбъекта() ИмяМетода = ""; - ИндексПараметров = 0; + ИдентификаторКейса = 0; Этап = ""; НомерИтерации = 0; @@ -31,8 +31,8 @@ СтандартнаяОбработка = Ложь; - Значение = СтрШаблон("ИмяМетода=%1, ИндексПараметров=%2, Этап=%3, НомерИтерации=%4", - ИмяМетода, ИндексПараметров, Этап, НомерИтерации); + Значение = СтрШаблон("ИмяМетода=%1, Кейс=%2, Этап=%3, НомерИтерации=%4", + ИмяМетода, ИдентификаторКейса, Этап, НомерИтерации); КонецПроцедуры diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\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\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\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\276\320\262.os" index 9ce8eed..2b9d5ff 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\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\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\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\276\320\262.os" @@ -1,52 +1,66 @@ -Перем _Источник; // Строка -Перем _ОбъектБенчмарков; // Произвольный +Перем _ОбъектБенчмарков; // Произвольный +Перем _КешПрочитанныхИсточников; // Соответствие -Процедура ПриСозданииОбъекта(Источник, ОбъектБенчмарков) +#Область ОбработчикиСобытий + +Процедура ПриСозданииОбъекта(ОбъектБенчмарков) - _Источник = Источник; _ОбъектБенчмарков = ОбъектБенчмарков; + _КешПрочитанныхИсточников = Новый Соответствие(); КонецПроцедуры +#КонецОбласти + #Область ПрограммныйИнтерфейс -// Получает значения из источника и формирует общие параметры бенчмарков. +// Читает значения из источника данных и формирует общие параметры бенчмарков. // // Параметры: -// ИмяПоля - Строка - Имя поля класса бенчмарков. +// Источник - Строка - Имя экспортного метода-источника данных. +// Форматы: +// - <ИмяМетода> - Метод из текущего класса бенчмарков +// - <ИмяТипа>.<ИмяМетода> - Метод из указанного типа/модуля +// ИмяПоля - Строка - Имя поля класса бенчмарков, к которому привязан параметр // // Возвращаемое значение: // Массив из ПараметрБенчмарка -Функция ПрочитатьКакОбщиеПараметры(ИмяПоля) Экспорт +Функция ПрочитатьКакОбщиеПараметры(Источник, ИмяПоля) Экспорт - Результат = Новый Массив(); + ОбщиеПараметры = Новый Массив(); + ЗначеЗначенияИзИсточника = ПолучитьЗначенияИзИсточника(Источник); - Значения = ПрочитатьЗначения(); - Для Каждого Значение Из Значения Цикл - Результат.Добавить(Новый ПараметрБенчмарка(ИмяПоля, Значение, Ложь)); + Для Каждого Значение Из ЗначеЗначенияИзИсточника Цикл + ОбщийПараметр = Новый ПараметрБенчмарка(ИмяПоля, Значение, Ложь); + ОбщиеПараметры.Добавить(ОбщийПараметр); КонецЦикла; - Возврат Результат; + Возврат ОбщиеПараметры; КонецФункции -// Получает значения из источника и формирует наборы параметров бенчмарка. +// Читает значения из источника данных и формирует наборы параметров метода бенчмарка. // // Параметры: -// ДескрипторБенчмарка - ДескрипторБенчмарка - Дескриптор бенчмарка. +// Источник - Строка - Имя экспортного метода-источника данных +// Форматы: +// - <ИмяМетода> - Метод из текущего класса бенчмарков +// - <ИмяТипа>.<ИмяМетода> - Метод из указанного типа/модуля +// ДескрипторБенчмарка - ДескрипторБенчмарка - Дескриптор бенчмарка // // Возвращаемое значение: // Массив из ПараметрыМетодаБенчмарка -Функция ПрочитатьКакПараметрыБенчмарка(ДескрипторБенчмарка) Экспорт +Функция ПрочитатьКакПараметрыБенчмарка(Источник, ДескрипторБенчмарка) Экспорт - Результат = Новый Массив(); + НаборыПараметров = Новый Массив(); + ЗначенияИзИсточника = ПолучитьЗначенияИзИсточника(Источник); - НаборыПараметров = ПрочитатьЗначения(); - Для Каждого Параметры Из НаборыПараметров Цикл - Результат.Добавить(ПреобразоватьВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры)); + Для Каждого ЗначениеПараметров Из ЗначенияИзИсточника Цикл + НаборПараметров = СоздатьНаборПараметровМетода(ДескрипторБенчмарка, ЗначениеПараметров); + НаборыПараметров.Добавить(НаборПараметров); КонецЦикла; - Возврат Результат; + Возврат НаборыПараметров; КонецФункции @@ -54,94 +68,158 @@ #Область СлужебныеПроцедурыИФункции -Функция ПрочитатьЗначения() +#Область ЧтениеИсточников + +Функция ПолучитьЗначенияИзИсточника(Знач Источник) + + КлючКеша = СоздатьКлючКеша(Источник); + ЗначениеИзКеша = _КешПрочитанныхИсточников[КлючКеша]; + + Если ЗначениеИзКеша <> Неопределено Тогда + Возврат ЗначениеИзКеша; + КонецЕсли; - ЛенивыйДелегат = Новый ЛенивыйДелегат(_Источник, _ОбъектБенчмарков); - Значение = ЛенивыйДелегат.Получить().Выполнить(); + ПрочитанноеЗначение = ВыполнитьЧтениеИсточника(Источник); + НормализованноеЗначение = НормализоватьЗначение(ПрочитанноеЗначение); + + _КешПрочитанныхИсточников[КлючКеша] = НормализованноеЗначение; - Тип = ТипЗнч(Значение); - Если Не (Тип = Тип("Массив") Или Тип = Тип("ТаблицаЗначений")) Тогда - Результат = Новый Массив(); - Результат.Добавить(Значение); - Возврат Результат; - Иначе + Возврат НормализованноеЗначение; + +КонецФункции + +Функция СоздатьКлючКеша(Источник) + + Возврат ВРег(СокрЛП(Источник)); + +КонецФункции + +Функция ВыполнитьЧтениеИсточника(Источник) + + ФабрикаДелегата = Новый ФабрикаДелегата(Источник, _ОбъектБенчмарков); + Возврат ФабрикаДелегата.Создать().Выполнить(); + +КонецФункции + +Функция НормализоватьЗначение(Значение) + + ТипЗначения = ТипЗнч(Значение); + + Если ТипЗначения = Тип("Массив") Или ТипЗначения = Тип("ТаблицаЗначений") Тогда Возврат Значение; КонецЕсли; + МассивЗначений = Новый Массив(); + МассивЗначений.Добавить(Значение); + + Возврат МассивЗначений; + КонецФункции -Функция ПреобразоватьВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) +#КонецОбласти + +#Область ПреобразованиеПараметров + +Функция СоздатьНаборПараметровМетода(ДескрипторБенчмарка, ЗначенияПараметров) ИменаПараметров = ДескрипторБенчмарка.ИменаПараметров(); - КоличествоПараметровМетода = ИменаПараметров.Количество(); + КоличествоПараметров = ИменаПараметров.Количество(); - Если КоличествоПараметровМетода = 0 Тогда - Возврат Новый Массив(); + Если КоличествоПараметров = 0 Тогда + Возврат Новый ПараметрыМетодаБенчмарка(); КонецЕсли; - Если КоличествоПараметровМетода = 1 Тогда - ПараметрБенчмарка = Новый ПараметрБенчмарка(ИменаПараметров[0], Параметры, Истина); - ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); - ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка); - Возврат ПараметрыМетодаБенчмарка; + Если КоличествоПараметров = 1 Тогда + Возврат СоздатьНаборДляОдногоПараметра(ИменаПараметров[0], ЗначенияПараметров); КонецЕсли; - ТипКоллекции = ТипЗнч(Параметры); + Возврат СоздатьНаборДляНесколькихПараметров(ДескрипторБенчмарка, ЗначенияПараметров); + +КонецФункции + +Функция СоздатьНаборДляОдногоПараметра(ИмяПараметра, Значение) + + Параметр = Новый ПараметрБенчмарка(ИмяПараметра, Значение, Истина); + + НаборПараметров = Новый ПараметрыМетодаБенчмарка(); + НаборПараметров.Добавить(Параметр); + + Возврат НаборПараметров; + +КонецФункции + +Функция СоздатьНаборДляНесколькихПараметров(ДескрипторБенчмарка, ЗначенияПараметров) + + ТипКоллекции = ТипЗнч(ЗначенияПараметров); Если ТипКоллекции = Тип("Массив") Тогда - Возврат ПреобразоватьМассивВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры); + + Возврат СоздатьНаборИзМассива(ДескрипторБенчмарка, ЗначенияПараметров); + ИначеЕсли ТипКоллекции = Тип("Структура") Или ТипКоллекции = Тип("Соответствие") Тогда - Возврат ПреобразоватьСтруктуруВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры); + + Возврат СоздатьНаборИзСтруктуры(ДескрипторБенчмарка, ЗначенияПараметров); + ИначеЕсли ТипКоллекции = Тип("СтрокаТаблицыЗначений") Тогда - Возврат ПреобразоватьСтрокуТаблицыЗначенийВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры); + + Возврат СоздатьНаборИзСтрокиТаблицы(ДескрипторБенчмарка, ЗначенияПараметров); + Иначе + ВызватьИсключение СтрШаблон( "Не поддерживается тип <%1> для передачи параметров в метод бенчмарка <%2>", ТипКоллекции, ДескрипторБенчмарка.Метод() ); + КонецЕсли; КонецФункции -Функция ПреобразоватьМассивВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) +Функция СоздатьНаборИзМассива(ДескрипторБенчмарка, МассивЗначений) - ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); ИменаПараметров = ДескрипторБенчмарка.ИменаПараметров(); - КоличествоТребуемыхПараметров = ИменаПараметров.Количество(); + КоличествоОжидаемыхПараметров = ИменаПараметров.Количество(); + КоличествоПереданныхЗначений = МассивЗначений.Количество(); - Если Параметры.Количество() <> КоличествоТребуемыхПараметров Тогда + Если КоличествоПереданныхЗначений <> КоличествоОжидаемыхПараметров Тогда ВызватьИсключение СтрШаблон( "Количество переданных параметров (%1) не соответствует ожидаемому количеству (%2) для метода бенчмарка <%3>.", - Параметры.Количество(), - КоличествоТребуемыхПараметров, + МассивЗначений.Количество(), + КоличествоОжидаемыхПараметров, ДескрипторБенчмарка.Метод() ); КонецЕсли; - Для ИндексПараметра = 0 По Параметры.ВГраница() Цикл - ПараметрБенчмарка = Новый ПараметрБенчмарка(ИменаПараметров[ИндексПараметра], Параметры[ИндексПараметра], Истина); - ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка); + НаборПараметров = Новый ПараметрыМетодаБенчмарка(); + + Для Индекс = 0 По МассивЗначений.ВГраница() Цикл + ИмяПараметра = ИменаПараметров[Индекс]; + ЗначениеПараметра = МассивЗначений[Индекс]; + + Параметр = Новый ПараметрБенчмарка(ИмяПараметра, ЗначениеПараметра, Истина); + НаборПараметров.Добавить(Параметр); КонецЦикла; - Возврат ПараметрыМетодаБенчмарка; + Возврат НаборПараметров; КонецФункции -Функция ПреобразоватьСтруктуруВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) +Функция СоздатьНаборИзСтруктуры(ДескрипторБенчмарка, КоллекцияЗначений) - ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); - ТипКоллекции = ТипЗнч(Параметры); + НаборПараметров = Новый ПараметрыМетодаБенчмарка(); + ТипКоллекции = ТипЗнч(КоллекцияЗначений); + ЭтоСтруктура = (ТипКоллекции = Тип("Структура")); Для Каждого ИмяПараметра Из ДескрипторБенчмарка.ИменаПараметров() Цикл - Если ТипКоллекции = Тип("Структура") Тогда - ОтсутствуетПараметр = Не Параметры.Свойство(ИмяПараметра); + Если ЭтоСтруктура Тогда + ПараметрОтсутствует = Не КоллекцияЗначений.Свойство(ИмяПараметра); Иначе - ОтсутствуетПараметр = Параметры[ИмяПараметра] = Неопределено; + ПараметрОтсутствует = КоллекцияЗначений[ИмяПараметра] = Неопределено; КонецЕсли; - Если ОтсутствуетПараметр Тогда + Если ПараметрОтсутствует Тогда ВызватьИсключение СтрШаблон( "Отсутствует параметр <%1> метода бенчмарка <%2> в переданной коллекции <%3>", ИмяПараметра, @@ -150,23 +228,23 @@ ); КонецЕсли; - ПараметрБенчмарка = Новый ПараметрБенчмарка(ИмяПараметра, Параметры[ИмяПараметра], Истина); - ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка); + Параметр = Новый ПараметрБенчмарка(ИмяПараметра, КоллекцияЗначений[ИмяПараметра], Истина); + НаборПараметров.Добавить(Параметр); КонецЦикла; - Возврат ПараметрыМетодаБенчмарка; + Возврат НаборПараметров; КонецФункции -Функция ПреобразоватьСтрокуТаблицыЗначенийВПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) +Функция СоздатьНаборИзСтрокиТаблицы(ДескрипторБенчмарка, СтрокаТаблицы) - ПараметрыМетодаБенчмарка = Новый ПараметрыМетодаБенчмарка(); - Колонки = Параметры.Владелец().Колонки; + НаборПараметров = Новый ПараметрыМетодаБенчмарка(); + КолонкиТаблицы = СтрокаТаблицы.Владелец().Колонки; Для Каждого ИмяПараметра Из ДескрипторБенчмарка.ИменаПараметров() Цикл - Если Колонки.Найти(ИмяПараметра) = Неопределено Тогда + Если КолонкиТаблицы.Найти(ИмяПараметра) = Неопределено Тогда ВызватьИсключение СтрШаблон( "Отсутствует параметр <%1> метода бенчмарка <%2> в переданной таблице", ИмяПараметра, @@ -174,13 +252,15 @@ ); КонецЕсли; - ПараметрБенчмарка = Новый ПараметрБенчмарка(ИмяПараметра, Параметры[ИмяПараметра], Истина); - ПараметрыМетодаБенчмарка.Добавить(ПараметрБенчмарка); + Параметр = Новый ПараметрБенчмарка(ИмяПараметра, СтрокаТаблицы[ИмяПараметра], Истина); + НаборПараметров.Добавить(Параметр); КонецЦикла; - Возврат ПараметрыМетодаБенчмарка; + Возврат НаборПараметров; КонецФункции +#КонецОбласти + #КонецОбласти \ No newline at end of file diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" index 5f2f291..aa58949 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" @@ -8,35 +8,35 @@ // Запускает изолированно бенчмарки // // Параметры: -// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки -// - КоллекцияДескрипторовБенчмарков -// - ДескрипторБенчмарка -// - Произвольный - Экземпляр класса с бенчмарками +// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки +// - ДескрипторБенчмарка - Отдельный дескриптор +// - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов +// - Произвольный - Экземпляр класса с бенчмарками // Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков // // Возвращаемое значение: // РезультатЗапускаБенчмарков: -// * СредаОкружения - СредаОкруженияБенчмарков -// * Конфигурация - КонфигурацияБенчмарков -// * ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков -// * Отчет - ОтчетБенчмарков -// * Запуски - Массив из РезультатЗапускаБенчмаркаДто: +// * СредаОкружения - СредаОкруженияБенчмарков +// * Конфигурация - КонфигурацияБенчмарков +// * ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков +// * Отчет - ОтчетБенчмарков +// * Запуски - Массив из РезультатЗапускаКейса: // ** ДескрипторБенчмарка - ДескрипторБенчмарка -// ** Параметры - Массив из ПараметрБенчмарка -// ** Эталон - РезультатЗапускаБенчмаркаДто, Неопределено -// ** ЭтоЭталон - Булево -// ** Статистика - СтатистикаБенчмарка -// ** ИсполняющаяСреда - ИсполняющаяСредаБенчмарковДто: -// *** Версия - Строка -// *** Алиас - Строка -// *** Наименование - Строка -// ** Замеры - Массив из РезультатИтерацииБенчмаркаДто: -// *** Этап - см. ЭтапыБенчмарка -// *** НомерИтерации - Число -// *** КоличествоОпераций - Число -// *** Наносекунд - Число - Наносекунд за итерацию -// *** НаносекундЗаОперацию - Число - Наносекунд за операцию -// *** ВыделяемаяПамять - Число - Байт выделяемой памяти за итерацию +// ** Параметры - Массив из ПараметрБенчмарка +// ** Эталон - РезультатЗапускаКейса, Неопределено +// ** ЭтоЭталон - Булево +// ** Статистика - СтатистикаБенчмарка +// ** ИсполняющаяСреда - ИсполняющаяСредаБенчмарков: +// *** Версия - Строка +// *** Алиас - Строка +// *** Наименование - Строка +// ** Замеры - Массив из РезультатИтерацииКейса: +// *** Этап - см. ЭтапыБенчмарка +// *** НомерИтерации - Число +// *** КоличествоОпераций - Число +// *** Наносекунд - Число - Наносекунд за итерацию +// *** НаносекундЗаОперацию - Число - Наносекунд за операцию +// *** ВыделяемаяПамять - Число - Байт выделяемой памяти за итерацию // *** ВыделяемаяПамятьЗаОперацию - Число - Байт выделяемой памяти за операцию Функция Запустить(ИсточникБенчмарков, Конфигурация = Неопределено) Экспорт @@ -48,18 +48,17 @@ // Запускает все бенчмарки, найденные в указанном каталоге // // Параметры: -// Каталог - Строка - Путь к каталогу с бенчмарками -// ИскатьВПодкаталогах - Булево - Сканировать все вложенные каталоги -// Конфигурация - КонфигурацияБенчмарков - Конфигурация, которая с приоритетом будет объединена -// с каждой конфигурацией бенчмарка +// Каталог - Строка - Путь к каталогу с бенчмарками +// ИскатьВПодкаталогах - Булево - Сканировать все вложенные каталоги +// Конфигурация - КонфигурацияБенчмарков - Конфигурация, которая с приоритетом будет объединена +// с каждой конфигурацией бенчмарка // // Возвращаемое значение: // ТаблицаЗначений: -// * Результат - см. Бенчмаркинг.Запустить -// - Неопределено -// * ИмяФайла - Строка - Имя файла +// * Результат - РезультатЗапускаБенчмарков, Неопределено - см. Бенчмаркинг.Запустить +// * ИмяФайла - Строка - Имя файла // * ПолноеИмяФайла - Строка - Путь к файлу сценария -// * Успешно - Булево - Индикатор корректного выполнения +// * Успешно - Булево - Индикатор корректного выполнения Функция ЗапуститьИзКаталога(Каталог, ИскатьВПодкаталогах = Ложь, Конфигурация = Неопределено) Экспорт ЗапускательБенчмарковИзКаталога = Новый ЗапускательБенчмарковИзКаталога(Каталог, ИскатьВПодкаталогах, Конфигурация); 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 e4c511f..1b506b4 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" @@ -302,7 +302,7 @@ Для Каждого Значение Из Значения Цикл ВерсииСреды = СтрРазделить(Значение, ", ", Ложь); Для Каждого Версия Из ВерсииСреды Цикл - Конфигурация.ДобавитьВерсиюИсполняющейСреды(Версия); + Конфигурация.ДобавитьИсполняющуюСреду(Версия); КонецЦикла; КонецЦикла; @@ -311,7 +311,7 @@ Если Не Версия = Неопределено Тогда Наименование = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "Наименование", "", Истина); ЭтоЭталон = РаботаСАннотациями.ПолучитьЗначениеПараметраАннотации(Аннотация, "ЭтоЭталон", Ложь, Истина); - Конфигурация.ДобавитьВерсиюИсполняющейСреды(Версия, Наименование, ЭтоЭталон); + Конфигурация.ДобавитьИсполняющуюСреду(Версия, Наименование, ЭтоЭталон); КонецЕсли; КонецЦикла; diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\261\321\213\321\202\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\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\261\321\213\321\202\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 2fefcfb..0207ad0 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\261\321\213\321\202\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\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\261\321\213\321\202\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" @@ -6,7 +6,7 @@ Перем ПередКаждым Экспорт; Перем ПослеКаждого Экспорт; -ПередВсеми = "ПередВсеми"; -ПослеВсех = "ПослеВсех"; -ПередКаждым = "ПередКаждым"; +ПередВсеми = "ПередВсеми"; +ПослеВсех = "ПослеВсех"; +ПередКаждым = "ПередКаждым"; ПослеКаждого = "ПослеКаждого"; diff --git "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\230\321\202\320\265\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\260\320\224\321\202\320\276.os" "b/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\230\321\202\320\265\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\260\320\224\321\202\320\276.os" deleted file mode 100644 index a9a2f59..0000000 --- "a/src/BenchmarkOneScript/dto/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\230\321\202\320\265\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\260\320\224\321\202\320\276.os" +++ /dev/null @@ -1,41 +0,0 @@ -// BSLLS:ExportVariables-off - -&Сериализуемое("Stage") -&Тип("Строка") -Перем Этап Экспорт; // см. ЭтапыБенчмарка - -&Сериализуемое("IterationNumber") -&Тип("Число") -Перем НомерИтерации Экспорт; // Число - -&Сериализуемое("OperationCount") -&Тип("Число") -Перем КоличествоОпераций Экспорт; // Число - -&Сериализуемое("Nanoseconds") -&Тип("Число") -Перем Наносекунд Экспорт; // Число - -&Сериализуемое("NanosecondsPerOperation") -&Тип("Число") -Перем НаносекундЗаОперацию Экспорт; // Число - -&Сериализуемое("AllocatedMemory") -&Тип("Число") -Перем ВыделяемаяПамять Экспорт; // Число - -&Сериализуемое("AllocatedMemoryPerOperation") -&Тип("Число") -Перем ВыделяемаяПамятьЗаОперацию Экспорт; // Число - -Процедура ПриСозданииОбъекта() - - Этап = ""; - НомерИтерации = 0; - КоличествоОпераций = 0; - Наносекунд = 0; - НаносекундЗаОперацию = 0; - ВыделяемаяПамять = 0; - ВыделяемаяПамятьЗаОперацию = 0; - -КонецПроцедуры \ No newline at end of file diff --git "a/tests/fixtures/benchmarks/\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\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" "b/tests/fixtures/benchmarks/\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\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" index 431f2e5..ab6327d 100644 --- "a/tests/fixtures/benchmarks/\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\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" +++ "b/tests/fixtures/benchmarks/\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\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.os" @@ -34,8 +34,7 @@ &ПередКаждым Процедура ПередКаждым(Контекст) Экспорт - ДескрипторБенчмарка = Контекст.ДескрипторБенчмарка; - ПараметрыМетода = Контекст.ПараметрыМетода; + Кейс = Контекст.Кейс; ЗаписьЛога.ЗаписатьСтроку("ПередКаждым"); @@ -44,8 +43,7 @@ &ПослеКаждого Процедура ПослеКаждого(Контекст) Экспорт - ДескрипторБенчмарка = Контекст.ДескрипторБенчмарка; - Параметры = Контекст.Параметры; + Кейс = Контекст.Кейс; Замеры = Контекст.Замеры; Статистика = Контекст.Статистика; diff --git "a/tests/fixtures/benchmarks/\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\270\320\241\320\255\321\202\320\260\320\273\320\276\320\275\320\276\320\274\320\230\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274\320\270.os" "b/tests/fixtures/benchmarks/\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\270\320\241\320\255\321\202\320\260\320\273\320\276\320\275\320\276\320\274\320\230\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274\320\270.os" index db0c55d..bb67904 100644 --- "a/tests/fixtures/benchmarks/\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\270\320\241\320\255\321\202\320\260\320\273\320\276\320\275\320\276\320\274\320\230\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274\320\270.os" +++ "b/tests/fixtures/benchmarks/\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\270\320\241\320\255\321\202\320\260\320\273\320\276\320\275\320\276\320\274\320\230\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274\320\270.os" @@ -1,3 +1,5 @@ +#Использовать "../../paramsSources" + &Параметры(1) Перем ОбщееПоле Экспорт; diff --git "a/tests/fixtures/handlers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/fixtures/handlers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index b97b324..da81db3 100644 --- "a/tests/fixtures/handlers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/tests/fixtures/handlers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -2,7 +2,7 @@ Процедура УстановкаВремени(Контекст) Экспорт Задержка = Неопределено; - Для Каждого Параметр Из Контекст.Параметры Цикл + Для Каждого Параметр Из Контекст.Кейс.Параметры() Цикл Если Параметр.Имя() = "Задержка" Тогда Задержка = Параметр.Значение(); КонецЕсли; @@ -36,11 +36,7 @@ Контекст.СредаОкружения.ИнформацияОПроцессоре.КоличествоЛогическихПроцессоров = 8; Контекст.СредаОкружения.ИнформацияОПроцессоре.НоминальнаяЧастота = 3100000000; - ПостроительОтчета = Новый ПостроительОтчетаБенчмарков( - Контекст.ДескрипторыБенчмарков, - Контекст.Конфигурация, - Контекст.Запуски - ); + ПостроительОтчета = Новый ПостроительОтчетаБенчмарков(Контекст); Контекст.Отчет = ПостроительОтчета.Сформировать(); diff --git "a/tests/fixtures/paramsSources/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\276\320\264\321\203\320\273\321\214\320\241\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\274\320\270\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/tests/fixtures/paramsSources/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\276\320\264\321\203\320\273\321\214\320\241\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\274\320\270\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" index eb7fa77..636f55d 100644 --- "a/tests/fixtures/paramsSources/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\276\320\264\321\203\320\273\321\214\320\241\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\274\320\270\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" +++ "b/tests/fixtures/paramsSources/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\276\320\264\321\203\320\273\321\214\320\241\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\274\320\270\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -6,4 +6,15 @@ Возврат Значения; +КонецФункции + +Функция ПолучитьСсылочныеЗначения() Экспорт + + Значения = Новый Массив(); + Значения.Добавить(Новый Структура("ИмяКлюча", "Значение 1")); + Значения.Добавить(Новый Структура("ИмяКлюча", "Значение 2")); + Значения.Добавить(Новый HTTPЗапрос()); + + Возврат Значения; + КонецФункции \ No newline at end of file diff --git a/tests/fixtures/verified-report.json b/tests/fixtures/verified-report.json index 47a3ae9..ccb73cb 100644 --- a/tests/fixtures/verified-report.json +++ b/tests/fixtures/verified-report.json @@ -83,6 +83,7 @@ ], "Runs": [ { + "CaseId": 1, "Type": "БенчмаркиДляЭкспорта", "Method": "БенчмаркПервый", "Category": "", @@ -145,8 +146,8 @@ }, "Runtime": { "Version": "", - "Alias": "", - "Name": "" + "Name": "", + "Baseline": false }, "Measurements": [ { @@ -242,6 +243,7 @@ ] }, { + "CaseId": 2, "Type": "БенчмаркиДляЭкспорта", "Method": "БенчмаркВторой", "Category": "", @@ -298,8 +300,8 @@ }, "Runtime": { "Version": "", - "Alias": "", - "Name": "" + "Name": "", + "Baseline": false }, "Measurements": [ { diff --git "a/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" "b/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 25d9c32..112eb9e 100644 --- "a/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" +++ "b/tests/helpers/\320\234\320\276\320\264\321\203\320\273\320\270/\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -25,13 +25,13 @@ КонецПроцедуры -Процедура ПодготовитьСреду(ВерсииИсполняющейСреды) Экспорт +Процедура ПодготовитьСреду(ИсполняющиеСреды) Экспорт - ПроверитьУстановитьВерсииИсполняющейСреды(ВерсииИсполняющейСреды); + ПроверитьУстановитьИсполняющиеСреды(ИсполняющиеСреды); КонецПроцедуры -Процедура ПроверитьУстановитьВерсииИсполняющейСреды(Версии) +Процедура ПроверитьУстановитьИсполняющиеСреды(Версии) ЛокаторИсполняющейСреды = Новый ЛокаторИсполняющейСреды(); 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 122b76d..856fa74 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" @@ -446,6 +446,7 @@ Возврат; КонецЕсли; + // Подготовка Тип = Тип("БенчмаркиССортировкой"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); @@ -454,8 +455,10 @@ Конфигурация.УстановитьСортировкуОтчета(СортировкиОтчетаБенчмарков.ОтБыстрыхКМедленным); Конфигурация.ДобавитьОбработчикСобытия("ОбработчикиСобытийБенчмарков.УстановкаВремени", СобытияБенчмарков.ПослеКаждого); + // Действие Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); + // Проверка Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.Метод]).Равно("БенчмаркВ"); Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.Параметр("Параметр")]).Равно(1); @@ -582,8 +585,8 @@ Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("dev", "dev"); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("stable", "stable"); + Конфигурация.ДобавитьИсполняющуюСреду("dev", "dev"); + Конфигурация.ДобавитьИсполняющуюСреду("stable", "stable"); Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); @@ -604,8 +607,8 @@ Конфигурация .ОчиститьПараметры() .ДобавитьПараметр("Значение", Новый Структура("Тест", 1)) - .ДобавитьВерсиюИсполняющейСреды("dev") - .ДобавитьВерсиюИсполняющейСреды("stable", , Истина); + .ДобавитьИсполняющуюСреду("dev") + .ДобавитьИсполняющуюСреду("stable", , Истина); ПараметрыМетода = Новый Массив(); ПараметрыМетода.Добавить(Тип); @@ -650,6 +653,6 @@ Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) - .ВыбрасываетИсключение("Невозможно определить тип класса"); + .ВыбрасываетИсключение("Дескрипторы бенчмарков не найдены"); КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\245\320\276\320\273\320\276\320\264\320\275\321\213\320\271\320\227\320\260\320\277\321\203\321\201\320\272.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" similarity index 82% rename from "tests/\320\242\320\265\321\201\321\202\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\245\320\276\320\273\320\276\320\264\320\275\321\213\320\271\320\227\320\260\320\277\321\203\321\201\320\272.os" rename to "tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" index f6362f4..3b8cd78 100644 --- "a/tests/\320\242\320\265\321\201\321\202\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\245\320\276\320\273\320\276\320\264\320\275\321\213\320\271\320\227\320\260\320\277\321\203\321\201\320\272.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" @@ -166,9 +166,9 @@ // Проверка Ожидаем.Что(Результат.Запуски, "Запуски").ИмеетДлину(2); Ожидаем.Что(Результат.Запуски[0].Замеры, "Замеры 1").ИмеетДлину(3); - Ожидаем.Что(Результат.Запуски[0].ДескрипторБенчмарка.Метод(), "Дескриптор 1").Равно("Бенчмарк"); + Ожидаем.Что(Результат.Запуски[0].Кейс.ДескрипторБенчмарка().Метод(), "Дескриптор 1").Равно("Бенчмарк"); Ожидаем.Что(Результат.Запуски[1].Замеры, "Замеры 2").ИмеетДлину(3); - Ожидаем.Что(Результат.Запуски[1].ДескрипторБенчмарка.Метод(), "Дескриптор 2").Равно("БенчмаркЭталон"); + Ожидаем.Что(Результат.Запуски[1].Кейс.ДескрипторБенчмарка().Метод(), "Дескриптор 2").Равно("БенчмаркЭталон"); Для Каждого Запуск Из Результат.Запуски Цикл ПроверитьЗамеры(Запуск.Замеры, 1, 3, ЭтапыБенчмарка.Измерение); @@ -193,21 +193,21 @@ // Проверка Ожидаем.Что(Результат.Запуски, "Запуски").ИмеетДлину(4); Ожидаем.Что(Результат.Запуски[0].Замеры, "Замеры 1").ИмеетДлину(1); - Ожидаем.Что(Результат.Запуски[0].ДескрипторБенчмарка.Метод(), "Дескриптор 1").Равно("БенчмаркА"); - Ожидаем.Что(Результат.Запуски[0].Параметры[0].Имя(), "Параметр 1.1").Равно("ОбщееПоле"); - Ожидаем.Что(Результат.Запуски[0].Параметры[1].Имя(), "Параметр 1.2").Равно("Перем1"); + Ожидаем.Что(Результат.Запуски[0].Кейс.ДескрипторБенчмарка().Метод(), "Дескриптор 1").Равно("БенчмаркА"); + Ожидаем.Что(Результат.Запуски[0].Кейс.Параметры()[0].Имя(), "Параметр 1.1").Равно("ОбщееПоле"); + Ожидаем.Что(Результат.Запуски[0].Кейс.Параметры()[1].Имя(), "Параметр 1.2").Равно("Перем1"); Ожидаем.Что(Результат.Запуски[1].Замеры, "Замеры 2").ИмеетДлину(1); - Ожидаем.Что(Результат.Запуски[1].ДескрипторБенчмарка.Метод(), "Дескриптор 2").Равно("БенчмаркБ"); - Ожидаем.Что(Результат.Запуски[1].Параметры[0].Имя(), "Параметр 2.1").Равно("ОбщееПоле"); - Ожидаем.Что(Результат.Запуски[1].Параметры[1].Имя(), "Параметр 2.2").Равно("Перем1"); + Ожидаем.Что(Результат.Запуски[1].Кейс.ДескрипторБенчмарка().Метод(), "Дескриптор 2").Равно("БенчмаркБ"); + Ожидаем.Что(Результат.Запуски[1].Кейс.Параметры()[0].Имя(), "Параметр 2.1").Равно("ОбщееПоле"); + Ожидаем.Что(Результат.Запуски[1].Кейс.Параметры()[1].Имя(), "Параметр 2.2").Равно("Перем1"); Ожидаем.Что(Результат.Запуски[2].Замеры, "Замеры 3").ИмеетДлину(1); - Ожидаем.Что(Результат.Запуски[2].ДескрипторБенчмарка.Метод(), "Дескриптор 3").Равно("БенчмаркБ"); - Ожидаем.Что(Результат.Запуски[2].Параметры[0].Имя(), "Параметр 3.1").Равно("ОбщееПоле"); - Ожидаем.Что(Результат.Запуски[2].Параметры[1].Имя(), "Параметр 3.2").Равно("Перем1"); + Ожидаем.Что(Результат.Запуски[2].Кейс.ДескрипторБенчмарка().Метод(), "Дескриптор 3").Равно("БенчмаркБ"); + Ожидаем.Что(Результат.Запуски[2].Кейс.Параметры()[0].Имя(), "Параметр 3.1").Равно("ОбщееПоле"); + Ожидаем.Что(Результат.Запуски[2].Кейс.Параметры()[1].Имя(), "Параметр 3.2").Равно("Перем1"); Ожидаем.Что(Результат.Запуски[3].Замеры, "Замеры 4").ИмеетДлину(1); - Ожидаем.Что(Результат.Запуски[3].ДескрипторБенчмарка.Метод(), "Дескриптор 4").Равно("БенчмаркВ"); - Ожидаем.Что(Результат.Запуски[3].Параметры[0].Имя(), "Параметр 4.1").Равно("ОбщееПоле"); - Ожидаем.Что(Результат.Запуски[3].Параметры[1].Имя(), "Параметр 4.2").Равно("Перем2"); + Ожидаем.Что(Результат.Запуски[3].Кейс.ДескрипторБенчмарка().Метод(), "Дескриптор 4").Равно("БенчмаркВ"); + Ожидаем.Что(Результат.Запуски[3].Кейс.Параметры()[0].Имя(), "Параметр 4.1").Равно("ОбщееПоле"); + Ожидаем.Что(Результат.Запуски[3].Кейс.Параметры()[1].Имя(), "Параметр 4.2").Равно("Перем2"); Для Каждого Запуск Из Результат.Запуски Цикл ПроверитьЗамеры(Запуск.Замеры, 1, 1, ЭтапыБенчмарка.Измерение); @@ -226,8 +226,8 @@ Конфигурация = Новый КонфигурацияБенчмарков(Тип) .УстановитьСтратегию(СтратегииЗапускаБенчмарка.ХолодныйЗапуск) .УстановитьКоличествоИтераций(1) - .ДобавитьВерсиюИсполняющейСреды("dev") - .ДобавитьВерсиюИсполняющейСреды("stable") + .ДобавитьИсполняющуюСреду("dev") + .ДобавитьИсполняющуюСреду("stable") .УдалитьМониторингПамяти(); // Действие @@ -236,9 +236,9 @@ // Проверка Ожидаем.Что(Результат.Запуски, "Запуски").ИмеетДлину(2); Ожидаем.Что(Результат.Запуски[0].Замеры, "Замеры 1").ИмеетДлину(1); - Ожидаем.Что(Результат.Запуски[0].ИсполняющаяСреда.Алиас, "Исполняющая среда 1").Равно("dev"); + Ожидаем.Что(Результат.Запуски[0].Кейс.ИсполняющаяСреда().Версия, "Исполняющая среда 1").Равно("dev"); Ожидаем.Что(Результат.Запуски[1].Замеры, "Замеры 2").ИмеетДлину(1); - Ожидаем.Что(Результат.Запуски[1].ИсполняющаяСреда.Алиас, "Исполняющая среда 2").Равно("stable"); + Ожидаем.Что(Результат.Запуски[1].Кейс.ИсполняющаяСреда().Версия, "Исполняющая среда 2").Равно("stable"); Для Каждого Запуск Из Результат.Запуски Цикл ПроверитьЗамеры(Запуск.Замеры, 1, 1, ЭтапыБенчмарка.Измерение); diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\276\320\262\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\276\320\262\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" index c4a8895..7be1836 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\276\320\262\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\276\320\262\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262.os" @@ -141,7 +141,7 @@ // Проверка Ожидаем.Что(Результат.Запуски).ИмеетДлину(1); - Значение = Результат.Запуски[0].Параметры[0].Значение(); + Значение = Результат.Запуски[0].Кейс.Параметры()[0].Значение(); Ожидаем.Что(Значение).ИмеетТип("Структура"); Ожидаем.Что(Значение.Парам1).Равно(13); Ожидаем.Что(Значение.Парам2).Равно(14); 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 141e3b2..5cc5ab8 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" @@ -677,8 +677,8 @@ .ДобавитьКолонку(КолонкиОтчетаБенчмарков.ВерхнийКвартиль) .ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Json) .ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Html) - .ДобавитьВерсиюИсполняющейСреды("dev") - .ДобавитьВерсиюИсполняющейСреды("1.9.3") + .ДобавитьИсполняющуюСреду("dev") + .ДобавитьИсполняющуюСреду("1.9.3") .ДобавитьИсточникПараметров("col1", "ПолучитьЗначения"); // Действие @@ -701,8 +701,8 @@ Ожидаем.Что(НоваяКонфигурация.Колонки(), "Колонки").Содержит(КолонкиОтчетаБенчмарков.ВерхнийКвартиль); Ожидаем.Что(НоваяКонфигурация.Экспортеры(), "Экспортеры").Содержит(ЭкспортерыРезультатовБенчмарков.Json); Ожидаем.Что(НоваяКонфигурация.Экспортеры(), "Экспортеры").Содержит(ЭкспортерыРезультатовБенчмарков.Html); - Ожидаем.Что(НоваяКонфигурация.ВерсииИсполняющейСреды()[0].Версия, "Исполняющая среда (dev)").Равно("dev"); - Ожидаем.Что(НоваяКонфигурация.ВерсииИсполняющейСреды()[1].Версия, "Исполняющая среда (1.9.3)").Равно("1.9.3"); + Ожидаем.Что(НоваяКонфигурация.ИсполняющиеСреды()[0].Версия, "Исполняющая среда (dev)").Равно("dev"); + Ожидаем.Что(НоваяКонфигурация.ИсполняющиеСреды()[1].Версия, "Исполняющая среда (1.9.3)").Равно("1.9.3"); Ожидаем.Что(НоваяКонфигурация.ИсточникиПараметров()[0].ИмяПоля, "Источники параметров").Равно("col1"); КонецПроцедуры @@ -770,13 +770,13 @@ КонецПроцедуры &Тест -Процедура Тест_ДобавлениеВерсииИсполняющейСреды() Экспорт +Процедура Тест_ДобавлениеИсполняющиеСреды() Экспорт Конфигурация = Новый КонфигурацияБенчмарков(); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("dev"); + Конфигурация.ДобавитьИсполняющуюСреду("dev"); - Ожидаем.Что(Конфигурация.ВерсииИсполняющейСреды()).Заполнено(); - Ожидаем.Что(Конфигурация.ВерсииИсполняющейСреды()[0].Версия).Равно("dev"); + Ожидаем.Что(Конфигурация.ИсполняющиеСреды()).Заполнено(); + Ожидаем.Что(Конфигурация.ИсполняющиеСреды()[0].Версия).Равно("dev"); КонецПроцедуры @@ -784,10 +784,10 @@ Процедура Тест_УдалениеВсехВерсийИсполняющейСреды() Экспорт Конфигурация = Новый КонфигурацияБенчмарков(); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("dev"); - Конфигурация.ОчиститьВерсииИсполняющейСреды(); + Конфигурация.ДобавитьИсполняющуюСреду("dev"); + Конфигурация.ОчиститьИсполняющиеСреды(); - Ожидаем.Что(Конфигурация.ВерсииИсполняющейСреды()).ИмеетДлину(0); + Ожидаем.Что(Конфигурация.ИсполняющиеСреды()).ИмеетДлину(0); КонецПроцедуры @@ -795,7 +795,7 @@ Экспортеры = Конфигурация.Экспортеры(); КоллекцияЭкспортеры = ПроцессорыКоллекций.ИзКоллекции(Экспортеры); - ВерсииИсполняющейСреды = Конфигурация.ВерсииИсполняющейСреды(); + ИсполняющиеСреды = Конфигурация.ИсполняющиеСреды(); Колонки = Конфигурация.Колонки(); Параметры = Конфигурация.Параметры(); ИсточникиПараметров = Конфигурация.ИсточникиПараметров(); @@ -818,13 +818,13 @@ Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "Markdown"))).ЭтоИстина(); Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "Json"))).ЭтоИстина(); Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "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 - эталонная").ЭтоИстина(); + Ожидаем.Что(ИсполняющиеСреды, "Должно быть 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); 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\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 73cb910..4a5a40d 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\235\320\260\321\201\321\202\321\200\320\276\320\265\320\272\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -29,7 +29,7 @@ ИмяФайла = МенеджерВременныхФайлов.НовоеИмяФайла(); - НастройкиЗапуска = Новый НастройкиЗапускаБенчмарковДто(); + НастройкиЗапуска = Новый НастройкиЗапускаБенчмарков(); НастройкиЗапуска.ДескрипторыБенчмарков = КоллекцияДескрипторов; НастройкиЗапуска.Конфигурация = Конфигурация; @@ -72,7 +72,7 @@ Экспортеры = Конфигурация.Экспортеры(); КоллекцияЭкспортеры = ПроцессорыКоллекций.ИзКоллекции(Экспортеры); - ВерсииИсполняющейСреды = Конфигурация.ВерсииИсполняющейСреды(); + ИсполняющиеСреды = Конфигурация.ИсполняющиеСреды(); Колонки = Конфигурация.Колонки(); Параметры = Конфигурация.Параметры(); ИсточникиПараметров = Конфигурация.ИсточникиПараметров(); @@ -95,13 +95,13 @@ Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "Markdown"))).ЭтоИстина(); Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "Json"))).ЭтоИстина(); Ожидаем.Что(КоллекцияЭкспортеры.ЛюбойСоответствует(СтрШаблон(ФункцияПоискаЭкспортера, "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 - эталонная").ЭтоИстина(); + Ожидаем.Что(ИсполняющиеСреды, "Должно быть 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); 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\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/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\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 039e89b..1320ff8 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200\320\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/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\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" @@ -58,7 +58,7 @@ .ДобавитьПараметр("ПолеОбщее", Неопределено) .ДобавитьИсточникПараметров("ПолеОбщее", "СоставныеПараметры") .ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Json) - .ДобавитьВерсиюИсполняющейСреды("dev", "develop"); + .ДобавитьИсполняющуюСреду("dev", "develop"); // Действие Результат = Бенчмаркинг.Запустить(ДескрипторыБенчмарков, Конфигурация); @@ -107,21 +107,21 @@ Запуски = РезультатПрочитанный.Запуски; Ожидаем.Что(Запуски, "Количество запусков").ИмеетДлину(10); - Ожидаем.Что(Запуски[0].ДескрипторБенчмарка, "Должен быть создан один объект дескриптора").Равно(Запуски[1].ДескрипторБенчмарка); - Ожидаем.Что(Запуски[0].ДескрипторБенчмарка, "Дескриптор из запусков должен совпадать с дескриптором из коллекции дескрипторов").Равно(ДескрипторБенчмарка); - Ожидаем.Что(Запуски[0].Параметры, "Количество строк в параметрах").ИмеетДлину(3); - Ожидаем.Что(Запуски[0].Параметры[0].Значение(), "Параметр 1.1").Равно('19700101'); // Дата - Ожидаем.Что(Запуски[0].Параметры[1].Значение(), "Параметр 1.2").Равно(3); - Ожидаем.Что(Запуски[0].Параметры[2].Значение(), "Параметр 1.3").Равно(4); - Ожидаем.Что(Запуски[1].Параметры[0].Значение(), "Параметр 2.1").Равно(Неопределено); // Неопределено - Ожидаем.Что(Запуски[2].Параметры[0].Значение(), "Параметр 3.1").ИмеетТип("Массив"); // ТаблицаЗначений - Ожидаем.Что(Запуски[2].Параметры[0].Значение()[0].Колонка, "Параметр 3.1").Равно(1); - Ожидаем.Что(Запуски[3].Параметры[0].Значение(), "Параметр 4.1").Равно(Неопределено); // ЧтениеXML - Ожидаем.Что(Запуски[3].Параметры[0].Представление(), "Параметр 4.1").Равно("ЧтениеXML"); // ЧтениеXML - Ожидаем.Что(Запуски[4].Параметры[0].Значение(), "Параметр 5.1").ИмеетТип("Структура"); // БенчмаркСПараметрамиМетодаИПоля - Ожидаем.Что(Запуски[4].Параметры[0].Представление(), "Параметр 5.1").Равно("БенчмаркСПараметрамиМетодаИПоля"); // БенчмаркСПараметрамиМетодаИПоля + Ожидаем.Что(Запуски[0].Кейс.ДескрипторБенчмарка(), "Должен быть создан один объект дескриптора").Равно(Запуски[1].Кейс.ДескрипторБенчмарка()); + Ожидаем.Что(Запуски[0].Кейс.ДескрипторБенчмарка(), "Дескриптор из запусков должен совпадать с дескриптором из коллекции дескрипторов").Равно(ДескрипторБенчмарка); + Ожидаем.Что(Запуски[0].Кейс.Параметры(), "Количество строк в параметрах").ИмеетДлину(3); + Ожидаем.Что(Запуски[0].Кейс.Параметры()[0].Значение(), "Параметр 1.1").Равно('19700101'); // Дата + Ожидаем.Что(Запуски[0].Кейс.Параметры()[1].Значение(), "Параметр 1.2").Равно(3); + Ожидаем.Что(Запуски[0].Кейс.Параметры()[2].Значение(), "Параметр 1.3").Равно(4); + Ожидаем.Что(Запуски[1].Кейс.Параметры()[0].Значение(), "Параметр 2.1").Равно(Неопределено); // Неопределено + Ожидаем.Что(Запуски[2].Кейс.Параметры()[0].Значение(), "Параметр 3.1").ИмеетТип("Массив"); // ТаблицаЗначений + Ожидаем.Что(Запуски[2].Кейс.Параметры()[0].Значение()[0].Колонка, "Параметр 3.1").Равно(1); + Ожидаем.Что(Запуски[3].Кейс.Параметры()[0].Значение(), "Параметр 4.1").Равно(Неопределено); // ЧтениеXML + Ожидаем.Что(Запуски[3].Кейс.Параметры()[0].Представление(), "Параметр 4.1").Равно("ЧтениеXML"); // ЧтениеXML + Ожидаем.Что(Запуски[4].Кейс.Параметры()[0].Значение(), "Параметр 5.1").ИмеетТип("Структура"); // БенчмаркСПараметрамиМетодаИПоля + Ожидаем.Что(Запуски[4].Кейс.Параметры()[0].Представление(), "Параметр 5.1").Равно("БенчмаркСПараметрамиМетодаИПоля"); // БенчмаркСПараметрамиМетодаИПоля Ожидаем.Что(Запуски[0].ЭтоЭталон, "Это не эталон").ЭтоЛожь(); - Ожидаем.Что(Запуски[0].ИсполняющаяСреда.Версия, "Версия").Заполнено(); + Ожидаем.Что(Запуски[0].Кейс.ИсполняющаяСреда().Версия, "Версия").Заполнено(); Ожидаем.Что(Запуски[0].Замеры, "Количество строк в замерах").ИмеетДлину(1); Ожидаем.Что(Запуски[0].Замеры[0].Этап, "Этап").Равно(ЭтапыБенчмарка.Измерение); Ожидаем.Что(Запуски[0].Замеры[0].НомерИтерации, "Номер итерации").Равно(1); @@ -149,6 +149,7 @@ // Конфигурация Конфигурация = РезультатПрочитанный.Конфигурация; + ИсполняющиеСреды = Конфигурация.ИсполняющиеСреды(); Ожидаем.Что(Конфигурация, "Конфигурация").ИмеетТип("КонфигурацияБенчмарков"); Ожидаем.Что(Конфигурация.Параметры(), "Параметры").ИмеетДлину(2); @@ -164,9 +165,9 @@ Ожидаем.Что(Конфигурация.ОбработчикиСобытий()[0].ИмяМетода(), "Обработчик события").Равно("ОбработчикиСобытийБенчмарков.УстановкаМокСредыОкружения"); Ожидаем.Что(Конфигурация.Экспортеры(), "Экспортеры").ИмеетДлину(1); Ожидаем.Что(Конфигурация.Экспортеры()[0], "Экспортер 1").ИмеетТип("ЭкспортерРезультатовБенчмарковВJson"); - Ожидаем.Что(Конфигурация.ВерсииИсполняющейСреды(), "Исполняющие среды").ИмеетДлину(1); - Ожидаем.Что(Конфигурация.ВерсииИсполняющейСреды()[0].Версия, "Исполняющая среда 1").Заполнено(); - Ожидаем.Что(Конфигурация.ВерсииИсполняющейСреды()[0].Наименование, "Исполняющая среда 1").Равно("develop"); - Ожидаем.Что(Конфигурация.ВерсииИсполняющейСреды()[0].ЭтоЭталон, "Исполняющая среда 1").ЭтоЛожь(); + Ожидаем.Что(ИсполняющиеСреды, "Исполняющие среды").ИмеетДлину(1); + Ожидаем.Что(ИсполняющиеСреды[0].Версия, "Исполняющая среда 1").Заполнено(); + Ожидаем.Что(ИсполняющиеСреды[0].Наименование, "Исполняющая среда 1").Равно("develop"); + Ожидаем.Что(ИсполняющиеСреды[0].ЭтоЭталон, "Исполняющая среда 1").ЭтоЛожь(); КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" index 4a90f4e..b3bd9ab 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\202\320\260\321\202\320\270\321\201\321\202\320\270\320\272\320\270.os" @@ -238,14 +238,14 @@ МассивЗамеровПамяти = СтрРазделить(СтрокаЗамерыПамяти, ",", Ложь); Для Каждого НаносекундЗаОперацию Из МассивЗамеровВремени Цикл - Замер = Новый РезультатИтерацииБенчмаркаДто(); + Замер = Новый РезультатИтерацииКейса(); Замер.Этап = ЭтапыБенчмарка.Измерение; Замер.НаносекундЗаОперацию = Число(НаносекундЗаОперацию) * Множитель; Замеры.Добавить(Замер); КонецЦикла; Для Каждого ВыделяемаяПамятьЗаОперацию Из МассивЗамеровПамяти Цикл - Замер = Новый РезультатИтерацииБенчмаркаДто(); + Замер = Новый РезультатИтерацииКейса(); Замер.Этап = ЭтапыБенчмарка.Память; Замер.ВыделяемаяПамятьЗаОперацию = Число(ВыделяемаяПамятьЗаОперацию) * Множитель; Замеры.Добавить(Замер); 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 637be60..7edcf36 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" @@ -8,15 +8,18 @@ #Использовать "fixtures/benchmarks" &Тест -Процедура ТестДолжен_НайтиЭталонныйБенчмаркОпределенныйВАннотации() Экспорт +Процедура ТестДолжен_ЗапуститьЭталонныйБенчмаркИзАннотации() Экспорт + // Подготовка Тип = Тип("БенчмаркиСЭталоном"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); + // Действие Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); + // Проверка Ожидаем.Что(Результат.Отчет.Таблица).ИмеетДлину(2); Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.Эталон]).ЭтоЛожь(); Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.КоэффициентПроизводительности]).Заполнено(); @@ -26,8 +29,9 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_НайтиЭталонныйБенчмаркОпределенныйВКонфигурации() Экспорт +Процедура ТестДолжен_ЗапуститьЭталонныйБенчмаркИзКонфигурации() Экспорт + // Подготовка Тип = Тип("ПустойБенчмарк"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); @@ -36,8 +40,10 @@ ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип); ДескрипторыБенчмарков.НайтиПоИмени("Бенчмарк").ИспользоватьКакЭталон(); + // Действие Результат = Бенчмаркинг.Запустить(ДескрипторыБенчмарков, Конфигурация); + // Проверка Ожидаем.Что(Результат.Отчет.Таблица).ИмеетДлину(1); Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.Эталон]).ЭтоИстина(); Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.КоэффициентПроизводительности]).Равно(1); @@ -45,8 +51,9 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_НайтиЭталонныйБенчмаркВКаждойКатегории() Экспорт +Процедура ТестДолжен_ЗапуститьЭталонныеБенчмаркиВРазныхКатегориях() Экспорт + // Подготовка Тип = Тип("БенчмаркиПоКатегориям"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); @@ -61,8 +68,10 @@ ПараметрыМетода.Добавить(Конфигурация); ПараметрыМетода.Добавить(ДескрипторыБенчмарков); + // Действие Результат = Бенчмаркинг.Запустить(ДескрипторыБенчмарков, Конфигурация); + // Проверка Таблица = Результат.Отчет.Таблица; СтрокаА1 = Таблица.Найти("БенчмаркА1", КолонкиОтчетаБенчмарков.Метод); СтрокаБ1 = Таблица.Найти("БенчмаркБ1", КолонкиОтчетаБенчмарков.Метод); @@ -73,19 +82,22 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_НайтиЭталонСредиЭталоннойВерсииИсполняющейСреды() Экспорт +Процедура ТестДолжен_ЗапуститьБенчмаркСЭталоннойВерсиейСреды() Экспорт + // Подготовка ТестированиеБенчмарков.ПодготовитьСреду("dev,stable"); Тип = Тип("ПустойБенчмарк"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("dev", "dev"); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("stable", "stable", Истина); + Конфигурация.ДобавитьИсполняющуюСреду("dev", "dev"); + Конфигурация.ДобавитьИсполняющуюСреду("stable", "stable", Истина); + // Действие Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); + // Проверка Ожидаем.Что(Результат.Отчет.Таблица).ИмеетДлину(2); Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.ВерсияИсполняющейСреды]).Содержит("dev"); @@ -99,60 +111,69 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_ПроигнорироватьЭталонныйБенчмаркПриНаличииЭталоннойВерсииИсполняющейСреды() Экспорт +Процедура ТестДолжен_ИгнорироватьЭталонностьБенчмаркаПриНаличииЭталоннойВерсииСреды() Экспорт + // Подготовка Тип = Тип("БенчмаркиСЭталоном"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("dev"); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("stable", "stable", Истина); + Конфигурация.ДобавитьИсполняющуюСреду("dev"); + Конфигурация.ДобавитьИсполняющуюСреду("stable", "stable", Истина); + // Действие Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); + + // Проверка Запуски = Результат.Запуски; Ожидаем.Что(Запуски).ИмеетДлину(4); Ожидаем.Что(Запуски[0].ЭтоЭталон, "Бенчмарк (dev) не должен быть эталоном").ЭтоЛожь(); - Ожидаем.Что(Запуски[0].Эталон.ДескрипторБенчмарка.Метод(), "У Бенчмарк (dev) должен быть эталон Бенчмарк (stable)").Равно("Бенчмарк"); - Ожидаем.Что(Запуски[0].Эталон.ИсполняющаяСреда.Алиас, "У Бенчмарк (dev) должен быть эталон Бенчмарк (stable)").Равно("stable"); + Ожидаем.Что(Запуски[0].Эталон.Кейс.ДескрипторБенчмарка().Метод(), "У Бенчмарк (dev) должен быть эталон Бенчмарк (stable)").Равно("Бенчмарк"); + Ожидаем.Что(Запуски[0].Эталон.Кейс.ИсполняющаяСреда().Версия, "У Бенчмарк (dev) должен быть эталон Бенчмарк (stable)").Равно("stable"); Ожидаем.Что(Запуски[1].ЭтоЭталон, "БенчмаркЭталон (dev) не должен быть эталоном").ЭтоЛожь(); - Ожидаем.Что(Запуски[1].Эталон.ДескрипторБенчмарка.Метод(), "У БенчмаркЭталон (dev) должен быть эталон БенчмаркЭталон (stable)").Равно("БенчмаркЭталон"); - Ожидаем.Что(Запуски[1].Эталон.ИсполняющаяСреда.Алиас, "У БенчмаркЭталон (dev) должен быть эталон БенчмаркЭталон (stable)").Равно("stable"); + Ожидаем.Что(Запуски[1].Эталон.Кейс.ДескрипторБенчмарка().Метод(), "У БенчмаркЭталон (dev) должен быть эталон БенчмаркЭталон (stable)").Равно("БенчмаркЭталон"); + Ожидаем.Что(Запуски[1].Эталон.Кейс.ИсполняющаяСреда().Версия, "У БенчмаркЭталон (dev) должен быть эталон БенчмаркЭталон (stable)").Равно("stable"); Ожидаем.Что(Запуски[2].ЭтоЭталон, "Бенчмарк (stable) должен быть эталоном").ЭтоИстина(); Ожидаем.Что(Запуски[3].ЭтоЭталон, "БенчмаркЭталон (stable) должен быть эталоном").ЭтоИстина(); КонецПроцедуры &Тест -Процедура ТестДолжен_НайтиЭталонныйБенчмаркВКорректнойВерсииИсполняющейСреды() Экспорт +Процедура ТестДолжен_ЗапуститьЭталонныйБенчмаркСРазнымиВерсиямиСреды() Экспорт + // Подготовка Тип = Тип("БенчмаркиСЭталоном"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("dev"); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("stable"); + Конфигурация.ДобавитьИсполняющуюСреду("dev"); + Конфигурация.ДобавитьИсполняющуюСреду("stable"); + // Действие Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); + + // Проверка Запуски = Результат.Запуски; Ожидаем.Что(Запуски).ИмеетДлину(4); Ожидаем.Что(Запуски[0].ЭтоЭталон, "Бенчмарк (dev) не должен быть эталоном").ЭтоЛожь(); - Ожидаем.Что(Запуски[0].Эталон.ДескрипторБенчмарка.Метод(), "У Бенчмарк (dev) должен быть эталон БенчмаркЭталон (dev)").Равно("БенчмаркЭталон"); - Ожидаем.Что(Запуски[0].Эталон.ИсполняющаяСреда.Алиас, "У Бенчмарк (dev) должен быть эталон БенчмаркЭталон (dev)").Равно("dev"); + Ожидаем.Что(Запуски[0].Эталон.Кейс.ДескрипторБенчмарка().Метод(), "У Бенчмарк (dev) должен быть эталон БенчмаркЭталон (dev)").Равно("БенчмаркЭталон"); + Ожидаем.Что(Запуски[0].Эталон.Кейс.ИсполняющаяСреда().Версия, "У Бенчмарк (dev) должен быть эталон БенчмаркЭталон (dev)").Равно("dev"); Ожидаем.Что(Запуски[1].ЭтоЭталон, "БенчмаркЭталон (dev) должен быть эталоном").ЭтоИстина(); Ожидаем.Что(Запуски[2].ЭтоЭталон, "Бенчмарк (dev) не должен быть эталоном").ЭтоЛожь(); - Ожидаем.Что(Запуски[2].Эталон.ДескрипторБенчмарка.Метод(), "У Бенчмарк (stable) должен быть эталон БенчмаркЭталон (stable)").Равно("БенчмаркЭталон"); - Ожидаем.Что(Запуски[2].Эталон.ИсполняющаяСреда.Алиас, "У Бенчмарк (stable) должен быть эталон БенчмаркЭталон (stable)").Равно("stable"); + Ожидаем.Что(Запуски[2].Эталон.Кейс.ДескрипторБенчмарка().Метод(), "У Бенчмарк (stable) должен быть эталон БенчмаркЭталон (stable)").Равно("БенчмаркЭталон"); + Ожидаем.Что(Запуски[2].Эталон.Кейс.ИсполняющаяСреда().Версия, "У Бенчмарк (stable) должен быть эталон БенчмаркЭталон (stable)").Равно("stable"); Ожидаем.Что(Запуски[3].ЭтоЭталон, "БенчмаркЭталон (stable) должен быть эталоном").ЭтоИстина(); КонецПроцедуры &Тест -Процедура ТестДолжен_ПроверитьЗапретНаБолееОдногоЭталонногоБенчмарка() Экспорт +Процедура ТестДолжен_ЗапретитьБолееОдногоЭталонногоБенчмарка() Экспорт + // Подготовка Тип = Тип("БенчмаркиСЭталоном"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); @@ -166,6 +187,7 @@ ПараметрыМетода.Добавить(ДескрипторыБенчмарков); ПараметрыМетода.Добавить(Конфигурация); + // Действие и Проверка Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) @@ -174,8 +196,9 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_ПроверитьЗапретНаБолееОдногоЭталонногоБенчмаркаВКатегории() Экспорт +Процедура ТестДолжен_ЗапретитьБолееОдногоЭталонногоБенчмаркаВКатегории() Экспорт + // Подготовка Тип = Тип("БенчмаркиПоКатегориям"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); @@ -189,6 +212,7 @@ ПараметрыМетода.Добавить(ДескрипторыБенчмарков); ПараметрыМетода.Добавить(Конфигурация); + // Действие и Проверка Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) @@ -197,19 +221,21 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_ПроверитьЗапретНаБолееОдногоЭталоннойВерсииИсполняющейСреды() Экспорт +Процедура ТестДолжен_ЗапретитьБолееОднойЭталоннойВерсииСреды() Экспорт + // Подготовка Тип = Тип("ПустойБенчмарк"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("dev", "dev", Истина); - Конфигурация.ДобавитьВерсиюИсполняющейСреды("stable", "stable", Истина); + Конфигурация.ДобавитьИсполняющуюСреду("dev", "dev", Истина); + Конфигурация.ДобавитьИсполняющуюСреду("stable", "stable", Истина); ПараметрыМетода = Новый Массив(); ПараметрыМетода.Добавить(Тип); ПараметрыМетода.Добавить(Конфигурация); + // Действие и Проверка Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) @@ -218,59 +244,91 @@ КонецПроцедуры &Тест -Процедура ТестДолжен_УбедитьсяВОтсутствииЭталонаКогдаИменаПараметровНеСовпадают() Экспорт +Процедура ТестДолжен_ЗапуститьБенчмаркиСЭталономИПараметрами() Экспорт + // Подготовка Тип = Тип("БенчмаркиСЭталономИПараметрами"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); + // Действие Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); + // Проверка + + // Сценарий 1: эталон не должен быть найден, если имена параметров отличаются + СтрокаБезЭталона = ПроцессорыКоллекций.ИзКоллекции(Результат.Запуски) + .Фильтровать("Элемент -> Элемент.Кейс.ДескрипторБенчмарка().Метод() = ""БенчмаркВ""") + .ПолучитьПервый(); + + Ожидаем.Что(СтрокаБезЭталона.Эталон, "Эталон не должен быть найден при несовпадении имен параметров").Не_().Заполнено(); + + // Сценарий 2: эталон не должен быть найден, если имена совпадают, но значения параметров различаются СтрокаБезЭталона = ПроцессорыКоллекций.ИзКоллекции(Результат.Запуски) - .Фильтровать("Элемент -> Элемент.ДескрипторБенчмарка.Метод() = ""БенчмаркВ""") + .Фильтровать("Элемент -> Элемент.Кейс.ДескрипторБенчмарка().Метод() = ""БенчмаркБ"" И Элемент.Кейс.Параметры()[1].Имя() = ""Перем1"" И Элемент.Кейс.Параметры()[1].Значение() = 2") .ПолучитьПервый(); - Ожидаем.Что(СтрокаБезЭталона.Эталон, "Эталон не должен был быть найден").Не_().Заполнено(); + Ожидаем.Что(СтрокаБезЭталона, "Не найдена строка бенчмарка ""БенчмаркБ"" со значением параметра 2").Заполнено(); + Ожидаем.Что(СтрокаБезЭталона.Эталон, "Эталон не должен быть найден при различии значений параметров").Не_().Заполнено(); + + /// Сценарий 3: эталон должен быть найден, если имя и значение параметра совпадают + СтрокаБезЭталона = ПроцессорыКоллекций.ИзКоллекции(Результат.Запуски) + .Фильтровать("Элемент -> Элемент.Кейс.ДескрипторБенчмарка().Метод() = ""БенчмаркБ"" И Элемент.Кейс.Параметры()[1].Имя() = ""Перем1"" И Элемент.Кейс.Параметры()[1].Значение() = 1") + .ПолучитьПервый(); + + Ожидаем.Что(СтрокаБезЭталона, "Не найдена строка бенчмарка ""БенчмаркБ"" со значением параметра 1").Заполнено(); + Ожидаем.Что(СтрокаБезЭталона.Эталон, "Эталон должен быть найден при совпадении имени и значения параметра").Заполнено(); + Ожидаем.Что(СтрокаБезЭталона.Эталон.Кейс.ДескрипторБенчмарка().Метод()).Равно("БенчмаркА"); КонецПроцедуры &Тест -Процедура ТестДолжен_УбедитьсяВОтсутствииЭталонаКогдаЗначенияПараметровНеСовпадают() Экспорт +Процедура ТестДолжен_ЗапуститьБенчмаркиССылочнымиПараметрами() Экспорт + // Подготовка Тип = Тип("БенчмаркиСЭталономИПараметрами"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); - Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип); - СтрокаБезЭталона = ПроцессорыКоллекций.ИзКоллекции(Результат.Запуски) - .Фильтровать("Элемент -> Элемент.ДескрипторБенчмарка.Метод() = ""БенчмаркБ"" И Элемент.Параметры[1].Имя() = ""Перем1"" И Элемент.Параметры[1].Значение() = 2") - .ПолучитьПервый(); + ДескрипторыБенчмарков + .НайтиПоИмени("БенчмаркА") + .ОчиститьПараметры() + .ДобавитьИсточникПараметров("МодульСИсточникамиПараметров.ПолучитьСсылочныеЗначения"); - Ожидаем.Что(СтрокаБезЭталона, "Не найдена строка бенчмарка ""БенчмаркБ"" со значением параметра 2").Заполнено(); - Ожидаем.Что(СтрокаБезЭталона.Эталон, "Эталон не должен был быть найден").Не_().Заполнено(); + ДескрипторыБенчмарков + .НайтиПоИмени("БенчмаркБ") + .ОчиститьПараметры() + .ДобавитьИсточникПараметров("МодульСИсточникамиПараметров.ПолучитьСсылочныеЗначения"); -КонецПроцедуры + // Действие + Результат = Бенчмаркинг.Запустить(ДескрипторыБенчмарков, Конфигурация); -&Тест -Процедура ТестДолжен_НайтиЭталонКогдаИменаИЗначенияПараметровСовпадают() Экспорт + // Проверка + Ожидаем.Что(Результат.Отчет.Таблица).ИмеетДлину(7); + Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.Метод]).Равно("БенчмаркВ"); + Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.Эталон]).ЭтоЛожь(); + Ожидаем.Что(Результат.Отчет.Таблица[0][КолонкиОтчетаБенчмарков.КоэффициентПроизводительности]).Равно("?"); - Тип = Тип("БенчмаркиСЭталономИПараметрами"); + Для к = 1 По 3 Цикл - Конфигурация = Новый КонфигурацияБенчмарков(Тип); - ТестированиеБенчмарков.НастроитьКонфигурациюПодТесты(Конфигурация); + Инд1 = к * 2 - 1; + Инд2 = к * 2; - Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); + Ожидаем.Что(Результат.Отчет.Таблица[Инд1][КолонкиОтчетаБенчмарков.Метод]).Равно("БенчмаркА"); + Ожидаем.Что(Результат.Отчет.Таблица[Инд1][КолонкиОтчетаБенчмарков.Эталон]).ЭтоИстина(); + Ожидаем.Что(Результат.Отчет.Таблица[Инд1][КолонкиОтчетаБенчмарков.КоэффициентПроизводительности]).Равно(1); + Ожидаем.Что(Результат.Отчет.Таблица[Инд2][КолонкиОтчетаБенчмарков.Метод]).Равно("БенчмаркБ"); + Ожидаем.Что(Результат.Отчет.Таблица[Инд2][КолонкиОтчетаБенчмарков.Эталон]).ЭтоЛожь(); + Ожидаем.Что(Результат.Отчет.Таблица[Инд2][КолонкиОтчетаБенчмарков.КоэффициентПроизводительности]).Заполнено(); - // БенчмаркБ - СтрокаБезЭталона = ПроцессорыКоллекций.ИзКоллекции(Результат.Запуски) - .Фильтровать("Элемент -> Элемент.ДескрипторБенчмарка.Метод() = ""БенчмаркБ"" И Элемент.Параметры[1].Имя() = ""Перем1"" И Элемент.Параметры[1].Значение() = 1") - .ПолучитьПервый(); + КонецЦикла; - Ожидаем.Что(СтрокаБезЭталона, "Не найдена строка бенчмарка ""БенчмаркБ"" со значением параметра 1").Заполнено(); - Ожидаем.Что(СтрокаБезЭталона.Эталон, "Эталон должен был быть найден").Заполнено(); - Ожидаем.Что(СтрокаБезЭталона.Эталон.ДескрипторБенчмарка.Метод()).Равно("БенчмаркА"); + Ожидаем.Что(Результат.Запуски[3].Эталон.Кейс.Идентификатор()).Равно(1); + Ожидаем.Что(Результат.Запуски[4].Эталон.Кейс.Идентификатор()).Равно(2); + Ожидаем.Что(Результат.Запуски[5].Эталон.Кейс.Идентификатор()).Равно(3); КонецПроцедуры \ No newline at end of file From 160acc93dfc4c5e6426382a154be2cc626547aa1 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 7 Mar 2026 14:44:14 +0300 Subject: [PATCH 02/11] =?UTF-8?q?refactor:=20=D0=A0=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B3=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D0=BA=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D0=BE=D0=B2,=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D0=BF=D0=BE=20=D0=BA=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D0=B0=D0=BC,=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\261\321\213\321\202\320\270\320\271.md" | 2 +- ...20\277\321\203\321\201\320\272\320\260.os" | 4 +- ...20\260\321\200\320\272\320\276\320\262.os" | 2 +- ...20\260\321\200\320\272\320\276\320\262.os" | 194 ++++++++++++------ ...20\260\321\200\320\272\320\276\320\262.os" | 91 ++++++-- ...20\260\321\200\320\272\320\276\320\262.os" | 22 +- ...20\260\321\200\320\272\320\276\320\262.os" | 2 +- ...20\260\321\200\320\272\320\276\320\262.os" | 2 +- ...20\274\320\260\321\200\320\272\320\260.os" | 5 +- ...20\260\321\200\320\272\320\276\320\262.os" | 4 +- ...20\260\321\200\320\272\320\276\320\262.os" | 6 +- ...21\203\321\201\320\272\320\276\320\262.os" | 4 +- ...21\200\320\260\321\206\320\270\320\270.os" | 29 ++- ...20\273\320\276\320\275\320\276\320\262.os" | 10 +- 14 files changed, 267 insertions(+), 110 deletions(-) diff --git "a/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" "b/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" index bf0e800..07b9e0f 100644 --- "a/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" +++ "b/docs/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.md" @@ -43,7 +43,7 @@ ```bsl // Параметры: // * Контекст - Структура: -// ** Кейс - ДКейсБенчмарка +// ** Кейс - КейсБенчмарка &ПередКаждым Процедура ПередКаждым(Контекст) Экспорт ``` 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 909a0f8..d3278a1 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" @@ -252,9 +252,9 @@ Возврат; КонецЕсли; - ИсполняющиеСреды = СтрРазделить(_ИсполняющаяСреда, ","); + ИсполняющиеСреды = СтрРазделить(_ИсполняющаяСреда, ",", Ложь); Для Каждого Версия Из ИсполняющиеСреды Цикл - Конфигурация.ДобавитьИсполняющуюСреду(Версия); + Конфигурация.ДобавитьИсполняющуюСреду(СокрЛП(Версия)); КонецЦикла; КонецПроцедуры diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\260\320\277\321\202\320\265\321\200\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\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\220\320\264\320\260\320\277\321\202\320\265\321\200\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 5565128..b46f3eb 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\260\320\277\321\202\320\265\321\200\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\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\220\320\264\320\260\320\277\321\202\320\265\321\200\320\230\321\201\321\202\320\276\321\207\320\275\320\270\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,6 +1,6 @@ Перем _ИсточникБенчмарков; // Произвольный -#Область ОбработчикиСобыий +#Область ОбработчикиСобытий // Конструктор адаптера источника бенчмарков // diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index 7a2979a..074685a 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\222\320\260\320\273\320\270\320\264\320\260\321\202\320\276\321\200\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -1,22 +1,27 @@ +// BSLLS:NestedFunctionInParameters-off + #Использовать logos #Использовать fluent Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков Перем _Конфигурация; // КонфигурацияБенчмарков -Перем _СписокОшибок; // Массив из Строка +Перем _НайденныеОшибки; // Массив из Строка #Область ОбработчикиСобытий -// Создает валидатор конфигурации запуска бенчмарков +// Инициализирует валидатор конфигурации запуска бенчмарков. +// +// Валидатор проверяет корректность конфигурации перед запуском бенчмарков +// и собирает список всех обнаруженных ошибок для последующего анализа. // // Параметры: -// ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков -// Конфигурация - КонфигурацияБенчмарков +// ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков - Коллекция дескриптор +// Конфигурация - КонфигурацияБенчмарков - Конфигурация запуска Процедура ПриСозданииОбъекта(ДескрипторыБенчмарков, Конфигурация) _ДескрипторыБенчмарков = ДескрипторыБенчмарков; _Конфигурация = Конфигурация; - _СписокОшибок = Новый Массив(); + _НайденныеОшибки = Новый Массив(); КонецПроцедуры @@ -24,45 +29,53 @@ #Область ПрограммныйИнтерфейс -// Проверяет корректность конфигурации запуска бенчмарков +// Выполняет полную валидацию конфигурации запуска бенчмарков +// +// Выполняемые проверки: +// 1. Наличие хотя бы одного дескриптора бенчмарка +// 2. Единообразие типов бенчмарков (все из одного класса) +// 3. Уникальность эталонной исполняющей среды (не более одной) +// 4. Уникальность эталонных бенчмарков в пределах категории +// 5. Сериализуемость всех параметров (примитивные типы) // // Возвращаемое значение: -// Булево - Истина, если все проверки пройдены (ошибок нет), -// Ложь в противном случае +// Булево - Истина, если конфигурация корректна и запуск возможен; +// Ложь, если обнаружены ошибки (см. ПолучитьТекстОшибок()) Функция ЗапускВозможен() Экспорт - _СписокОшибок.Очистить(); + _НайденныеОшибки.Очистить(); ПроверитьНаличиеДескрипторов(); - ПроверитьТипыБенчмарков(); - ПроверитьЭталоннуюИсполняющуюСреду(); - ПроверитьЭталонныеБенчмарки(); + ПроверитьОднородностьТиповБенчмарков(); + ПроверитьУникальностьЭталоннойСреды(); + ПроверитьУникальностьЭталонныхБенчмарков(); ПроверитьСериализуемостьПараметров(); - Результат = _СписокОшибок.Количество() = 0; + Результат = _НайденныеОшибки.Количество() = 0; Возврат Результат; КонецФункции -// Возвращает сводный текст всех обнаруженных ошибок валидации +// Возвращает форматированный текст всех обнаруженных ошибок валидации // // Возвращаемое значение: -// Строка +// Строка - многострочный текст с перечислением ошибок; +// пустая строка, если ошибок нет Функция ПолучитьТекстОшибок() Экспорт - Если _СписокОшибок.Количество() = 0 Тогда + Если _НайденныеОшибки.Количество() = 0 Тогда Возврат ""; КонецЕсли; - Строки = Новый Массив(); - Строки.Добавить("Конфигурация запуска бенчмарков содержит следующие ошибки:"); + СтрокиОтчета = Новый Массив(); + СтрокиОтчета.Добавить("Конфигурация запуска бенчмарков содержит следующие ошибки:"); - Для Каждого ТекстОшибки Из _СписокОшибок Цикл - Строки.Добавить(" • " + ТекстОшибки); + Для Каждого ТекстОшибки Из _НайденныеОшибки Цикл + СтрокиОтчета.Добавить(" • " + ТекстОшибки); КонецЦикла; - Возврат СтрСоединить(Строки, Символы.ПС); + Возврат СтрСоединить(СтрокиОтчета, Символы.ПС); КонецФункции @@ -70,33 +83,42 @@ #Область СлужебныеПроцедурыИФункции +// Проверяет наличие хотя бы одного дескриптора бенчмарка. Процедура ПроверитьНаличиеДескрипторов() Если _ДескрипторыБенчмарков.Количество() = 0 Тогда - _СписокОшибок.Добавить("Дескрипторы бенчмарков не найдены"); + ДобавитьОшибку( + "Не найдено ни одного дескриптора бенчмарка для запуска. " + + "Убедитесь, что классы бенчмарков содержат методы с аннотацией &Бенчмарк." + ); КонецЕсли; - + КонецПроцедуры -Процедура ПроверитьТипыБенчмарков() +// Проверяет однородность типов бенчмарков в коллекции. +// +// Все бенчмарки должны принадлежать одному классу. Смешивание бенчмарков +// из разных классов в одном запуске не допускается. +Процедура ПроверитьОднородностьТиповБенчмарков() - ПредыдущийТип = Неопределено; + ПервыйТип = Неопределено; Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл ТекущийТип = ДескрипторБенчмарка.ТипКласса(); - Если ПредыдущийТип = Неопределено Тогда - ПредыдущийТип = ТекущийТип; + Если ПервыйТип = Неопределено Тогда + ПервыйТип = ТекущийТип; + Продолжить; КонецЕсли; - Если ПредыдущийТип <> ТекущийТип Тогда - ТекстОшибки = СтрШаблон( - "Запрещается запускать бенчмарки с разными типами: %1, %2...", - ПредыдущийТип, - ТекущийТип); - - _СписокОшибок.Добавить(ТекстОшибки); + Если ПервыйТип <> ТекущийТип Тогда + ДобавитьОшибку(СтрШаблон( + "Обнаружены бенчмарки из разных классов: <%1> и <%2>. " + + "В одном запуске можно выполнять бенчмарки только из одного класса.", + ПервыйТип, + ТекущийТип + )); Возврат; КонецЕсли; @@ -104,23 +126,35 @@ КонецПроцедуры -Процедура ПроверитьЭталоннуюИсполняющуюСреду() +// Проверяет уникальность эталонной исполняющей среды. +// +// В конфигурации может быть помечена как эталонная только одна среда выполнения. +// Наличие нескольких эталонных сред делает результаты сравнения неоднозначными. +Процедура ПроверитьУникальностьЭталоннойСреды() - КоличествоЭталонов = ПроцессорыКоллекций + КоличествоЭталонныхСред = ПроцессорыКоллекций .ИзКоллекции(_Конфигурация.ИсполняющиеСреды()) .Фильтровать("Среда -> Среда.ЭтоЭталон") .ВМассив() .Количество(); - Если КоличествоЭталонов > 1 Тогда - _СписокОшибок.Добавить("Допускается только одна эталонная версия исполняющей среды"); + Если КоличествоЭталонныхСред > 1 Тогда + ДобавитьОшибку(СтрШаблон( + "Найдено %1 эталонных исполняющих сред. " + + "Допускается помечать как эталонную только одну среду выполнения.", + КоличествоЭталонныхСред + )); КонецЕсли; КонецПроцедуры -Процедура ПроверитьЭталонныеБенчмарки() +// Проверяет уникальность эталонных бенчмарков в пределах категорий. +// +// В каждой категории может быть помечен как эталонный только один бенчмарк. +// Для бенчмарков без категории также допускается только один эталон. +Процедура ПроверитьУникальностьЭталонныхБенчмарков() - БылЭталонПоКатегории = Новый Соответствие(); + РеестрЭталоновПоКатегориям = Новый Соответствие(); Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл @@ -130,51 +164,89 @@ Категория = ДескрипторБенчмарка.Категория(); - Если БылЭталонПоКатегории[Категория] = Истина Тогда + Если РеестрЭталоновПоКатегориям[Категория] = Истина Тогда Если ЗначениеЗаполнено(Категория) Тогда - _СписокОшибок.Добавить("В пределах одной категории может быть только один эталонный бенчмарк"); + ДобавитьОшибку(СтрШаблон( + "В категории <%1> обнаружено более одного эталонного бенчмарка. " + + "В пределах одной категории может быть помечен как эталонный только один бенчмарк.", + Категория + )); Иначе - _СписокОшибок.Добавить("Может быть только один эталонный бенчмарк"); + ДобавитьОшибку( + "Обнаружено более одного эталонного бенчмарка без категории. " + + "Среди бенчмарков без категории может быть только один эталон." + ); КонецЕсли; КонецЕсли; - БылЭталонПоКатегории[Категория] = Истина; + РеестрЭталоновПоКатегориям[Категория] = Истина; КонецЦикла; КонецПроцедуры +// Проверяет сериализуемость всех параметров конфигурации и бенчмарков. +// +// Все параметры должны иметь примитивные типы данных для корректной сериализации +// результатов. Параметры составных типов должны передаваться через источники. +// +// Проверяются: +// - Общие параметры из конфигурации (параметры полей) +// - Параметры методов всех бенчмарков Процедура ПроверитьСериализуемостьПараметров() - // Параметры полей + ПроверитьСериализуемостьОбщихПараметров(); + ПроверитьСериализуемостьПараметровБенчмарков(); + +КонецПроцедуры + +// Проверяет сериализуемость общих параметров конфигурации. +// +Процедура ПроверитьСериализуемостьОбщихПараметров() + Для Каждого Параметр Из _Конфигурация.Параметры() Цикл - ПроверитьПараметрНаВозможностьСериализации(Параметр); + ПроверитьСериализуемостьПараметра(Параметр); КонецЦикла; + +КонецПроцедуры - // Параметры методов +// Проверяет сериализуемость параметров всех методов бенчмарков. +// +Процедура ПроверитьСериализуемостьПараметровБенчмарков() + Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл - Для Каждого НаборыПараметров Из ДескрипторБенчмарка.НаборыПараметров() Цикл - Для Каждого Параметр Из НаборыПараметров.ВМассив() Цикл - ПроверитьПараметрНаВозможностьСериализации(Параметр); + Для Каждого НаборПараметров Из ДескрипторБенчмарка.НаборыПараметров() Цикл + Для Каждого Параметр Из НаборПараметров.ВМассив() Цикл + ПроверитьСериализуемостьПараметра(Параметр); КонецЦикла; КонецЦикла; КонецЦикла; - + КонецПроцедуры -Процедура ПроверитьПараметрНаВозможностьСериализации(Параметр) +Процедура ПроверитьСериализуемостьПараметра(Параметр) - ШаблонОшибки = - "Значение параметра <%1> должно быть примитивного типа. " - + "Параметры составных типов следует передавать через механизм источников параметров."; - - Если Не СериализацияОбъектовБенчмаркинга.ЭтоПримитив(Параметр.Значение()) Тогда - ТекстОшибки = СтрШаблон(ШаблонОшибки, Параметр.Имя()); - Если _СписокОшибок.Найти(ТекстОшибки) = Неопределено Тогда - _СписокОшибок.Добавить(ТекстОшибки); - КонецЕсли; + Если СериализацияОбъектовБенчмаркинга.ЭтоПримитив(Параметр.Значение()) Тогда + Возврат; КонецЕсли; + + ТекстОшибки = СтрШаблон( + "Параметр <%1> имеет непримитивный тип <%2> и не может быть сериализован. " + + "Используйте источники параметров (&ИсточникПараметров) для передачи значений составных типов.", + Параметр.Имя(), + ТипЗнч(Параметр.Значение()) + ); + + ДобавитьОшибку(ТекстОшибки); + +КонецПроцедуры +Процедура ДобавитьОшибку(ТекстОшибки) + + Если _НайденныеОшибки.Найти(ТекстОшибки) = Неопределено Тогда + _НайденныеОшибки.Добавить(ТекстОшибки); + КонецЕсли; + КонецПроцедуры #КонецОбласти \ 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\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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 35b638d..02a9fd6 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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" @@ -6,6 +6,11 @@ #Область ОбработчикиСобытий +// Инициализирует генератор кейсов бенчмарков +// +// Параметры: +// ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов +// Конфигурация - КонфигурацияБенчмарков - Конфигурация запуска Процедура ПриСозданииОбъекта(ДескрипторыБенчмарков, Конфигурация) АдаптерИсточникаБенчмарков = Новый АдаптерИсточникаБенчмарков(ДескрипторыБенчмарков); @@ -21,16 +26,28 @@ #Область ПрограммныйИнтерфейс -Функция Сгенерировать() Экспорт - - Кейсы = Новый Массив; +// Генерирует все кейсы для запуска бенчмарков +// +// Создает полную матрицу кейсов путем комбинирования: +// 1. Всех дескрипторов бенчмарков +// 2. Всех исполняющих сред +// 3. Всех комбинаций параметров (общих и специфичных для бенчмарка) +// +// Возвращаемое значение: +// Массив из КейсБенчмарка - Полный список всех сгенерированных кейсов +// +// Примечания: +// - Если параметры отсутствуют, создается кейс без параметров +// - Если среды не заданы, используется текущая среда выполнения +Функция СгенерироватьВсеКейсы() Экспорт + + КоллекцияКейсов = Новый Массив; + ИсполняющиеСреды = ПолучитьСписокИсполняющихСред(); ПараметрыКонфигурации = _Конфигурация.Параметры(); ПараметрыКонфигурацииИзИсточников = ПрочитатьОбщиеПараметрыИзИсточников(); - ВерсииСреды = ПолучитьИсполняющиеСреды(); - СчетчикИдентификаторов = 0; - - Для Каждого ИсполняющаяСреда Из ВерсииСреды Цикл + СледующийИдентификатор = 0; + Для Каждого ИсполняющаяСреда Из ИсполняющиеСреды Цикл Для Каждого ДескрипторБенчмарка Из _ДескрипторыБенчмарков.ВМассив() Цикл НаборыПараметров = Новый Массив(); @@ -46,39 +63,51 @@ КомбинацииПараметров.Добавить(Новый Массив()); КонецЕсли; - Для Каждого Параметры Из КомбинацииПараметров Цикл + Для Каждого КомбинацияПараметров Из КомбинацииПараметров Цикл - СчетчикИдентификаторов = СчетчикИдентификаторов + 1; + СледующийИдентификатор = СледующийИдентификатор + 1; Кейс = Новый КейсБенчмарка( - СчетчикИдентификаторов, + СледующийИдентификатор, ДескрипторБенчмарка, - Параметры, + КомбинацияПараметров, ИсполняющаяСреда ); - Кейсы.Добавить(Кейс); + КоллекцияКейсов.Добавить(Кейс); КонецЦикла; КонецЦикла; - КонецЦикла; - Возврат Кейсы; + Возврат КоллекцияКейсов; КонецФункции +// Генерирует кейсы только с указанными идентификаторами +// +// Используется для повторного запуска конкретных кейсов или выборочного тестирования. +// +// Параметры: +// Идентификаторы - Массив из Число - Список идентификаторов кейсов для генерации +// +// Возвращаемое значение: +// Массив из КейсБенчмарка - отфильтрованный список кейсов Функция СгенерироватьПоИдентификаторам(Идентификаторы) Экспорт - Кейсы = Сгенерировать(); + Кейсы = СгенерироватьВсеКейсы(); - Контекст = Новый Структура("Идентификаторы", Идентификаторы); + КонтекстФильтрации = Новый Структура("Идентификаторы", Идентификаторы); - Возврат ПроцессорыКоллекций + НайденныеКейсы = ПроцессорыКоллекций .ИзКоллекции(Кейсы) - .Фильтровать("Элемент -> Идентификаторы.Найти(Элемент.Идентификатор()) <> Неопределено", Контекст) + .Фильтровать("Элемент -> Идентификаторы.Найти(Элемент.Идентификатор()) <> Неопределено", КонтекстФильтрации) .ВМассив(); + + ПроверитьПолнотуНайденныхКейсов(НайденныеКейсы, Идентификаторы); + + Возврат НайденныеКейсы; КонецФункции @@ -124,7 +153,7 @@ КонецФункции -Функция ПолучитьИсполняющиеСреды() +Функция ПолучитьСписокИсполняющихСред() ВерсииСреды = _Конфигурация.ИсполняющиеСреды(); ВыполнятьВТекущейВерсии = ВерсииСреды.Количество() = 0; @@ -137,6 +166,30 @@ КонецФункции +Процедура ПроверитьПолнотуНайденныхКейсов(НайденныеКейсы, ЗапрошенныеИдентификаторы) + + НайденныеИдентификаторы = ПроцессорыКоллекций + .ИзКоллекции(НайденныеКейсы) + .Обработать("Элемент -> Элемент.Идентификатор()") + .ВМассив(); + + КонтекстФильтрации = Новый Структура("НайденныеИдентификаторы", НайденныеИдентификаторы); + НенайденныеИдентификаторы = ПроцессорыКоллекций + .ИзКоллекции(ЗапрошенныеИдентификаторы) + .Фильтровать("Идентификатор -> НайденныеИдентификаторы.Найти(Идентификатор) = Неопределено", КонтекстФильтрации) + .ВМассив(); + + Если НенайденныеИдентификаторы.Количество() > 0 Тогда + ВызватьИсключение СтрШаблон( + "Не найдено %1 из %2 запрошенных кейсов. Ненайденные идентификаторы кейсов: %3", + НенайденныеИдентификаторы.Количество(), + ЗапрошенныеИдентификаторы.Количество(), + СтрСоединить(НенайденныеИдентификаторы, ", ") + ); + КонецЕсли; + +КонецПроцедуры + Процедура ДополнитьМассив(МассивПриемник, МассивИсточник) Для Каждого Значение Из МассивИсточник Цикл МассивПриемник.Добавить(Значение); 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 be357a9..86fcff8 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" @@ -59,19 +59,18 @@ // Запускает бенчмарки в текущем процессе // // Параметры: -// Кейсы - Массив из КейсБенчмарка - Кейсы бенчмарков +// ИдентификаторыКейсов - Массив из Число - Идентификаторы кейсов // // Возвращаемое значение: // РезультатЗапускаБенчмарков -Функция Запустить(Кейсы = Неопределено) Экспорт +Функция Запустить(ИдентификаторыКейсов = Неопределено) Экспорт - // TODO: Проверка кейсов в валидаторе Валидатор = Новый ВалидаторЗапускаБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); Если Не Валидатор.ЗапускВозможен() Тогда ВызватьИсключение Валидатор.ПолучитьТекстОшибок(); КонецЕсли; - РезультатЗапуска = ПодготовитьИЗапуститьБенчмарки(Кейсы); + РезультатЗапуска = ПодготовитьИЗапуститьБенчмарки(ИдентификаторыКейсов); Если Не _ЭтоДочернийПроцесс Тогда РепортерРезультатов = _Репортер; @@ -92,7 +91,7 @@ #Область СлужебныеПроцедурыИФункции -Функция ПодготовитьИЗапуститьБенчмарки(Кейсы) +Функция ПодготовитьИЗапуститьБенчмарки(ИдентификаторыКейсов) _БылоВыполнениеИтерации = Ложь; _НовыйЧекпоинт = Неопределено; @@ -117,7 +116,7 @@ ВызватьОбработчикСобытия(СобытияБенчмарков.ПередВсеми, КонтекстСобытия); // Запуск бенчмарков - ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска); + ЗапуститьКейсыБенчмарков(ИдентификаторыКейсов, РезультатЗапуска); // Подготовка результатов РезультатЗапуска.Чекпоинт = _НовыйЧекпоинт; @@ -139,11 +138,14 @@ КонецФункции -Процедура ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска) +Процедура ЗапуститьКейсыБенчмарков(ИдентификаторыКейсов, РезультатЗапуска) - Если Кейсы = Неопределено Тогда - ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); - Кейсы = ГенераторКейсов.Сгенерировать(); + ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); + + Если ИдентификаторыКейсов <> Неопределено Тогда + Кейсы = ГенераторКейсов.СгенерироватьПоИдентификаторам(ИдентификаторыКейсов); + Иначе + Кейсы = ГенераторКейсов.СгенерироватьВсеКейсы(); КонецЕсли; Для Каждого Кейс Из Кейсы Цикл diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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 31ad77c..583016f 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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" @@ -87,7 +87,7 @@ ); ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); - Кейсы = ГенераторКейсов.Сгенерировать(); + Кейсы = ГенераторКейсов.СгенерироватьВсеКейсы(); ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска); diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" index be16ed4..4c3631e 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\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\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.os" @@ -23,7 +23,7 @@ &Несериализуемое Перем Отчет Экспорт; // ОтчетБенчмарков -#Область ОбработчикиСобыий +#Область ОбработчикиСобытий Процедура ПриСозданииОбъекта() diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\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\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index 00362dd..e84b409 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\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\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -77,12 +77,9 @@ |ИдентификаторыКейсов = Настройки.ИдентификаторыКейсов; |Чекпоинт = Настройки.Чекпоинт; | - |ГенераторКейсов = Новый ГенераторКейсовБенчмарков(ДескрипторыБенчмарков, Конфигурация); - |Кейсы = ГенераторКейсов.СгенерироватьПоИдентификаторам(ИдентификаторыКейсов); - | |Запускатель = Новый ЗапускательБенчмарков(ДескрипторыБенчмарков, Конфигурация); |Запускатель.УстановитьЧекпоинт(Чекпоинт); - |Запускатель.Запустить(Кейсы); + |Запускатель.Запустить(ИдентификаторыКейсов); |"; Возврат ТекстСценария; diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\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\276\320\262.os" "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\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\276\320\262.os" index 2b9d5ff..6508297 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\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\276\320\262.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214\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\276\320\262.os" @@ -28,9 +28,9 @@ Функция ПрочитатьКакОбщиеПараметры(Источник, ИмяПоля) Экспорт ОбщиеПараметры = Новый Массив(); - ЗначеЗначенияИзИсточника = ПолучитьЗначенияИзИсточника(Источник); + ЗначенияИзИсточника = ПолучитьЗначенияИзИсточника(Источник); - Для Каждого Значение Из ЗначеЗначенияИзИсточника Цикл + Для Каждого Значение Из ЗначенияИзИсточника Цикл ОбщийПараметр = Новый ПараметрБенчмарка(ИмяПоля, Значение, Ложь); ОбщиеПараметры.Добавить(ОбщийПараметр); КонецЦикла; 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 856fa74..573578d 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" @@ -106,7 +106,7 @@ Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) - .ВыбрасываетИсключение("Запрещается запускать бенчмарки с разными типами"); + .ВыбрасываетИсключение("Обнаружены бенчмарки из разных классов"); КонецПроцедуры @@ -617,7 +617,7 @@ Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) - .ВыбрасываетИсключение("Значение параметра <Значение> должно быть примитивного типа"); + .ВыбрасываетИсключение("Параметр <Значение> имеет непримитивный тип"); КонецПроцедуры @@ -653,6 +653,6 @@ Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) - .ВыбрасываетИсключение("Дескрипторы бенчмарков не найдены"); + .ВыбрасываетИсключение("Не найдено ни одного дескриптора бенчмарка для запуска"); КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" index 3b8cd78..a10b9aa 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" @@ -265,4 +265,6 @@ КонецЦикла; -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +ТестДолжен_ЗапуститьОдинБенчмаркОднойИтерациейБезПараметровСПамятью(); \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\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 5cc5ab8..6536f1b 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" @@ -791,6 +791,31 @@ КонецПроцедуры +&Тест +Процедура ТестДолжен_ВыброситьИсключениеПриГенерацииКейсовСНеизвестнымИдентификатором() Экспорт + + // Подготовка + Тип = Тип("ПустойБенчмарк"); + ДескрпиторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип); + Конфигурация = Новый КонфигурацияБенчмарков(Тип); + + ИдентификаторыКейсов = Новый Массив(); + ИдентификаторыКейсов.Добавить(1); + ИдентификаторыКейсов.Добавить(100); + + ПараметрыМетода = Новый Массив(); + ПараметрыМетода.Добавить(ИдентификаторыКейсов); + + ГенераторКейсов = Новый ГенераторКейсовБенчмарков(ДескрпиторыБенчмарков, Конфигурация); + + // Действие и Проверка + Ожидаем + .Что(ГенераторКейсов) + .Метод("СгенерироватьПоИдентификаторам", ПараметрыМетода) + .ВыбрасываетИсключение("Не найдено 1 из 2 запрошенных кейсов. Ненайденные идентификаторы кейсов: 100"); + +КонецПроцедуры + Процедура ПроверитьКонфигурациюБенчмаркаСАннотациямиКонфигурации(Конфигурация) Экспортеры = Конфигурация.Экспортеры(); @@ -845,4 +870,6 @@ Возврат СтрРазделить(ТекстЛога, Символы.ПС, Ложь); -КонецФункции \ No newline at end of file +КонецФункции + +ТестДолжен_ВыброситьИсключениеПриГенерацииКейсовСНеизвестнымИдентификатором(); \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\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 7edcf36..409b17a 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" @@ -191,7 +191,7 @@ Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) - .ВыбрасываетИсключение("Может быть только один эталонный бенчмарк"); + .ВыбрасываетИсключение("Обнаружено более одного эталонного бенчмарка без категории"); КонецПроцедуры @@ -216,7 +216,7 @@ Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) - .ВыбрасываетИсключение("В пределах одной категории может быть только один эталонный бенчмарк"); + .ВыбрасываетИсключение("обнаружено более одного эталонного бенчмарка"); КонецПроцедуры @@ -239,7 +239,7 @@ Ожидаем .Что(Бенчмаркинг) .Метод("Запустить", ПараметрыМетода) - .ВыбрасываетИсключение("Допускается только одна эталонная версия исполняющей среды"); + .ВыбрасываетИсключение("Допускается помечать как эталонную только одну среду выполнения"); КонецПроцедуры @@ -286,6 +286,10 @@ &Тест Процедура ТестДолжен_ЗапуститьБенчмаркиССылочнымиПараметрами() Экспорт + Если ТестированиеБенчмарков.ЭтоOneScript1() Тогда + Возврат; + КонецЕсли; + // Подготовка Тип = Тип("БенчмаркиСЭталономИПараметрами"); From 963ea75e334a20160f1c901f4fcce965150a5f7f Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 7 Mar 2026 22:09:15 +0300 Subject: [PATCH 03/11] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B8=20=D1=83=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE=D0=BA=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +- docs/CLI.md | 43 +- ...20\241\321\202\320\260\321\200\321\202.md" | 6 +- ...20\260\321\200\320\272\320\276\320\262.md" | 13 +- ...20\267\320\260\321\206\320\270\321\217.md" | 337 +++++++--- ...20\277\321\203\321\201\320\272\320\260.md" | 37 +- ...20\277\321\203\321\201\320\272\320\260.os" | 2 +- ...20\260\321\200\320\272\320\276\320\262.os" | 2 +- ...20\260\321\200\320\272\320\276\320\262.os" | 562 +++++------------ ...20\260\321\200\320\272\320\276\320\262.os" | 300 --------- ...20\260\321\200\320\272\320\276\320\262.os" | 584 ++++++++++++++++++ ...20\274\320\260\321\200\320\272\320\260.os" | 6 +- ...21\200\320\272\320\270\320\275\320\263.os" | 2 +- ...21\203\321\201\320\272\320\276\320\262.os" | 4 +- ...21\200\320\260\321\206\320\270\320\270.os" | 4 +- ...20\273\320\276\320\275\320\276\320\262.os" | 2 + 16 files changed, 1069 insertions(+), 844 deletions(-) delete mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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" create mode 100644 "src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\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" diff --git a/README.md b/README.md index 0123af0..d321287 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - # BenchmarkOneScript [![Release](https://img.shields.io/github/release/Stivo182/BenchmarkOneScript.svg)](https://github.com/Stivo182/BenchmarkOneScript/releases) @@ -18,7 +17,6 @@ Библиотека для измерения производительности кода на OneScript, вдохновлённая [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet/), с поддержкой параметризации, мониторинга памяти и гибкой настройки тестов. - ## Возможности - **Гибкая настройка:** конфигурация тестов через аннотации, программный код и CLI. @@ -28,7 +26,7 @@ - **Метрики:** время выполнения (среднее, минимум, максимум), стандартное отклонение и ошибка, операций в секунду (Op/s), квартили и произвольные процентили. - **Экспорт результатов:** сохранение результатов выполнения бенчмарков в Markdown, JSON, HTML. -## 🚀 Быстрый старт +## Быстрый старт ## 1. Установка @@ -38,7 +36,7 @@ opm install benchmark ## 2. Создание бенчмарка -Создайте класс с методами, помеченными аннотацией `&Бенчмарк`, где каждый метод реализует тестируемую логику. +Создайте класс с методами, помеченными аннотацией `&Бенчмарк`, где каждый метод реализует тестируемую логику. В следующем примере мы сравниваем алгоритмы конкатенации строк через оператор `+` и метод `СтрСоединить`: ```bsl @@ -79,14 +77,13 @@ opm install benchmark **CLI:** ```bash -benchos run [OPTIONS] [FILE] +benchos run КонкатенацияСтрок.os ``` **API:** ```bsl #Использовать benchmark -#Использовать "." Результат = Бенчмаркинг.Запустить(Тип("КонкатенацияСтрок")); ``` diff --git a/docs/CLI.md b/docs/CLI.md index 9adecd1..ce1c79a 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -10,21 +10,27 @@ benchos run [OPTIONS] [FILE] ### Опции -| Опция | Описание | Пример | -| --- | --- | --- | -| `--iterationCount` | Количество измерительных итераций | `--iterationCount 10` | -| `--iterationTime` | Минимальное время выполнения одной итерации (мс) | `--iterationTime 500` | -| `--warmupCount` | Количество прогревочных итераций | `--warmupCount 10` | -| `--invocationCount` | Количество вызовов метода за итерацию | `--invocationCount 100` | -| `--runtime` | Версии OneScript через запятую (current, stable, dev, x.x.x). | `--runtime dev,stable` | -| `--throughput` | Стратегия выполнения [`ПропускнаяСпособность`](СтратегииЗапуска.md#пропускная-способность-throughput) | | -| `--coldstart` | Стратегия выполнения [`ХолодныйЗапуск`](СтратегииЗапуска.md#холодный-запуск-cold-start) | | -| `-m`, `--memory` | Включить [мониторинг использования памяти](МониторингПамяти.md) | | -| `-e`, `--exporters` | Форматы [экспорта результатов](ЭкспортРезультатов.md) (`md`, `json`, `html`) | `-e json,html` | -| `-a`, `--artifacts` | Каталог для сохранения результатов | `-a path/to/file` | -| `-r`, `--recursive` | Рекурсивный поиск в поддиректориях | | -| `--settings` | Файл настроек бенчмарков в формате JSON | `--settings path/to/settings.json` | -| `--debug` | Порт отладки | `--debug 2801` | +| Опция | Описание | По умолчанию | Пример | +| --- | --- | --- | --- | +| `--iterationCount` | Количество измерительных итераций | `15` | `--iterationCount 10` | +| `--iterationTime` | Минимальное время выполнения одной итерации (мс) | `100` | `--iterationTime 500` | +| `--warmupCount` | Количество прогревочных итераций | `6` | `--warmupCount 10` | +| `--invocationCount` | Количество вызовов метода за итерацию (0 = авто) | `0` | `--invocationCount 100` | +| `--runtime` | Версии OneScript через запятую (`current`, `stable`, `dev`, `x.x.x`) | | `--runtime dev,stable` | +| `--throughput` | Стратегия выполнения [`ПропускнаяСпособность`](СтратегииЗапуска.md#пропускная-способность-throughput) | | | +| `--coldstart` | Стратегия выполнения [`ХолодныйЗапуск`](СтратегииЗапуска.md#холодный-запуск-cold-start) | | | +| `-m`, `--memory` | Включить [мониторинг использования памяти](МониторингПамяти.md) | | | +| `-e`, `--exporters` | Форматы [экспорта результатов](ЭкспортРезультатов.md) через запятую: `md`, `json`, `html` | | `-e json, html` | +| `-a`, `--artifacts` | Каталог для сохранения результатов | `.\BenchmarkArtifacts` | `-a path/to/dir` | +| `-r`, `--recursive` | Рекурсивный поиск в поддиректориях | | | +| `--settings` | Файл настроек бенчмарков в формате JSON | | `--settings path/to/settings.json` | +| `--debug` | Порт отладки | | `--debug 2801` | + +### Примечания + +- Опции `--throughput` и `--coldstart` взаимно исключают друг друга. +- Значение `--invocationCount 0` включает автоматический расчёт количества вызовов за итерацию. +- Опции `--warmupCount`, `--invocationCount`, `--iterationTime` игнорируются при стратегии `--coldstart`. ## Примеры @@ -44,6 +50,9 @@ benchos run /path/to/benchmarks # Запуск всех бенчмарков в директории, включая вложенные каталоги benchos run -r /path/to/benchmarks -# Рекурсивный запуск с мониторингом памяти и экспортом в JSON -benchos run -r -m -e json ./benchmarks/ +# Рекурсивный запуск с мониторингом памяти и экспортом в JSON и HTML +benchos run -r -m -e 'json, html' ./benchmarks/ + +# Холодный запуск с 10 итерациями +benchos run --coldstart --iterationCount 10 /path/to/МойКласс.os ``` \ No newline at end of file diff --git "a/docs/\320\221\321\213\321\201\321\202\321\200\321\213\320\271\320\241\321\202\320\260\321\200\321\202.md" "b/docs/\320\221\321\213\321\201\321\202\321\200\321\213\320\271\320\241\321\202\320\260\321\200\321\202.md" index a83fd9d..45167d9 100644 --- "a/docs/\320\221\321\213\321\201\321\202\321\200\321\213\320\271\320\241\321\202\320\260\321\200\321\202.md" +++ "b/docs/\320\221\321\213\321\201\321\202\321\200\321\213\320\271\320\241\321\202\320\260\321\200\321\202.md" @@ -8,7 +8,7 @@ opm install benchmark ## 2. Создание бенчмарка -Создайте класс с методами, помеченными аннотацией `&Бенчмарк`, где каждый метод реализует тестируемую логику. +Создайте класс с методами, помеченными аннотацией `&Бенчмарк`, где каждый метод реализует тестируемую логику. В следующем примере мы сравниваем алгоритмы конкатенации строк через оператор `+` и метод `СтрСоединить`: ```bsl @@ -42,6 +42,7 @@ opm install benchmark Текст = СтрСоединить(МассивПодстрок); КонецПроцедуры ``` + ## 3. Запуск бенчмарков Запустите бенчмарки одним из следующих способов: @@ -49,14 +50,13 @@ opm install benchmark **CLI:** ```bash -benchos run [OPTIONS] [FILE] +benchos run КонкатенацияСтрок.os ``` **API:** ```bsl #Использовать benchmark -#Использовать "." Результат = Бенчмаркинг.Запустить(Тип("КонкатенацияСтрок")); ``` diff --git "a/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" "b/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" index f08554f..2978599 100644 --- "a/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" +++ "b/docs/\320\227\320\260\320\277\321\203\321\201\320\272\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\276\320\262.md" @@ -8,7 +8,7 @@ benchos run [OPTIONS] [FILE] Подробнее см. в разделе [CLI](CLI.md). -### Примеры использования +### Примеры ```bash # Запуск по имени класса (файл МойКласс.os должен существовать в текущей директории) @@ -47,7 +47,7 @@ benchos run -r -m -e json ./benchmarks/ ```bsl ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип("МойКласс")); -// Запуск конкретного бенчмарка +// Запуск конкретного бенчмарка по имени ДескрипторБенчмарка = ДескрипторыБенчмарков.НайтиПоИмени("МойБенчмарк"); Результат = Бенчмаркинг.Запустить(ДескрипторБенчмарка); @@ -60,10 +60,10 @@ benchos run -r -m -e json ./benchmarks/ ```bsl // Запуск из каталога -Результат = Бенчмаркинг.ЗапуститьИзКаталога("/path/to/benchmarks"); +Результаты = Бенчмаркинг.ЗапуститьИзКаталога("/path/to/benchmarks"); // Запуск из каталога, включая вложенные каталоги -Результат = Бенчмаркинг.ЗапуститьИзКаталога("/path/to/benchmarks", Истина); +Результаты = Бенчмаркинг.ЗапуститьИзКаталога("/path/to/benchmarks", Истина); ``` ### Запуск с передачей конфигурации @@ -84,4 +84,9 @@ benchos run -r -m -e json ./benchmarks/ // ... Результат = Бенчмаркинг.Запустить(Тип("МойКласс"), Конфигурация); + +// Запуск из каталога с конфигурацией, которая объединяется с приоритетом с конфигурацией каждого бенчмарка +Конфигурация = Новый КонфигурацияБенчмарков(); +Конфигурация.УстановитьКоличествоИтераций(10); +Результаты = Бенчмаркинг.ЗапуститьИзКаталога("/path/to/benchmarks", Истина, Конфигурация); ``` diff --git "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" index d2ca942..2d02c94 100644 --- "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" +++ "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" @@ -1,161 +1,323 @@ # Параметризация -Параметризация позволяет тестировать производительность кода с различными входными данными. +Параметризация позволяет запускать бенчмарки с различными входными данными для анализа производительности в разных условиях. -## Конфигурирование +# Виды параметров -### Аннотации +## Общие параметры класса -**Общие параметры бенчмарков, заданные напрямую** +**Общие параметры** применяются ко всем бенчмаркам класса и задаются через экспортные поля класса. +Они создают варианты выполнения всех бенчмарков с разными значениями общих параметров. -Используйте аннотацию `&Параметры` для указания значений общего параметра бенчмарков. Можно указать значения в одной аннотации или в нескольких. +### Пример ```bsl -// Вариант 1: Все значения в одной аннотации &Параметры("MD5", "SHA256") Перем АлгоритмХеширования Экспорт; -// Вариант 2: Отдельные аннотации для каждого значения +&Бенчмарк +Процедура ХешированиеСтроки() Экспорт + // Использует АлгоритмХеширования +КонецПроцедуры + +&Бенчмарк +Процедура ХешированиеФайла() Экспорт + // Также использует АлгоритмХеширования +КонецПроцедуры +``` + +Каждый бенчмарк будет запущен дважды: +- `АлгоритмХеширования = "MD5"` +- `АлгоритмХеширования = "SHA256"` + +## Параметры бенчмарка + +**Параметры бенчмарка** задаются индивидуально для каждого метода бенчмарка через его аргументы. Они создают варианты выполнения только конкретного бенчмарка. + +### Пример + +```bsl +&Бенчмарк +&Параметры(100, 1000) +&Параметры(500, 5000) +Процедура ОбработкаМассива(РазмерМассива, КоличествоИтераций) Экспорт + // Логика бенчмарка +КонецПроцедуры +``` + +Бенчмарк будет запущен дважды: +- `РазмерМассива = "100"`, `КоличествоИтераций = 1000` +- `РазмерМассива = "500"`, `КоличествоИтераций = 5000` + +## Комбинирование параметров + +При использовании обоих видов параметров создаются все возможные комбинации общих параметров и параметров бенчмарка. + +### Пример + +```bsl +&Параметры("MD5", "SHA256") +Перем АлгоритмХеширования Экспорт; + +&Бенчмарк +&Параметры(100) +&Параметры(1000) +Процедура ХешированиеСтроки(ДлинаСтроки) Экспорт + // Логика бенчмарка +КонецПроцедуры +``` + +Бенчмарк будет запущен **4 раза**: +- `АлгоритмХеширования = "MD5"`, `ДлинаСтроки = 100` +- `АлгоритмХеширования = "MD5"`, `ДлинаСтроки = 1000` +- `АлгоритмХеширования = "SHA256"`, `ДлинаСтроки = 100` +- `АлгоритмХеширования = "SHA256"`, `ДлинаСтроки = 1000` + +--- + +# Способы задания параметров + +Параметры можно задавать тремя способами, каждый из которых подходит для разных сценариев: +- **Аннотации `&Параметры`** — для простых случаев с фиксированными значениями +- **Функции-источники `&ИсточникПараметров`** — для динамической генерации +- **API конфигурации** — для программного управления параметрами + +## 1. Прямое указание через аннотацию `&Параметры` + +Простой и наглядный способ для небольшого количества фиксированных значений. + +### Общие параметры класса + +Аннотация размещается непосредственно над объявлением экспортного поля класса. + +```bsl +// Вариант 1 - все значения в одной аннотации +&Параметры("MD5", "SHA256", "SHA512") +Перем АлгоритмХеширования Экспорт; + +// Вариант 2 - отдельная аннотация для каждого значения &Параметры("MD5") &Параметры("SHA256") +&Параметры("SHA512") Перем АлгоритмХеширования Экспорт; ``` +Оба варианта эквивалентны и создают три варианта запуска всех бенчмарков класса. -**Общие параметры бенчмарков, полученные из функции** +### Параметры бенчмарка -Используйте аннотацию `&ИсточникПараметров` для указания экспортной функции, возвращающей коллекцию значений для общего параметра бенчмарков. -Функция может быть определена в самом сценарии бенчмарка, любом другом модуле/классе. +Аннотация размещается над методом бенчмарка. Каждая аннотация `&Параметры` создает один набор параметров. ```bsl -&ИсточникПараметров("ПолучитьАлгоритмыХеширования") // Экспортная функция внутри класса бенчмарков -&ИсточникПараметров("ХранилищеАлгоритмов.ПолучитьАлгоритмыХеширования") // Экспортная функция класса ХранилищеАлгоритмов -Перем АлгоритмХеширования Экспорт; +&Бенчмарк +&Параметры(50, 100) +&Параметры(75, 150) +Процедура Бенчмарк(Парам1, Парам2) Экспорт + // Логика бенчмарка +КонецПроцедуры ``` +**Важно:** Количество значений в аннотации должно соответствовать количеству параметров метода. + +## 2. Функции-источники данных `&ИсточникПараметров` + +Гибкий способ для динамической генерации параметров или получения их из внешних источников. + +> **⚠️ ВАЖНО: Детерминированность функций-источников** +> +> **Функция-источник ДОЛЖНА возвращать:** +> - Одинаковые значения при каждом вызове +> - Элементы в неизменном порядке +> - Постоянное количество элементов + +### Общие параметры класса + +Функция-источник должна возвращать массив или таблицу значений. Каждый элемент коллекции становится отдельным значением общего параметра. + ```bsl +&ИсточникПараметров("ПолучитьАлгоритмыХеширования") +Перем АлгоритмХеширования Экспорт; + +// Функция-источник внутри класса бенчмарков Функция ПолучитьАлгоритмыХеширования() Экспорт - Значения = Новый Массив(); - Значения.Добавить("MD5"); - Значения.Добавить("SHA256"); - Возврат Значения; + + Алгоритмы = Новый Массив(); + Алгоритмы.Добавить("MD5"); + Алгоритмы.Добавить("SHA256"); + Алгоритмы.Добавить("SHA512"); + + Возврат Алгоритмы; + КонецФункции ``` -**Параметры бенчмарка, заданные напрямую** +Источник может находиться в другом классе или модуле. Укажите полное имя в формате `<ИмяКлассаМодуля>.<ИмяМетода>`: + +```bsl +&ИсточникПараметров("КонфигурацияАлгоритмов.ПолучитьПоддерживаемыеАлгоритмы") +Перем АлгоритмХеширования Экспорт; +``` + +### Параметры бенчмарка -Используйте аннотацию `&Параметры` для указания фиксированного набора параметров бенчмарка. Каждая аннотация задает новый тестовый случай. +Функция-источник возвращает коллекцию наборов параметров - каждый элемент становится одним набором значений для параметров метода бенчмарка. Формат элементов зависит от количества параметров метода. + +#### Для метода с одним параметром ```bsl -&Параметры(50, 100) // Парам1=50, Парам2=100 -&Параметры(75, 150) // Парам1=75, Парам2=150 &Бенчмарк -Процедура Бенчмарк(Парам1, Парам2) Экспорт +&ИсточникПараметров("ПолучитьРазмерыМассивов") +Процедура ОбработкаМассива(РазмерМассива) Экспорт // Логика бенчмарка КонецПроцедуры + +Функция ПолучитьРазмерыМассивов() Экспорт + + Размеры = Новый Массив(); + Размеры.Добавить(100); + Размеры.Добавить(1000); + Размеры.Добавить(10000); + + Возврат Размеры; + +КонецФункции ``` -**Параметры бенчмарка, полученные из функции** +#### Для нескольких параметров — вариант 1: Таблица значений -Используйте аннотацию `&ИсточникПараметров` для указания функции, возвращающей параметры бенчмарка. -Если метод бенчмарка принимает более одного параметра, функция должна возвращать `Массив` или `ТаблицаЗначений`, где каждый элемент соответствует набору параметров. -Функция может быть определена в самом сценарии бенчмарка, любом другом модуле/классе. +Имена колонок таблицы значений должны совпадать с именами параметров метода. ```bsl -&ИсточникПараметров("ПолучитьПараметрыБенчмарка") // Экспортная функция внутри класса бенчмарков -&ИсточникПараметров("ЭкспортерПараметров.ПолучитьПараметрыБенчмарка") // Экспортная функция класса ЭкспортерПараметров &Бенчмарк -Процедура Бенчмарк(Парам1, Парам2) Экспорт +&ИсточникПараметров("ПолучитьПараметрыБенчмарка") +Процедура Бенчмарк(Размер, Итерации) Экспорт // Логика бенчмарка КонецПроцедуры -``` -```bsl -// Вариант 1: Таблица значений Функция ПолучитьПараметрыБенчмарка() Экспорт - Наборы = Новый ТаблицаЗначений; - Наборы.Колонки.Добавить("Парам1"); - Наборы.Колонки.Добавить("Парам2"); + + Наборы = Новый ТаблицаЗначений(); + Наборы.Колонки.Добавить("Размер"); + Наборы.Колонки.Добавить("Итерации"); Набор = Наборы.Добавить(); - Набор.Парам1 = 50; - Набор.Парам2 = 100; + Набор.Размер = 100; + Набор.Итерации = 1000; Набор = Наборы.Добавить(); - Набор.Парам1 = 75; - Набор.Парам2 = 150; + Набор.Размер = 500; + Набор.Итерации = 5000; Возврат Наборы; + КонецФункции +``` + +#### Для нескольких параметров — вариант 2: Массив массивов + +Порядок значений в массиве должен соответствовать порядку параметров метода. + +```bsl +&Бенчмарк +&ИсточникПараметров("ПолучитьПараметрыБенчмарка") +Процедура Бенчмарк(Размер, Итерации) Экспорт + // Логика бенчмарка +КонецПроцедуры -// Вариант 2: Массив массивов Функция ПолучитьПараметрыБенчмарка() Экспорт - Наборы = Новый Массив; - Набор = Новый Массив; + Наборы = Новый Массив(); + + // Набор 1 + Набор = Новый Массив(); Набор.Добавить(50); Набор.Добавить(100); Наборы.Добавить(Набор); - Набор = Новый Массив; + // Набор 2 + Набор = Новый Массив(); Набор.Добавить(75); Набор.Добавить(150); Наборы.Добавить(Набор); Возврат Наборы; + КонецФункции +``` + +#### Для нескольких параметров — вариант 3: Массив структур/соответствий + +Ключи структуры или соответствия сопоставляются с именами параметров метода. + +```bsl +&Бенчмарк +&ИсточникПараметров("ПолучитьПараметрыБенчмарка") +Процедура Бенчмарк(Размер, Итерации) Экспорт + // Логика бенчмарка +КонецПроцедуры -// Вариант 3: Массив структур Функция ПолучитьПараметрыБенчмарка() Экспорт - Наборы = Новый Массив; - Наборы.Добавить(Новый Структура("Парам1, Парам2", 50, 100)); - Наборы.Добавить(Новый Структура("Парам1, Парам2", 75, 150)); + + Наборы = Новый Массив(); + Наборы.Добавить(Новый Структура("Размер, Итерации", 100, 1000)); + Наборы.Добавить(Новый Структура("Размер, Итерации", 500, 5000)); + Возврат Наборы; + КонецФункции ``` -### API +# Конфигурирование через API + +Параметры можно задавать программно через объекты `КонфигурацияБенчмарков` и `ДескрипторБенчмарка`. + +## Общие параметры класса -**Добавление общих параметров бенчмарков** +Используйте методы `ДобавитьПараметр` и `ДобавитьИсточникПараметров` объекта `КонфигурацияБенчмарков`. ```bsl +// Добавление параметров напрямую Конфигурация .ДобавитьПараметр("АлгоритмХеширования", "MD5") .ДобавитьПараметр("АлгоритмХеширования", "SHA256"); -``` - -**Указание источника общих параметров бенчмарков** -```bsl -Конфигурация.ДобавитьИсточникПараметров("АлгоритмХеширования", "ПолучитьАлгоритмыХеширования"); // Экспортная функция внутри класса бенчмарков -Конфигурация.ДобавитьИсточникПараметров("АлгоритмХеширования", "ХранилищеАлгоритмов.ПолучитьАлгоритмыХеширования"); // Экспортная функция класса ХранилищеАлгоритмов +// Добавление источника параметров (метод текущего класса) +Конфигурация.ДобавитьИсточникПараметров( + "АлгоритмХеширования", + "ПолучитьАлгоритмыХеширования" +); + +// Источник из другого класса/модуля +Конфигурация.ДобавитьИсточникПараметров( + "АлгоритмХеширования", + "КонфигурацияАлгоритмов.ПолучитьПоддерживаемыеАлгоритмы" +); ``` -**Добавление параметров бенчмарка** +## Параметры бенчмарка + +Используйте методы `ДобавитьПараметры` и `ДобавитьИсточникПараметров` объекта `ДескрипторБенчмарка`. ```bsl -// Набор 1 +// Добавление одиночного значения (для метода с одним параметром) +Дескриптор.ДобавитьПараметры(100); +Дескриптор.ДобавитьПараметры(500); + +// Добавление набора значений (для метода с несколькими параметрами) НаборПараметров = Новый Массив(); НаборПараметров.Добавить(50); НаборПараметров.Добавить(100); -ДескрипторБенчмарка.ДобавитьПараметры(НаборПараметров); - -// Набор 2 -НаборПараметров = Новый Массив(); -НаборПараметров.Добавить(75); -НаборПараметров.Добавить(150); -ДескрипторБенчмарка.ДобавитьПараметры(НаборПараметров); -``` +Дескриптор.ДобавитьПараметры(НаборПараметров); -**Указание источника параметров бенчмарка** +// Добавление источника параметров (метод текущего класса) +Дескриптор.ДобавитьИсточникПараметров("ПолучитьПараметрыБенчмарка"); -```bsl -ДескрипторБенчмарка.ДобавитьИсточникПараметров("ПолучитьПараметрыБенчмарка"); // Экспортная функция внутри класса бенчмарков -ДескрипторБенчмарка.ДобавитьИсточникПараметров("ЭкспортерПараметров.ПолучитьПараметрыБенчмарка"); // Экспортная функция класса ЭкспортерПараметров +// Источник из другого класса/модуля +Дескриптор.ДобавитьИсточникПараметров("ПараметрыБенчмарков.ПолучитьСтандартныеНаборы"); ``` -## Примеры +# Примеры -### Пример 1: Использование аннотации `&Параметры` +## Пример 1: Комбинирование общих параметров и параметров бенчмарка ```bsl &Параметры(5, 0) @@ -171,7 +333,7 @@ КонецПроцедуры ``` -#### Результаты выполнения +### Результаты выполнения | Method | ДобавляемаяЗадержка | Задержка1 | Задержка2 | Mean | StdErr | StdDev | Op/s | |----------|--------------------:|----------:|----------:|---------:|---------:|----------:|------:| @@ -184,7 +346,7 @@ | Бенчмарк | 5 | 200 | 10 | 215.9 ms | 17.41 us | 67.43 us | 4.631 | | Бенчмарк | 5 | 200 | 20 | 225.9 ms | 28.13 us | 108.95 us | 4.427 | -### Пример 2: Использование аннотации `&ИсточникПараметров` +## Пример 2: Использование источников параметров ```bsl &ИсточникПараметров("ПолучитьМножители") @@ -208,57 +370,64 @@ // Итеративный алгоритм вычисления факториала Функция ФакториалИтеративный(Число) + Результат = 1; + Для Сч = 1 По Число Цикл Результат = Результат * Сч; КонецЦикла; + Возврат Результат; + КонецФункции // Рекурсивный алгоритм вычисления факториала Функция ФакториалРекурсивный(Число) + Если Число <= 1 Тогда Возврат 1; КонецЕсли; + Возврат Число * ФакториалРекурсивный(Число - 1); + КонецФункции -// Метод, возвращающий коллекцию множителей +// Источник общих параметров Функция ПолучитьМножители() Экспорт + Множители = Новый Массив(); Множители.Добавить(1); Множители.Добавить(100); + Возврат Множители; + КонецФункции -// Метод, возвращающий наборы параметров для бенчмарка +// Источник параметров бенчмарка Функция ПолучитьПараметрыБенчмарка() Экспорт Наборы = Новый ТаблицаЗначений(); Наборы.Колонки.Добавить("Число"); Наборы.Колонки.Добавить("ТипАлгоритма"); - - // Набор 1: Маленькое число, итеративный алгоритм + Набор = Наборы.Добавить(); Набор.Число = 10; Набор.ТипАлгоритма = "Итеративный"; - - // Набор 2: Среднее число, рекурсивный алгоритм + Набор = Наборы.Добавить(); Набор.Число = 15; Набор.ТипАлгоритма = "Рекурсивный"; - - // Набор 3: Большое число, итеративный алгоритм + Набор = Наборы.Добавить(); Набор.Число = 20; Набор.ТипАлгоритма = "Итеративный"; - + Возврат Наборы; КонецФункции ``` -#### Результаты выполнения +### Результаты выполнения | Method | Множитель | Число | ТипАлгоритма | Mean | StdErr | StdDev | Op/s | Allocated | |--------------------|----------:|------:|--------------|----------:|----------:|----------:|--------:|----------:| @@ -267,4 +436,4 @@ | БенчмаркФакториала | 1 | 20 | Итеративный | 9.746 us | 51.22 ns | 198.37 ns | 102,607 | 2.272 KB | | БенчмаркФакториала | 100 | 10 | Итеративный | 6.610 us | 142.17 ns | 550.62 ns | 151,295 | 1.489 KB | | БенчмаркФакториала | 100 | 15 | Рекурсивный | 12.316 us | 198.95 ns | 770.54 ns | 81,192 | 4.850 KB | -| БенчмаркФакториала | 100 | 20 | Итеративный | 9.768 us | 38.11 ns | 147.59 ns | 102,378 | 2.272 KB | \ No newline at end of file +| БенчмаркФакториала | 100 | 20 | Итеративный | 9.768 us | 38.11 ns | 147.59 ns | 102,378 | 2.272 KB | diff --git "a/docs/\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260.md" "b/docs/\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260.md" index f920cb7..91b140d 100644 --- "a/docs/\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260.md" +++ "b/docs/\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\227\320\260\320\277\321\203\321\201\320\272\320\260.md" @@ -1,9 +1,17 @@ # Стратегии запуска бенчмарков +Стратегии определяют способ выполнения бенчмарков и влияют на точность и характер получаемых метрик производительности. + ## Пропускная способность (Throughput) -Стратегия используется по умолчанию. Оптимальна для микробенчмаркинга. -Автоматическии подбирает количество вызовов за итерацию. Выполняет прогревочные итерации для стабилизации результатов. +**Стратегия по умолчанию.** Оптимальна для микробенчмаркинга и измерения производительности. +Автоматически подбирает количество вызовов за итерацию. Выполняет прогревочные итерации для стабилизации результатов. + +### Как работает + +1. **Оценочный этап**: автоматически определяет оптимальное количество операций на итерацию +2. **Прогрев**: выполняет итерации для стабилизации кешей +3. **Измерение**: собирает статистику производительности на "разогретом" коде ### Конфигурирование @@ -12,6 +20,8 @@ ```bsl &СтратегияПропускнаяСпособность Процедура ПриСозданииОбъекта() + // ... +КонецПроцедуры ``` #### API @@ -30,9 +40,13 @@ benchos run --throughput [FILE] ## Холодный запуск (Cold Start) -Стратегия для оценки производительности при первом запуске без предварительной оптимизации (Отключает оценочные и прогревочные итерации). +Стратегия для измерения производительности первого запуска. Каждая итерация выполняется в изолированном окружении без предварительных оптимизаций. + +### Как работает -Каждая итерация запускается в отдельном новом процессе. Благодаря этому каждая итерация выполняется в «холодном» окружении и не зависит от состояния предыдущих запусков. +1. **Изоляция процессов**: каждая итерация запускается в отдельном новом процессе с чистым окружением +2. **Отсутствие прогрева**: оценочные и прогревочные итерации отключены +3. **Независимость измерений**: каждое измерение начинается с нулевого состояния и не зависит от предыдущих запусков ### Конфигурирование @@ -41,6 +55,8 @@ benchos run --throughput [FILE] ```bsl &СтратегияХолодныйЗапуск Процедура ПриСозданииОбъекта() + // ... +КонецПроцедуры ``` #### API @@ -59,6 +75,10 @@ benchos run --coldstart [FILE] ## Пример +### Сценарий: Измерение влияния первого вызова + +В этом примере первый вызов метода занимает значительно больше времени из-за инициализации. Стратегия **Холодный запуск** позволяет точно измерить это влияние, так как каждая итерация выполняется в новом процессе. + ```bsl Перем ЭтоПервыйВызов; @@ -116,3 +136,12 @@ Op/s : Операций в секунду 1 s : 1 Секунда 1 us : 1 Микросекунда ``` + +### Интерпретация результатов + +Поскольку каждая итерация выполняется в новом процессе, переменная `ЭтоПервыйВызов` сбрасывается в `Истина` при каждой итерации. Поэтому все 5 измерений показывают время первого вызова (~1 секунда), что и требовалось измерить. + +При использовании стратегии **Пропускная способность** результат был бы другим: +- Первая итерация: ~1 секунда (инициализация) +- Последующие итерации: ~10 мс (быстрые вызовы) +- Среднее значение было бы искажено и не отражало бы реальное время инициализации \ 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 d3278a1..984d51b 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" @@ -91,7 +91,7 @@ ИсточникБенчмарков = Тип; КонецЕсли; - ЗапускательБенчмарков = Новый ИзолированныйЗапускательБенчмарков(ИсточникБенчмарков, ОбъединеннаяКонфигурация); + ЗапускательБенчмарков = Новый ЗапускательБенчмарков(ИсточникБенчмарков, ОбъединеннаяКонфигурация); Если _ПортОтладки > 0 Тогда ЗапускательБенчмарков.УстановитьПортОтладки(_ПортОтладки); diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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 02a9fd6..f287f80 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\232\320\265\320\271\321\201\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" @@ -159,7 +159,7 @@ ВыполнятьВТекущейВерсии = ВерсииСреды.Количество() = 0; Если ВыполнятьВТекущейВерсии Тогда - ВерсииСреды.Добавить(); + ВерсииСреды.Добавить(Новый ИсполняющаяСредаБенчмарков()); КонецЕсли; Возврат ВерсииСреды; 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 86fcff8..3af9c60 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" @@ -1,20 +1,17 @@ #Использовать fs -#Использовать allocs +#Использовать tempfiles #Использовать logos +#Использовать fluent -Перем _ОбъектБенчмарков; // Произвольный, Неопределено - Экземпляр класса с бенчмарками -Перем _Конфигурация; // КонфигурацияБенчмарков -Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков -Перем _МониторПамяти; // МониторПамяти, Неопределено -Перем _Хронометр; // Хронометр -Перем _Репортер; // КонсольныйРепортерБенчмарков, НулевойРепортерБенчмарков -Перем _ЭтоДочернийПроцесс; // Булево -Перем _Чекпоинт; // ЧекпоинтЗапускаБенчмарков, Неопределено -Перем _НовыйЧекпоинт; // ЧекпоинтЗапускаБенчмарков, Неопределено -Перем _БылоВыполнениеИтерации; // Булево -Перем _Лог; // Лог - -// Запускает бенчмарки в текущем процессе +Перем _Конфигурация; // КонфигурацияБенчмарков +Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков +Перем _Репортер; // КонсольныйРепортерБенчмарков, НулевойРепортерБенчмарков +Перем _МенеджерПроцессов; // МенеджерПроцессовБенчмарков, Неопределено +Перем _ПортОтладки; // Число + +#Область ОбработчикиСобытий + +// Создает запускатель бенчмарков // // Параметры: // ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки @@ -25,14 +22,10 @@ Процедура ПриСозданииОбъекта(ИсточникБенчмарков, Конфигурация = Неопределено) АдаптерИсточникаБенчмарков = Новый АдаптерИсточникаБенчмарков(ИсточникБенчмарков); - - _ОбъектБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьОбъектБенчмарков(); - _ДескрипторыБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьКоллекциюДескрипторов(); - _Хронометр = Новый Хронометр(); - _Репортер = Новый КонсольныйРепортерБенчмарков(); - _ЭтоДочернийПроцесс = Бенчмаркинг.ЭтоДочернийПроцесс(); - _БылоВыполнениеИтерации = Ложь; - _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.ЗапускательБенчмарков"); + + _ДескрипторыБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьКоллекциюДескрипторов(); + _Репортер = Новый КонсольныйРепортерБенчмарков(); + _ПортОтладки = 0; Если Не Конфигурация = Неопределено Тогда _Конфигурация = Конфигурация; @@ -40,523 +33,264 @@ _Конфигурация = АдаптерИсточникаБенчмарков.СоздатьКонфигурацию(); КонецЕсли; - Если _Конфигурация.ТребуетсяМониторингПамяти() Тогда - _МониторПамяти = Новый МониторПамяти(); - КонецЕсли; - КонецПроцедуры -#Область ПрограммныйИнтерфейс +#КонецОбласти -// Устанавливает чекпоинт -// -// Параметры: -// Чекпоинт - ЧекпоинтЗапускаБенчмарков - Точка восстановления для продолжения выполнения -Процедура УстановитьЧекпоинт(Чекпоинт) Экспорт - _Чекпоинт = Чекпоинт; -КонецПроцедуры +#Область ПрограммныйИнтерфейс -// Запускает бенчмарки в текущем процессе -// -// Параметры: -// ИдентификаторыКейсов - Массив из Число - Идентификаторы кейсов +// Запускает бенчмарки в изолированных процессах // // Возвращаемое значение: // РезультатЗапускаБенчмарков -Функция Запустить(ИдентификаторыКейсов = Неопределено) Экспорт - +Функция Запустить() Экспорт + Валидатор = Новый ВалидаторЗапускаБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); Если Не Валидатор.ЗапускВозможен() Тогда ВызватьИсключение Валидатор.ПолучитьТекстОшибок(); КонецЕсли; - РезультатЗапуска = ПодготовитьИЗапуститьБенчмарки(ИдентификаторыКейсов); + РезультатЗапуска = ЗапуститьБенчмарки(); - Если Не _ЭтоДочернийПроцесс Тогда - РепортерРезультатов = _Репортер; - Иначе - РепортерРезультатов = Новый НулевойРепортерБенчмарков(); - КонецЕсли; + _Репортер.ВывестиРезультатЗапуска(РезультатЗапуска); - РепортерРезультатов.ВывестиРезультатЗапуска(РезультатЗапуска); - - Экспортер = Новый ЭкспортерРезультатовБенчмарков(РепортерРезультатов); + Экспортер = Новый ЭкспортерРезультатовБенчмарков(_Репортер); Экспортер.Записать(РезультатЗапуска); Возврат РезультатЗапуска; КонецФункции +// Устанавливает порт для отладки +// +// Параметры: +// Порт - Число - Номер порта для отладки +Процедура УстановитьПортОтладки(Порт) Экспорт + _ПортОтладки = Порт; +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции -Функция ПодготовитьИЗапуститьБенчмарки(ИдентификаторыКейсов) - - _БылоВыполнениеИтерации = Ложь; - _НовыйЧекпоинт = Неопределено; - - ПрогретьИнструментыЗамера(); - - Если Не _ЭтоДочернийПроцесс Тогда - _Репортер.ВывестиЗаголовок(); - _Репортер.ВывестиКонфигурацию(_Конфигурация); - КонецЕсли; +Функция ЗапуститьБенчмарки() - // Инициализация результатов РезультатЗапуска = Новый РезультатЗапускаБенчмарков(); РезультатЗапуска.ДескрипторыБенчмарков = _ДескрипторыБенчмарков; РезультатЗапуска.Конфигурация = _Конфигурация; - // Событие ПередВсеми - КонтекстСобытия = Новый Структура(); - КонтекстСобытия.Вставить("Конфигурация", _Конфигурация); - КонтекстСобытия.Вставить("ДескрипторыБенчмарков", _ДескрипторыБенчмарков); + _МенеджерПроцессов = Новый МенеджерПроцессовБенчмарков( + _ДескрипторыБенчмарков, + _Конфигурация, + _Репортер, + _ПортОтладки + ); - ВызватьОбработчикСобытия(СобытияБенчмарков.ПередВсеми, КонтекстСобытия); + ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); + Кейсы = ГенераторКейсов.СгенерироватьВсеКейсы(); + + ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска); - // Запуск бенчмарков - ЗапуститьКейсыБенчмарков(ИдентификаторыКейсов, РезультатЗапуска); + Если _Конфигурация.ИсполняющиеСреды().Количество() > 1 Тогда + РезультатЗапуска.СредаОкружения.ВерсияИсполняющейСреды = ""; + КонецЕсли; + + ВосстановитьКейсыЗапусков(РезультатЗапуска, Кейсы); - // Подготовка результатов - РезультатЗапуска.Чекпоинт = _НовыйЧекпоинт; РезультатЗапуска.УстановитьСвязиСЭталонами(); РезультатЗапуска.ПересчитатьСтатистику(); РезультатЗапуска.СформироватьОтчет(); - - // Событие ПослеВсех - КонтекстСобытия = Новый Структура(); - КонтекстСобытия.Вставить("Конфигурация", РезультатЗапуска.Конфигурация); - КонтекстСобытия.Вставить("ДескрипторыБенчмарков", РезультатЗапуска.ДескрипторыБенчмарков); - КонтекстСобытия.Вставить("Запуски", РезультатЗапуска.Запуски); - КонтекстСобытия.Вставить("Отчет", РезультатЗапуска.Отчет); - КонтекстСобытия.Вставить("СредаОкружения", РезультатЗапуска.СредаОкружения); - - ВызватьОбработчикСобытия(СобытияБенчмарков.ПослеВсех, КонтекстСобытия); Возврат РезультатЗапуска; КонецФункции -Процедура ЗапуститьКейсыБенчмарков(ИдентификаторыКейсов, РезультатЗапуска) - - ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); - - Если ИдентификаторыКейсов <> Неопределено Тогда - Кейсы = ГенераторКейсов.СгенерироватьПоИдентификаторам(ИдентификаторыКейсов); - Иначе - Кейсы = ГенераторКейсов.СгенерироватьВсеКейсы(); - КонецЕсли; +Процедура ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска) + + ВерсииСред = Новый Соответствие(); Для Каждого Кейс Из Кейсы Цикл - ПроверитьИСоздатьЧекпоинт(Кейс); + ИсполняющаяСреда = Кейс.ИсполняющаяСреда(); - Если _НовыйЧекпоинт <> Неопределено Тогда - Возврат; + Если ВерсииСред[ИсполняющаяСреда] = Неопределено Тогда + ВерсииСред[ИсполняющаяСреда] = Новый Массив(); КонецЕсли; - РезультатЗапускаКейса = ЗапуститьКейс(Кейс); - РезультатЗапуска.Запуски.Добавить(РезультатЗапускаКейса); + ВерсииСред[ИсполняющаяСреда].Добавить(Кейс); КонецЦикла; -КонецПроцедуры + Для Каждого Строка Из ВерсииСред Цикл + + ИсполняющаяСреда = Строка.Ключ; + КейсыСреды = Строка.Значение; -Функция ЗапуститьКейс(Кейс) + Если ИзолироватьИтерации() Тогда - ДескрипторБенчмарка = Кейс.ДескрипторБенчмарка(); - Параметры = Кейс.Параметры(); - - Если ЭтоПервыйЗапуск() Тогда - _Репортер.ВывестиЗаголовокБенчмарка(ДескрипторБенчмарка); - _Репортер.ВывестиПараметры(Параметры); - КонецЕсли; + ЗапуститьКейсыВИзолированныхИтерациях(КейсыСреды, РезультатЗапуска); - ПараметрыМетода = ПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры); - УстановитьПараметрыОбъекта(Параметры); + Иначе - РезультатЗапускаКейса = Новый РезультатЗапускаКейса(); - РезультатЗапускаКейса.Кейс = Кейс; - РезультатЗапускаКейса.Статистика = Новый СтатистикаБенчмарка(); - - // Событие ПередКаждым - КонтекстСобытия = Новый Структура(); - КонтекстСобытия.Вставить("Кейс", Кейс); + ЗапуститьКейсыИсполняющейСреде(КейсыСреды, ИсполняющаяСреда, РезультатЗапуска); - ВызватьОбработчикСобытия(СобытияБенчмарков.ПередКаждым, КонтекстСобытия); + КонецЕсли; - // Запуск итераций - Делегат = ДескрипторБенчмарка.Делегат(_ОбъектБенчмарков, ПараметрыМетода); + КонецЦикла; - Если _Конфигурация.Стратегия() = СтратегииЗапускаБенчмарка.ХолодныйЗапуск Тогда - КоличествоВызововЗаИтерацию = 1; - Иначе - КоличествоВызововЗаИтерацию = РассчитатьКоличествоВызововЗаИтерацию(Делегат); - КонецЕсли; +КонецПроцедуры - ЗапуститьЭтапПрогрева(Делегат, КоличествоВызововЗаИтерацию); - ЗапуститьЭтапИзмерения(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса); - ЗапуститьМониторингПамяти(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса); +Процедура ЗапуститьКейсыИсполняющейСреде(КейсыСреды, ИсполняющаяСреда, РезультатЗапуска) - // Сбор статистики - РезультатЗапускаКейса.Статистика.Прочитать(РезультатЗапускаКейса.Замеры); + ВывестиЗаголовокСреды(ИсполняющаяСреда); - Если Не ИзолироватьИтерации() Тогда - _Репортер.ВывестиСтатистику(РезультатЗапускаКейса.Статистика); - КонецЕсли; + ТекущийРезультат = _МенеджерПроцессов.ЗапуститьПроцесс(КейсыСреды, ИсполняющаяСреда); - // Событие ПослеКаждого - КонтекстСобытия = Новый Структура(); - КонтекстСобытия.Вставить("Кейс", Кейс); - КонтекстСобытия.Вставить("Замеры", РезультатЗапускаКейса.Замеры); - КонтекстСобытия.Вставить("Статистика", РезультатЗапускаКейса.Статистика); + Если ТекущийРезультат = Неопределено Тогда + Возврат; + КонецЕсли; - ВызватьОбработчикСобытия(СобытияБенчмарков.ПослеКаждого, КонтекстСобытия); + РезультатЗапуска.СредаОкружения = ТекущийРезультат.СредаОкружения; - Возврат РезультатЗапускаКейса; - -КонецФункции + ДобавитьВсеЗапускиВРезультат(РезультатЗапуска, ТекущийРезультат); -Функция РассчитатьКоличествоВызововЗаИтерацию(Делегат) +КонецПроцедуры - КоличествоВызововЗаИтерацию = _Конфигурация.КоличествоВызововЗаИтерацию(); - Если Не КоличествоВызововЗаИтерацию = 0 Тогда - Возврат КоличествоВызововЗаИтерацию; - КонецЕсли; +Процедура ЗапуститьКейсыВИзолированныхИтерациях(Кейсы, РезультатЗапуска) - МинимальноеКоличествоВызовов = _Конфигурация.МинимальноеКоличествоВызововЗаИтерацию(); - ЦелевоеВремяИтерации = ЕдиницыИзмеренийБенчмарков.Конвертировать( - _Конфигурация.МинимальноеВремяИтерации(), - ЕдиницыИзмеренийБенчмарков.Миллисекунда, - ЕдиницыИзмеренийБенчмарков.Наносекунда - ); + Чекпоинт = Неопределено; - КоличествоВызовов = МинимальноеКоличествоВызовов; - НомерИтерации = 0; - ВремяПредыдущейОперации = 0; - ДопустимаяПогрешность = 0.05; - МаксимальноеКоличествоПроверокНаПогрешность = 5; - - Пока Истина Цикл - - НомерИтерации = НомерИтерации + 1; - РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Оценка, НомерИтерации, КоличествоВызовов); - - ВремяИтерации = РезультатИтерации.Наносекунд; - ВремяОперации = РезультатИтерации.НаносекундЗаОперацию; - - Погрешность = (ВремяПредыдущейОперации - ВремяОперации) / (ВремяОперации + ВремяПредыдущейОперации); - Погрешность = ?(Погрешность < 0, -Погрешность, Погрешность); - - Если ВремяИтерации < ЦелевоеВремяИтерации Тогда - КоличествоВызовов = КоличествоВызовов * 2; - ВремяПредыдущейОперации = ВремяОперации; - Продолжить; - КонецЕсли; - - Если Погрешность > ДопустимаяПогрешность И НомерИтерации < МаксимальноеКоличествоПроверокНаПогрешность Тогда - ВремяПредыдущейОперации = ВремяОперации; - Продолжить; - КонецЕсли; + Для Каждого Кейс Из Кейсы Цикл - Прервать; + Пока Истина Цикл - КонецЦикла; + ТекущийРезультат = _МенеджерПроцессов.ЗапуститьПроцесс(Кейс, Кейс.ИсполняющаяСреда(), Чекпоинт); - Возврат КоличествоВызовов; + Если ТекущийРезультат = Неопределено Тогда + Прервать; + КонецЕсли; -КонецФункции + Чекпоинт = ТекущийРезультат.Чекпоинт; + РезультатЗапуска.СредаОкружения = ТекущийРезультат.СредаОкружения; -Процедура ЗапуститьЭтапПрогрева(Делегат, КоличествоВызововЗаИтерацию) - - Если _Конфигурация.Стратегия() <> СтратегииЗапускаБенчмарка.ПропускнаяСпособность Тогда - Возврат; - КонецЕсли; + ОбработатьИзолированныйЗапуск(РезультатЗапуска, ТекущийРезультат, Чекпоинт); - КоличествоПрогревочныхИтераций = _Конфигурация.КоличествоПрогревочныхИтераций(); + // Закончились кейсы для запуска + Если Чекпоинт = Неопределено Тогда + Прервать; + КонецЕсли; - Если КоличествоПрогревочныхИтераций = 0 Тогда - Возврат; - КонецЕсли; - - Для НомерИтерации = 1 По КоличествоПрогревочныхИтераций Цикл - - ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Прогрев, НомерИтерации, КоличествоВызововЗаИтерацию); + КонецЦикла; КонецЦикла; - + КонецПроцедуры -Процедура ЗапуститьЭтапИзмерения(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса) +Процедура ОбработатьИзолированныйЗапуск(РезультатЗапуска, ТекущийРезультат, Чекпоинт) - Для НомерИтерации = 1 По _Конфигурация.КоличествоИтераций() Цикл + ПредыдущийЗапуск = ПолучитьПоследнийЗапуск(РезультатЗапуска); + СледующийЧекпоинт = ТекущийРезультат.Чекпоинт; - ПроверитьИСоздатьЧекпоинт(РезультатЗапускаКейса.Кейс, ЭтапыБенчмарка.Измерение, НомерИтерации); - - Если ТребуетсяПропуститьИтерацию(ЭтапыБенчмарка.Измерение, НомерИтерации) Тогда - Продолжить; + Для Каждого ТекущийЗапуск Из ТекущийРезультат.Запуски Цикл + + Если МожноОбъединитьСПредыдущимЗапуском(ПредыдущийЗапуск, ТекущийЗапуск) Тогда + ОбъединитьЗамерыЗапусков(ПредыдущийЗапуск, ТекущийЗапуск); + Иначе + РезультатЗапуска.Запуски.Добавить(ТекущийЗапуск); КонецЕсли; - РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Измерение, НомерИтерации, КоличествоВызововЗаИтерацию); - РезультатЗапускаКейса.Замеры.Добавить(РезультатИтерации); + ПредыдущийЗапуск = Неопределено; КонецЦикла; -КонецПроцедуры - -Процедура ЗапуститьМониторингПамяти(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса) - - Если Не _Конфигурация.ТребуетсяМониторингПамяти() Тогда - Возврат; + Если ТребуетсяВыводСтатистики(Чекпоинт, СледующийЧекпоинт) Тогда + _Репортер.ВывестиСтатистику(ТекущийЗапуск.Статистика); КонецЕсли; - Для НомерИтерации = 1 По _Конфигурация.КоличествоИтераций() Цикл - - ПроверитьИСоздатьЧекпоинт(РезультатЗапускаКейса.Кейс, ЭтапыБенчмарка.Память, НомерИтерации); - - Если ТребуетсяПропуститьИтерацию(ЭтапыБенчмарка.Память, НомерИтерации) Тогда - Продолжить; - КонецЕсли; - - РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Память, НомерИтерации, КоличествоВызововЗаИтерацию); - РезультатЗапускаКейса.Замеры.Добавить(РезультатИтерации); - - КонецЦикла; - КонецПроцедуры -Функция ВыполнитьИтерацию(Делегат, Этап, НомерИтерации, КоличествоВызовов) - - Наносекунд = 0; - ВыделяемаяПамять = 0; +Функция ПолучитьПоследнийЗапуск(РезультатЗапуска) + + КоличествоЗапусков = РезультатЗапуска.Запуски.Количество(); - Если Этап = ЭтапыБенчмарка.Память Тогда - ВыделяемаяПамять = ЗамеритьПамять(Делегат, КоличествоВызовов); + Если КоличествоЗапусков > 0 Тогда + Возврат РезультатЗапуска.Запуски[КоличествоЗапусков - 1]; Иначе - Наносекунд = ЗамеритьВремя(Делегат, КоличествоВызовов); + Возврат Неопределено; КонецЕсли; - - РезультатИтерации = Новый РезультатИтерацииКейса(); - РезультатИтерации.Этап = Этап; - РезультатИтерации.НомерИтерации = НомерИтерации; - РезультатИтерации.КоличествоОпераций = КоличествоВызовов; - РезультатИтерации.Наносекунд = Наносекунд; - РезультатИтерации.НаносекундЗаОперацию = Наносекунд / КоличествоВызовов; - РезультатИтерации.ВыделяемаяПамять = ВыделяемаяПамять; - РезультатИтерации.ВыделяемаяПамятьЗаОперацию = ВыделяемаяПамять / КоличествоВызовов; - - Если НомерИтерации = 1 Тогда - _Репортер.ВывестиСтроку(" "); - КонецЕсли; - - _Репортер.ВывестиСтроку(Строка(РезультатИтерации), "Серый"); - - _БылоВыполнениеИтерации = Истина; - - Возврат РезультатИтерации; - -КонецФункции - -Функция ЗамеритьВремя(Делегат, КоличествоВызовов) - - Рефлектор = Новый Рефлектор(); - Объект = Делегат.Объект(); - ИмяМетода = Делегат.ИмяМетода(); - Параметры = Делегат.Параметры(); - ОсталосьВызовов = КоличествоВызовов; - - _Лог.Отладка("Начало замера времени <%1>", ИмяМетода); - - _Хронометр.Старт(); // Хронометр должен быть "прогрет" - - Пока ОсталосьВызовов > 0 Цикл - Рефлектор.ВызватьМетод(Объект, ИмяМетода, Параметры); - ОсталосьВызовов = ОсталосьВызовов - 1; - КонецЦикла; - - _Хронометр.Стоп(); - - _Лог.Отладка("Окончание замера времени <%1>", ИмяМетода); - - Возврат _Хронометр.Наносекунд; - + КонецФункции -Функция ЗамеритьПамять(Делегат, КоличествоВызовов) - - Рефлектор = Новый Рефлектор(); - Объект = Делегат.Объект(); - ИмяМетода = Делегат.ИмяМетода(); - Параметры = Делегат.Параметры(); - ОсталосьВызовов = КоличествоВызовов; +Функция МожноОбъединитьСПредыдущимЗапуском(ПредыдущийЗапуск, ТекущийЗапуск) - _Лог.Отладка("Начало замера памяти <%1>", ИмяМетода); - - _МониторПамяти.Начать(); // Объект должен быть "прогрет" - - Пока ОсталосьВызовов > 0 Цикл - Рефлектор.ВызватьМетод(Объект, ИмяМетода, Параметры); - ОсталосьВызовов = ОсталосьВызовов - 1; - КонецЦикла; - - ВыделеноБайт = _МониторПамяти.Завершить(); - - _Лог.Отладка("Завершение замера памяти <%1>", ИмяМетода); + Если ПредыдущийЗапуск = Неопределено Тогда + Возврат Ложь; + КонецЕсли; - Возврат ВыделеноБайт; + Возврат ПредыдущийЗапуск.Кейс.Идентификатор() = ТекущийЗапуск.Кейс.Идентификатор(); КонецФункции -Процедура ВызватьОбработчикСобытия(ИмяСобытия, Контекст = Неопределено) Экспорт +Процедура ДобавитьВсеЗапускиВРезультат(РезультатЗапуска, ТекущийРезультат) - Обработчики = _Конфигурация.ОбработчикиСобытия(ИмяСобытия); - - Для Каждого Обработчик Из Обработчики Цикл - - _Лог.Отладка("Вызов обработчика события <%1>", Обработчик.ИмяМетода()); - - Попытка - Делегат = Обработчик.Делегат(_ОбъектБенчмарков); - Делегат.Выполнить(Контекст); - Исключение - ВызватьИсключение СтрШаблон( - "Ошибка в обработчике события <%1>: %2", - Обработчик.ИмяМетода(), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) - ); - КонецПопытки; - + Для Каждого Запуск Из ТекущийРезультат.Запуски Цикл + РезультатЗапуска.Запуски.Добавить(Запуск); КонецЦикла; КонецПроцедуры -Функция ПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) - - ИменаПараметров = ДескрипторБенчмарка.ИменаПараметров(); - - Если ИменаПараметров.Количество() = 0 Тогда - Возврат Новый Массив(); - КонецЕсли; - - ПараметрыМетода = Новый Массив(ИменаПараметров.Количество()); +Процедура ОбъединитьЗамерыЗапусков(ЦелевойЗапуск, ЗапускИсточник) - Для Каждого Параметр Из Параметры Цикл - Если Параметр.ЭтоПараметрМетода() Тогда - ПараметрыМетода[ИменаПараметров.Найти(Параметр.Имя())] = Параметр.Значение(); - КонецЕсли; + Для Каждого Замер Из ЗапускИсточник.Замеры Цикл + ЦелевойЗапуск.Замеры.Добавить(Замер); КонецЦикла; - - Возврат ПараметрыМетода; - -КонецФункции - -// Устанавливает значения публичным полям объекта -// -// Параметры: -// Параметры - Массив из ПараметрБенчмарка -Процедура УстановитьПараметрыОбъекта(Параметры) - - ШаблонОшибки = "Не удалось задать значение поля <%1> для объекта <%2>"; - - Для Каждого Параметр Из Параметры Цикл - Если Не Параметр.ЭтоПараметрМетода() Тогда - Попытка - _ОбъектБенчмарков[Параметр.Имя()] = Параметр.Значение(); - Исключение - ВызватьИсключение СтрШаблон(ШаблонОшибки, Параметр.Имя(), ТипЗнч(_ОбъектБенчмарков)); - КонецПопытки; - КонецЕсли; - КонецЦикла; - + КонецПроцедуры -Процедура ПрогретьИнструментыЗамера() - - ТребуетсяМониторингПамяти = _Конфигурация.ТребуетсяМониторингПамяти(); - КоличествоИтераций = 5; - - Для НомерИтерации = 1 По КоличествоИтераций Цикл +Процедура ВосстановитьКейсыЗапусков(РезультатЗапускаБенчмарка, Кейсы) - _Хронометр.Старт(); - _Хронометр.Стоп(); - - Если ТребуетсяМониторингПамяти Тогда - _МониторПамяти.Начать(); - _МониторПамяти.Завершить(); - КонецЕсли; + КартаКейсов = Новый Соответствие(); + Для Каждого Кейс Из Кейсы Цикл + КартаКейсов.Вставить(Кейс.Идентификатор(), Кейс); КонецЦикла; - -КонецПроцедуры -Функция ЭтоПервыйЗапуск() - Возврат _Чекпоинт = Неопределено - Или _Чекпоинт.Этап = ЭтапыБенчмарка.Измерение И _Чекпоинт.НомерИтерации = 1; -КонецФункции - -Процедура ПроверитьИСоздатьЧекпоинт(Кейс, Этап = "", НомерИтерации = 1) + Для Каждого РезультатЗапускаКейса Из РезультатЗапускаБенчмарка.Запуски Цикл + РезультатЗапускаКейса.Кейс = КартаКейсов[РезультатЗапускаКейса.Кейс.Идентификатор()]; + КонецЦикла; - Если _НовыйЧекпоинт <> Неопределено Тогда - Возврат; - КонецЕсли; +КонецПроцедуры - Если Не ТребуетсяЗапускНовогоПроцесса(Этап) Тогда - Возврат; - КонецЕсли; +Процедура ВывестиЗаголовокСреды(ИсполняющаяСреда) - _НовыйЧекпоинт = Новый ЧекпоинтЗапускаБенчмарков(); - _НовыйЧекпоинт.ИмяМетода = Кейс.ДескрипторБенчмарка().Метод(); - _НовыйЧекпоинт.ИдентификаторКейса = Кейс.Идентификатор(); - - Если ЗначениеЗаполнено(Этап) Тогда - - _НовыйЧекпоинт.Этап = Этап; - _НовыйЧекпоинт.НомерИтерации = НомерИтерации; - + Если ИсполняющаяСреда <> Неопределено И ЗначениеЗаполнено(ИсполняющаяСреда.Версия) Тогда + Версия = ИсполняющаяСреда.Версия; Иначе - - _НовыйЧекпоинт.Этап = ЭтапыБенчмарка.Измерение; - _НовыйЧекпоинт.НомерИтерации = 1; - + Версия = Новый СистемнаяИнформация().Версия; КонецЕсли; - - _Лог.Отладка("Создан чекпоинт <%1>", Строка(_НовыйЧекпоинт)); - + + _Репортер.ВывестиЗаголовок(Версия); + _Репортер.ВывестиКонфигурацию(_Конфигурация); + КонецПроцедуры -Функция ТребуетсяЗапускНовогоПроцесса(Этап = "") - - Если Этап <> "" - И Не (Этап = ЭтапыБенчмарка.Измерение Или Этап = ЭтапыБенчмарка.Память) Тогда - Возврат Ложь; - КонецЕсли; - - Если ИзолироватьИтерации() Тогда - Возврат _БылоВыполнениеИтерации; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -Функция ТребуетсяПропуститьИтерацию(Этап, НомерИтерации) - - Если _НовыйЧекпоинт <> Неопределено Тогда +Функция ТребуетсяВыводСтатистики(ЧекпоинтПредыдущий, ЧекпоинтСледующий) + + Если ЧекпоинтПредыдущий = Неопределено И ЧекпоинтСледующий = Неопределено Тогда Возврат Истина; КонецЕсли; - Если _Чекпоинт = Неопределено Тогда - Возврат Ложь; + Если ЧекпоинтПредыдущий = Неопределено И ЧекпоинтСледующий <> Неопределено Тогда + Возврат ЭтоПервыйЗапуск(ЧекпоинтСледующий); КонецЕсли; - Если _Чекпоинт.Этап <> Этап - Или _Чекпоинт.НомерИтерации > НомерИтерации Тогда - Возврат Истина; - КонецЕсли; + Возврат ЧекпоинтПредыдущий.ИдентификаторКейса <> ЧекпоинтСледующий.ИдентификаторКейса; - Возврат Ложь; +КонецФункции +Функция ЭтоПервыйЗапуск(Чекпоинт) + Возврат Чекпоинт = Неопределено + Или Чекпоинт.Этап = ЭтапыБенчмарка.Измерение И Чекпоинт.НомерИтерации = 1; КонецФункции Функция ИзолироватьИтерации() diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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" deleted file mode 100644 index 583016f..0000000 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\320\271\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" +++ /dev/null @@ -1,300 +0,0 @@ -#Использовать fs -#Использовать tempfiles -#Использовать logos -#Использовать fluent - -Перем _Конфигурация; // КонфигурацияБенчмарков -Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков -Перем _Репортер; // КонсольныйРепортерБенчмарков, НулевойРепортерБенчмарков -Перем _МенеджерПроцессов; // МенеджерПроцессовБенчмарков, Неопределено -Перем _ПортОтладки; // Число - -#Область ОбработчикиСобытий - -// Запускает бенчмарки -// -// Параметры: -// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки -// - ДескрипторБенчмарка - Отдельный дескриптор -// - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов -// - Произвольный - Экземпляр класса с бенчмарками -// Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков -Процедура ПриСозданииОбъекта(ИсточникБенчмарков, Конфигурация = Неопределено) - - АдаптерИсточникаБенчмарков = Новый АдаптерИсточникаБенчмарков(ИсточникБенчмарков); - - _ДескрипторыБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьКоллекциюДескрипторов(); - _Репортер = Новый КонсольныйРепортерБенчмарков(); - _ПортОтладки = 0; - - Если Не Конфигурация = Неопределено Тогда - _Конфигурация = Конфигурация; - Иначе - _Конфигурация = АдаптерИсточникаБенчмарков.СоздатьКонфигурацию(); - КонецЕсли; - -КонецПроцедуры - -#КонецОбласти - -#Область ПрограммныйИнтерфейс - -// Запускает изолированно бенчмарки -// -// Возвращаемое значение: -// РезультатЗапускаБенчмарков -Функция Запустить() Экспорт - - Валидатор = Новый ВалидаторЗапускаБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); - Если Не Валидатор.ЗапускВозможен() Тогда - ВызватьИсключение Валидатор.ПолучитьТекстОшибок(); - КонецЕсли; - - РезультатЗапуска = ЗапуститьБенчмарки(); - - _Репортер.ВывестиРезультатЗапуска(РезультатЗапуска); - - Экспортер = Новый ЭкспортерРезультатовБенчмарков(_Репортер); - Экспортер.Записать(РезультатЗапуска); - - Возврат РезультатЗапуска; - -КонецФункции - -// Устанавливает порт для отладки -// -// Параметры: -// Порт - Число - Номер порта для отладки -Процедура УстановитьПортОтладки(Порт) Экспорт - _ПортОтладки = Порт; -КонецПроцедуры - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -Функция ЗапуститьБенчмарки() - - РезультатЗапуска = Новый РезультатЗапускаБенчмарков(); - РезультатЗапуска.ДескрипторыБенчмарков = _ДескрипторыБенчмарков; - РезультатЗапуска.Конфигурация = _Конфигурация; - - _МенеджерПроцессов = Новый МенеджерПроцессовБенчмарков( - _ДескрипторыБенчмарков, - _Конфигурация, - _Репортер, - _ПортОтладки - ); - - ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); - Кейсы = ГенераторКейсов.СгенерироватьВсеКейсы(); - - ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска); - - Если _Конфигурация.ИсполняющиеСреды().Количество() > 1 Тогда - РезультатЗапуска.СредаОкружения.ВерсияИсполняющейСреды = ""; - КонецЕсли; - - ВосстановитьКейсыЗапусков(РезультатЗапуска, Кейсы); - - РезультатЗапуска.УстановитьСвязиСЭталонами(); - РезультатЗапуска.ПересчитатьСтатистику(); - РезультатЗапуска.СформироватьОтчет(); - - Возврат РезультатЗапуска; - -КонецФункции - -Процедура ЗапуститьКейсыБенчмарков(Кейсы, РезультатЗапуска) - - ВерсииСред = Новый Соответствие(); - - Для Каждого Кейс Из Кейсы Цикл - - ИсполняющаяСреда = Кейс.ИсполняющаяСреда(); - - Если ВерсииСред[ИсполняющаяСреда] = Неопределено Тогда - ВерсииСред[ИсполняющаяСреда] = Новый Массив(); - КонецЕсли; - - ВерсииСред[ИсполняющаяСреда].Добавить(Кейс); - - КонецЦикла; - - Для Каждого Строка Из ВерсииСред Цикл - - ИсполняющаяСреда = Строка.Ключ; - КейсыСреды = Строка.Значение; - - Если ИзолироватьИтерации() Тогда - - ЗапуститьКейсыВИзолированныхИтерациях(КейсыСреды, РезультатЗапуска); - - Иначе - - ЗапуститьКейсыИсполняющейСреде(КейсыСреды, ИсполняющаяСреда, РезультатЗапуска); - - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗапуститьКейсыИсполняющейСреде(КейсыСреды, ИсполняющаяСреда, РезультатЗапуска) - - ВывестиЗаголовокСреды(ИсполняющаяСреда); - - ТекущийРезультат = _МенеджерПроцессов.ЗапуститьПроцесс(КейсыСреды, ИсполняющаяСреда); - - Если ТекущийРезультат = Неопределено Тогда - Возврат; - КонецЕсли; - - РезультатЗапуска.СредаОкружения = ТекущийРезультат.СредаОкружения; - - ДобавитьВсеЗапускиВРезультат(РезультатЗапуска, ТекущийРезультат); - -КонецПроцедуры - -Процедура ЗапуститьКейсыВИзолированныхИтерациях(Кейсы, РезультатЗапуска) - - Чекпоинт = Неопределено; - - Для Каждого Кейс Из Кейсы Цикл - - Пока Истина Цикл - - ТекущийРезультат = _МенеджерПроцессов.ЗапуститьПроцесс(Кейс, Кейс.ИсполняющаяСреда(), Чекпоинт); - - Если ТекущийРезультат = Неопределено Тогда - Прервать; - КонецЕсли; - - Чекпоинт = ТекущийРезультат.Чекпоинт; - РезультатЗапуска.СредаОкружения = ТекущийРезультат.СредаОкружения; - - ОбработатьИзолированныйЗапуск(РезультатЗапуска, ТекущийРезультат, Чекпоинт); - - // Закончились кейсы для запуска - Если Чекпоинт = Неопределено Тогда - Прервать; - КонецЕсли; - - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -Процедура ОбработатьИзолированныйЗапуск(РезультатЗапуска, ТекущийРезультат, Чекпоинт) - - ПредыдущийЗапуск = ПолучитьПоследнийЗапуск(РезультатЗапуска); - СледующийЧекпоинт = ТекущийРезультат.Чекпоинт; - - Для Каждого ТекущийЗапуск Из ТекущийРезультат.Запуски Цикл - - Если МожноОбъединитьСПредыдущимЗапуском(ПредыдущийЗапуск, ТекущийЗапуск) Тогда - ОбъединитьЗамерыЗапусков(ПредыдущийЗапуск, ТекущийЗапуск); - Иначе - РезультатЗапуска.Запуски.Добавить(ТекущийЗапуск); - КонецЕсли; - - ПредыдущийЗапуск = Неопределено; - - КонецЦикла; - - Если ТребуетсяВыводСтатистики(Чекпоинт, СледующийЧекпоинт) Тогда - _Репортер.ВывестиСтатистику(ТекущийЗапуск.Статистика); - КонецЕсли; - -КонецПроцедуры - -Функция ПолучитьПоследнийЗапуск(РезультатЗапуска) - - КоличествоЗапусков = РезультатЗапуска.Запуски.Количество(); - - Если КоличествоЗапусков > 0 Тогда - Возврат РезультатЗапуска.Запуски[КоличествоЗапусков - 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\230\321\201\320\277\320\276\320\273\320\275\320\270\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\230\321\201\320\277\320\276\320\273\320\275\320\270\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" new file mode 100644 index 0000000..59ea31f --- /dev/null +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\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" @@ -0,0 +1,584 @@ +#Использовать fs +#Использовать allocs +#Использовать logos + +Перем _ОбъектБенчмарков; // Произвольный, Неопределено - Экземпляр класса с бенчмарками +Перем _Конфигурация; // КонфигурацияБенчмарков +Перем _ДескрипторыБенчмарков; // КоллекцияДескрипторовБенчмарков +Перем _МониторПамяти; // МониторПамяти, Неопределено +Перем _Хронометр; // Хронометр +Перем _Репортер; // КонсольныйРепортерБенчмарков, НулевойРепортерБенчмарков +Перем _ЭтоДочернийПроцесс; // Булево +Перем _Чекпоинт; // ЧекпоинтЗапускаБенчмарков, Неопределено +Перем _НовыйЧекпоинт; // ЧекпоинтЗапускаБенчмарков, Неопределено +Перем _БылоВыполнениеИтерации; // Булево +Перем _Лог; // Лог + +// Создает исполнитель бенчмарков для запуска в текущем процессе +// +// Параметры: +// ИсточникБенчмарков - Тип - Класс, содержащий бенчмарки +// - ДескрипторБенчмарка - Отдельный дескриптор +// - КоллекцияДескрипторовБенчмарков - Коллекция дескрипторов +// - Произвольный - Экземпляр класса с бенчмарками +// Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков +Процедура ПриСозданииОбъекта(ИсточникБенчмарков, Конфигурация = Неопределено) + + АдаптерИсточникаБенчмарков = Новый АдаптерИсточникаБенчмарков(ИсточникБенчмарков); + + _ОбъектБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьОбъектБенчмарков(); + _ДескрипторыБенчмарков = АдаптерИсточникаБенчмарков.ПолучитьКоллекциюДескрипторов(); + _Хронометр = Новый Хронометр(); + _Репортер = Новый КонсольныйРепортерБенчмарков(); + _ЭтоДочернийПроцесс = Бенчмаркинг.ЭтоДочернийПроцесс(); + _БылоВыполнениеИтерации = Ложь; + _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.ИсполнительБенчмарков"); + + Если Не Конфигурация = Неопределено Тогда + _Конфигурация = Конфигурация; + Иначе + _Конфигурация = АдаптерИсточникаБенчмарков.СоздатьКонфигурацию(); + КонецЕсли; + + Если _Конфигурация.ТребуетсяМониторингПамяти() Тогда + _МониторПамяти = Новый МониторПамяти(); + КонецЕсли; + +КонецПроцедуры + +#Область ПрограммныйИнтерфейс + +// Устанавливает чекпоинт +// +// Параметры: +// Чекпоинт - ЧекпоинтЗапускаБенчмарков - Точка восстановления для продолжения выполнения +Процедура УстановитьЧекпоинт(Чекпоинт) Экспорт + _Чекпоинт = Чекпоинт; +КонецПроцедуры + +// Запускает бенчмарки в текущем процессе +// +// Параметры: +// ИдентификаторыКейсов - Массив из Число - Идентификаторы кейсов +// +// Возвращаемое значение: +// РезультатЗапускаБенчмарков +Функция Запустить(ИдентификаторыКейсов = Неопределено) Экспорт + + Валидатор = Новый ВалидаторЗапускаБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); + Если Не Валидатор.ЗапускВозможен() Тогда + ВызватьИсключение Валидатор.ПолучитьТекстОшибок(); + КонецЕсли; + + РезультатЗапуска = ПодготовитьИЗапуститьБенчмарки(ИдентификаторыКейсов); + + Если Не _ЭтоДочернийПроцесс Тогда + РепортерРезультатов = _Репортер; + Иначе + РепортерРезультатов = Новый НулевойРепортерБенчмарков(); + КонецЕсли; + + РепортерРезультатов.ВывестиРезультатЗапуска(РезультатЗапуска); + + Экспортер = Новый ЭкспортерРезультатовБенчмарков(РепортерРезультатов); + Экспортер.Записать(РезультатЗапуска); + + Возврат РезультатЗапуска; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПодготовитьИЗапуститьБенчмарки(ИдентификаторыКейсов) + + _БылоВыполнениеИтерации = Ложь; + _НовыйЧекпоинт = Неопределено; + + ПрогретьИнструментыЗамера(); + + Если Не _ЭтоДочернийПроцесс Тогда + _Репортер.ВывестиЗаголовок(); + _Репортер.ВывестиКонфигурацию(_Конфигурация); + КонецЕсли; + + // Инициализация результатов + РезультатЗапуска = Новый РезультатЗапускаБенчмарков(); + РезультатЗапуска.ДескрипторыБенчмарков = _ДескрипторыБенчмарков; + РезультатЗапуска.Конфигурация = _Конфигурация; + + // Событие ПередВсеми + КонтекстСобытия = Новый Структура(); + КонтекстСобытия.Вставить("Конфигурация", _Конфигурация); + КонтекстСобытия.Вставить("ДескрипторыБенчмарков", _ДескрипторыБенчмарков); + + ВызватьОбработчикСобытия(СобытияБенчмарков.ПередВсеми, КонтекстСобытия); + + // Запуск бенчмарков + ЗапуститьКейсыБенчмарков(ИдентификаторыКейсов, РезультатЗапуска); + + // Подготовка результатов + РезультатЗапуска.Чекпоинт = _НовыйЧекпоинт; + РезультатЗапуска.УстановитьСвязиСЭталонами(); + РезультатЗапуска.ПересчитатьСтатистику(); + РезультатЗапуска.СформироватьОтчет(); + + // Событие ПослеВсех + КонтекстСобытия = Новый Структура(); + КонтекстСобытия.Вставить("Конфигурация", РезультатЗапуска.Конфигурация); + КонтекстСобытия.Вставить("ДескрипторыБенчмарков", РезультатЗапуска.ДескрипторыБенчмарков); + КонтекстСобытия.Вставить("Запуски", РезультатЗапуска.Запуски); + КонтекстСобытия.Вставить("Отчет", РезультатЗапуска.Отчет); + КонтекстСобытия.Вставить("СредаОкружения", РезультатЗапуска.СредаОкружения); + + ВызватьОбработчикСобытия(СобытияБенчмарков.ПослеВсех, КонтекстСобытия); + + Возврат РезультатЗапуска; + +КонецФункции + +Процедура ЗапуститьКейсыБенчмарков(ИдентификаторыКейсов, РезультатЗапуска) + + ГенераторКейсов = Новый ГенераторКейсовБенчмарков(_ДескрипторыБенчмарков, _Конфигурация); + + Если ИдентификаторыКейсов <> Неопределено Тогда + Кейсы = ГенераторКейсов.СгенерироватьПоИдентификаторам(ИдентификаторыКейсов); + Иначе + Кейсы = ГенераторКейсов.СгенерироватьВсеКейсы(); + КонецЕсли; + + Для Каждого Кейс Из Кейсы Цикл + + Если ТребуетсяПропуститьКейс(Кейс) Тогда + Продолжить; + КонецЕсли; + + ПроверитьИСоздатьЧекпоинт(Кейс); + + Если _НовыйЧекпоинт <> Неопределено Тогда + Возврат; + КонецЕсли; + + РезультатЗапускаКейса = ЗапуститьКейс(Кейс); + РезультатЗапуска.Запуски.Добавить(РезультатЗапускаКейса); + + КонецЦикла; + +КонецПроцедуры + +Функция ЗапуститьКейс(Кейс) + + ДескрипторБенчмарка = Кейс.ДескрипторБенчмарка(); + Параметры = Кейс.Параметры(); + + Если ЭтоПервыйЗапуск() Тогда + _Репортер.ВывестиЗаголовокБенчмарка(ДескрипторБенчмарка); + _Репортер.ВывестиПараметры(Параметры); + КонецЕсли; + + ПараметрыМетода = ПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры); + УстановитьПараметрыОбъекта(Параметры); + + РезультатЗапускаКейса = Новый РезультатЗапускаКейса(); + РезультатЗапускаКейса.Кейс = Кейс; + РезультатЗапускаКейса.Статистика = Новый СтатистикаБенчмарка(); + + // Событие ПередКаждым + КонтекстСобытия = Новый Структура(); + КонтекстСобытия.Вставить("Кейс", Кейс); + + ВызватьОбработчикСобытия(СобытияБенчмарков.ПередКаждым, КонтекстСобытия); + + // Запуск итераций + Делегат = ДескрипторБенчмарка.Делегат(_ОбъектБенчмарков, ПараметрыМетода); + + Если _Конфигурация.Стратегия() = СтратегииЗапускаБенчмарка.ХолодныйЗапуск Тогда + КоличествоВызововЗаИтерацию = 1; + Иначе + КоличествоВызововЗаИтерацию = РассчитатьКоличествоВызововЗаИтерацию(Делегат); + КонецЕсли; + + ЗапуститьЭтапПрогрева(Делегат, КоличествоВызововЗаИтерацию); + ЗапуститьЭтапИзмерения(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса); + ЗапуститьМониторингПамяти(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса); + + // Сбор статистики + РезультатЗапускаКейса.Статистика.Прочитать(РезультатЗапускаКейса.Замеры); + + Если Не ИзолироватьИтерации() Тогда + _Репортер.ВывестиСтатистику(РезультатЗапускаКейса.Статистика); + КонецЕсли; + + // Событие ПослеКаждого + КонтекстСобытия = Новый Структура(); + КонтекстСобытия.Вставить("Кейс", Кейс); + КонтекстСобытия.Вставить("Замеры", РезультатЗапускаКейса.Замеры); + КонтекстСобытия.Вставить("Статистика", РезультатЗапускаКейса.Статистика); + + ВызватьОбработчикСобытия(СобытияБенчмарков.ПослеКаждого, КонтекстСобытия); + + Возврат РезультатЗапускаКейса; + +КонецФункции + +Функция РассчитатьКоличествоВызововЗаИтерацию(Делегат) + + КоличествоВызововЗаИтерацию = _Конфигурация.КоличествоВызововЗаИтерацию(); + Если Не КоличествоВызововЗаИтерацию = 0 Тогда + Возврат КоличествоВызововЗаИтерацию; + КонецЕсли; + + МинимальноеКоличествоВызовов = _Конфигурация.МинимальноеКоличествоВызововЗаИтерацию(); + ЦелевоеВремяИтерации = ЕдиницыИзмеренийБенчмарков.Конвертировать( + _Конфигурация.МинимальноеВремяИтерации(), + ЕдиницыИзмеренийБенчмарков.Миллисекунда, + ЕдиницыИзмеренийБенчмарков.Наносекунда + ); + + КоличествоВызовов = МинимальноеКоличествоВызовов; + НомерИтерации = 0; + ВремяПредыдущейОперации = 0; + ДопустимаяПогрешность = 0.05; + МаксимальноеКоличествоПроверокНаПогрешность = 5; + + Пока Истина Цикл + + НомерИтерации = НомерИтерации + 1; + РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Оценка, НомерИтерации, КоличествоВызовов); + + ВремяИтерации = РезультатИтерации.Наносекунд; + ВремяОперации = РезультатИтерации.НаносекундЗаОперацию; + + Погрешность = (ВремяПредыдущейОперации - ВремяОперации) / (ВремяОперации + ВремяПредыдущейОперации); + Погрешность = ?(Погрешность < 0, -Погрешность, Погрешность); + + Если ВремяИтерации < ЦелевоеВремяИтерации Тогда + КоличествоВызовов = КоличествоВызовов * 2; + ВремяПредыдущейОперации = ВремяОперации; + Продолжить; + КонецЕсли; + + Если Погрешность > ДопустимаяПогрешность И НомерИтерации < МаксимальноеКоличествоПроверокНаПогрешность Тогда + ВремяПредыдущейОперации = ВремяОперации; + Продолжить; + КонецЕсли; + + Прервать; + + КонецЦикла; + + Возврат КоличествоВызовов; + +КонецФункции + +Процедура ЗапуститьЭтапПрогрева(Делегат, КоличествоВызововЗаИтерацию) + + Если _Конфигурация.Стратегия() <> СтратегииЗапускаБенчмарка.ПропускнаяСпособность Тогда + Возврат; + КонецЕсли; + + КоличествоПрогревочныхИтераций = _Конфигурация.КоличествоПрогревочныхИтераций(); + + Если КоличествоПрогревочныхИтераций = 0 Тогда + Возврат; + КонецЕсли; + + Для НомерИтерации = 1 По КоличествоПрогревочныхИтераций Цикл + + ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Прогрев, НомерИтерации, КоличествоВызововЗаИтерацию); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗапуститьЭтапИзмерения(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса) + + Для НомерИтерации = 1 По _Конфигурация.КоличествоИтераций() Цикл + + ПроверитьИСоздатьЧекпоинт(РезультатЗапускаКейса.Кейс, ЭтапыБенчмарка.Измерение, НомерИтерации); + + Если ТребуетсяПропуститьИтерацию(ЭтапыБенчмарка.Измерение, НомерИтерации) Тогда + Продолжить; + КонецЕсли; + + РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Измерение, НомерИтерации, КоличествоВызововЗаИтерацию); + РезультатЗапускаКейса.Замеры.Добавить(РезультатИтерации); + + КонецЦикла; + +КонецПроцедуры + +Процедура ЗапуститьМониторингПамяти(Делегат, КоличествоВызововЗаИтерацию, РезультатЗапускаКейса) + + Если Не _Конфигурация.ТребуетсяМониторингПамяти() Тогда + Возврат; + КонецЕсли; + + Для НомерИтерации = 1 По _Конфигурация.КоличествоИтераций() Цикл + + ПроверитьИСоздатьЧекпоинт(РезультатЗапускаКейса.Кейс, ЭтапыБенчмарка.Память, НомерИтерации); + + Если ТребуетсяПропуститьИтерацию(ЭтапыБенчмарка.Память, НомерИтерации) Тогда + Продолжить; + КонецЕсли; + + РезультатИтерации = ВыполнитьИтерацию(Делегат, ЭтапыБенчмарка.Память, НомерИтерации, КоличествоВызововЗаИтерацию); + РезультатЗапускаКейса.Замеры.Добавить(РезультатИтерации); + + КонецЦикла; + +КонецПроцедуры + +Функция ВыполнитьИтерацию(Делегат, Этап, НомерИтерации, КоличествоВызовов) + + Наносекунд = 0; + ВыделяемаяПамять = 0; + + Если Этап = ЭтапыБенчмарка.Память Тогда + ВыделяемаяПамять = ЗамеритьПамять(Делегат, КоличествоВызовов); + Иначе + Наносекунд = ЗамеритьВремя(Делегат, КоличествоВызовов); + КонецЕсли; + + РезультатИтерации = Новый РезультатИтерацииКейса(); + РезультатИтерации.Этап = Этап; + РезультатИтерации.НомерИтерации = НомерИтерации; + РезультатИтерации.КоличествоОпераций = КоличествоВызовов; + РезультатИтерации.Наносекунд = Наносекунд; + РезультатИтерации.НаносекундЗаОперацию = Наносекунд / КоличествоВызовов; + РезультатИтерации.ВыделяемаяПамять = ВыделяемаяПамять; + РезультатИтерации.ВыделяемаяПамятьЗаОперацию = ВыделяемаяПамять / КоличествоВызовов; + + Если НомерИтерации = 1 Тогда + _Репортер.ВывестиСтроку(" "); + КонецЕсли; + + _Репортер.ВывестиСтроку(Строка(РезультатИтерации), "Серый"); + + _БылоВыполнениеИтерации = Истина; + + Возврат РезультатИтерации; + +КонецФункции + +Функция ЗамеритьВремя(Делегат, КоличествоВызовов) + + Рефлектор = Новый Рефлектор(); + Объект = Делегат.Объект(); + ИмяМетода = Делегат.ИмяМетода(); + Параметры = Делегат.Параметры(); + ОсталосьВызовов = КоличествоВызовов; + + _Лог.Отладка("Начало замера времени <%1>", ИмяМетода); + + _Хронометр.Старт(); // Хронометр должен быть "прогрет" + + Пока ОсталосьВызовов > 0 Цикл + Рефлектор.ВызватьМетод(Объект, ИмяМетода, Параметры); + ОсталосьВызовов = ОсталосьВызовов - 1; + КонецЦикла; + + _Хронометр.Стоп(); + + _Лог.Отладка("Окончание замера времени <%1>", ИмяМетода); + + Возврат _Хронометр.Наносекунд; + +КонецФункции + +Функция ЗамеритьПамять(Делегат, КоличествоВызовов) + + Рефлектор = Новый Рефлектор(); + Объект = Делегат.Объект(); + ИмяМетода = Делегат.ИмяМетода(); + Параметры = Делегат.Параметры(); + ОсталосьВызовов = КоличествоВызовов; + + _Лог.Отладка("Начало замера памяти <%1>", ИмяМетода); + + _МониторПамяти.Начать(); // Объект должен быть "прогрет" + + Пока ОсталосьВызовов > 0 Цикл + Рефлектор.ВызватьМетод(Объект, ИмяМетода, Параметры); + ОсталосьВызовов = ОсталосьВызовов - 1; + КонецЦикла; + + ВыделеноБайт = _МониторПамяти.Завершить(); + + _Лог.Отладка("Завершение замера памяти <%1>", ИмяМетода); + + Возврат ВыделеноБайт; + +КонецФункции + +Процедура ВызватьОбработчикСобытия(ИмяСобытия, Контекст = Неопределено) + + Обработчики = _Конфигурация.ОбработчикиСобытия(ИмяСобытия); + + Для Каждого Обработчик Из Обработчики Цикл + + _Лог.Отладка("Вызов обработчика события <%1>", Обработчик.ИмяМетода()); + + Попытка + Делегат = Обработчик.Делегат(_ОбъектБенчмарков); + Делегат.Выполнить(Контекст); + Исключение + ВызватьИсключение СтрШаблон( + "Ошибка в обработчике события <%1>: %2", + Обработчик.ИмяМетода(), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()) + ); + КонецПопытки; + + КонецЦикла; + +КонецПроцедуры + +Функция ПараметрыМетодаБенчмарка(ДескрипторБенчмарка, Параметры) + + ИменаПараметров = ДескрипторБенчмарка.ИменаПараметров(); + + Если ИменаПараметров.Количество() = 0 Тогда + Возврат Новый Массив(); + КонецЕсли; + + ПараметрыМетода = Новый Массив(ИменаПараметров.Количество()); + + Для Каждого Параметр Из Параметры Цикл + Если Параметр.ЭтоПараметрМетода() Тогда + ПараметрыМетода[ИменаПараметров.Найти(Параметр.Имя())] = Параметр.Значение(); + КонецЕсли; + КонецЦикла; + + Возврат ПараметрыМетода; + +КонецФункции + +// Устанавливает значения публичным полям объекта +// +// Параметры: +// Параметры - Массив из ПараметрБенчмарка +Процедура УстановитьПараметрыОбъекта(Параметры) + + ШаблонОшибки = "Не удалось задать значение поля <%1> для объекта <%2>"; + + Для Каждого Параметр Из Параметры Цикл + Если Не Параметр.ЭтоПараметрМетода() Тогда + Попытка + _ОбъектБенчмарков[Параметр.Имя()] = Параметр.Значение(); + Исключение + ВызватьИсключение СтрШаблон(ШаблонОшибки, Параметр.Имя(), ТипЗнч(_ОбъектБенчмарков)); + КонецПопытки; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ПрогретьИнструментыЗамера() + + ТребуетсяМониторингПамяти = _Конфигурация.ТребуетсяМониторингПамяти(); + КоличествоИтераций = 5; + + Для НомерИтерации = 1 По КоличествоИтераций Цикл + + _Хронометр.Старт(); + _Хронометр.Стоп(); + + Если ТребуетсяМониторингПамяти Тогда + _МониторПамяти.Начать(); + _МониторПамяти.Завершить(); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ЭтоПервыйЗапуск() + Возврат _Чекпоинт = Неопределено + Или _Чекпоинт.Этап = ЭтапыБенчмарка.Измерение И _Чекпоинт.НомерИтерации = 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\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\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\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" index e84b409..3279c82 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\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\241\321\206\320\265\320\275\320\260\321\200\320\270\320\271\320\227\320\260\320\277\321\203\321\201\320\272\320\260\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -77,9 +77,9 @@ |ИдентификаторыКейсов = Настройки.ИдентификаторыКейсов; |Чекпоинт = Настройки.Чекпоинт; | - |Запускатель = Новый ЗапускательБенчмарков(ДескрипторыБенчмарков, Конфигурация); - |Запускатель.УстановитьЧекпоинт(Чекпоинт); - |Запускатель.Запустить(ИдентификаторыКейсов); + |Исполнитель = Новый ИсполнительБенчмарков(ДескрипторыБенчмарков, Конфигурация); + |Исполнитель.УстановитьЧекпоинт(Чекпоинт); + |Исполнитель.Запустить(ИдентификаторыКейсов); |"; Возврат ТекстСценария; diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" index aa58949..348d757 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" @@ -40,7 +40,7 @@ // *** ВыделяемаяПамятьЗаОперацию - Число - Байт выделяемой памяти за операцию Функция Запустить(ИсточникБенчмарков, Конфигурация = Неопределено) Экспорт - ЗапускательБенчмарков = Новый ИзолированныйЗапускательБенчмарков(ИсточникБенчмарков, Конфигурация); + ЗапускательБенчмарков = Новый ЗапускательБенчмарков(ИсточникБенчмарков, Конфигурация); Возврат ЗапускательБенчмарков.Запустить(); КонецФункции diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" index a10b9aa..3b8cd78 100644 --- "a/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" +++ "b/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" @@ -265,6 +265,4 @@ КонецЦикла; -КонецПроцедуры - -ТестДолжен_ЗапуститьОдинБенчмаркОднойИтерациейБезПараметровСПамятью(); \ No newline at end of file +КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\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 6536f1b..7a02f32 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" @@ -870,6 +870,4 @@ Возврат СтрРазделить(ТекстЛога, Символы.ПС, Ложь); -КонецФункции - -ТестДолжен_ВыброситьИсключениеПриГенерацииКейсовСНеизвестнымИдентификатором(); \ No newline at end of file +КонецФункции \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\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 409b17a..5ca27af 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" @@ -114,6 +114,8 @@ Процедура ТестДолжен_ИгнорироватьЭталонностьБенчмаркаПриНаличииЭталоннойВерсииСреды() Экспорт // Подготовка + ТестированиеБенчмарков.ПодготовитьСреду("dev,stable"); + Тип = Тип("БенчмаркиСЭталоном"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); From 7a8d37a5f50965049bcd471d6e9435a2ef66c813 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 7 Mar 2026 23:11:18 +0300 Subject: [PATCH 04/11] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B8=20=D0=B4=D0=BE=D0=BA=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B5=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...274\320\260\321\200\320\272\320\270\320\275\320\263.os" | 7 +------ ...263\321\203\321\200\320\260\321\206\320\270\320\270.os" | 2 +- ...202\320\260\320\273\320\276\320\275\320\276\320\262.os" | 2 ++ 3 files changed, 4 insertions(+), 7 deletions(-) diff --git "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" index 348d757..d4c896d 100644 --- "a/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" +++ "b/src/BenchmarkOneScript/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\270\320\275\320\263.os" @@ -21,15 +21,10 @@ // * ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков // * Отчет - ОтчетБенчмарков // * Запуски - Массив из РезультатЗапускаКейса: -// ** ДескрипторБенчмарка - ДескрипторБенчмарка -// ** Параметры - Массив из ПараметрБенчмарка +// ** Кейс - КейсБенчмарка // ** Эталон - РезультатЗапускаКейса, Неопределено // ** ЭтоЭталон - Булево // ** Статистика - СтатистикаБенчмарка -// ** ИсполняющаяСреда - ИсполняющаяСредаБенчмарков: -// *** Версия - Строка -// *** Алиас - Строка -// *** Наименование - Строка // ** Замеры - Массив из РезультатИтерацииКейса: // *** Этап - см. ЭтапыБенчмарка // *** НомерИтерации - Число 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 7a02f32..f96b8f2 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" @@ -796,7 +796,7 @@ // Подготовка Тип = Тип("ПустойБенчмарк"); - ДескрпиторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип); + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип); Конфигурация = Новый КонфигурацияБенчмарков(Тип); ИдентификаторыКейсов = Новый Массив(); 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 5ca27af..a8e08be 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" @@ -146,6 +146,8 @@ Процедура ТестДолжен_ЗапуститьЭталонныйБенчмаркСРазнымиВерсиямиСреды() Экспорт // Подготовка + ТестированиеБенчмарков.ПодготовитьСреду("dev,stable"); + Тип = Тип("БенчмаркиСЭталоном"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); From 096a093e25eb6d7230629b973798c4292ccfabdf Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 7 Mar 2026 23:44:00 +0300 Subject: [PATCH 05/11] fix --- ...\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f96b8f2..54d9593 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" @@ -806,7 +806,7 @@ ПараметрыМетода = Новый Массив(); ПараметрыМетода.Добавить(ИдентификаторыКейсов); - ГенераторКейсов = Новый ГенераторКейсовБенчмарков(ДескрпиторыБенчмарков, Конфигурация); + ГенераторКейсов = Новый ГенераторКейсовБенчмарков(ДескрипторыБенчмарков, Конфигурация); // Действие и Проверка Ожидаем From 0612ae9d350166274cdb4c17159d424878fe6e83 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sat, 7 Mar 2026 23:53:37 +0300 Subject: [PATCH 06/11] refactor test --- ...202\320\260\320\273\320\276\320\275\320\276\320\262.os" | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) 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 a8e08be..33604d7 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" @@ -63,11 +63,6 @@ ДескрипторыБенчмарков.НайтиПоИмени("БенчмаркА1").ИспользоватьКакЭталон(); ДескрипторыБенчмарков.НайтиПоИмени("БенчмаркБ1").ИспользоватьКакЭталон(); - ПараметрыМетода = Новый Массив(); - ПараметрыМетода.Добавить(Тип); - ПараметрыМетода.Добавить(Конфигурация); - ПараметрыМетода.Добавить(ДескрипторыБенчмарков); - // Действие Результат = Бенчмаркинг.Запустить(ДескрипторыБенчмарков, Конфигурация); @@ -147,7 +142,7 @@ // Подготовка ТестированиеБенчмарков.ПодготовитьСреду("dev,stable"); - + Тип = Тип("БенчмаркиСЭталоном"); Конфигурация = Новый КонфигурацияБенчмарков(Тип); From 25eca834bae0f7d873b73cd670cc2d687ba22ddb Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 8 Mar 2026 01:05:09 +0300 Subject: [PATCH 07/11] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\267\320\260\321\206\320\270\321\217.md" | 4 +- ...20\260\321\200\320\272\320\276\320\262.os" | 37 ++++++++----------- ...20\260\320\277\321\203\321\201\320\272.os" | 0 3 files changed, 18 insertions(+), 23 deletions(-) rename "tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" => "tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\245\320\276\320\273\320\276\320\264\320\275\321\213\320\271\320\227\320\260\320\277\321\203\321\201\320\272.os" (100%) diff --git "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" index 2d02c94..6a8f8a6 100644 --- "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" +++ "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" @@ -46,8 +46,8 @@ ``` Бенчмарк будет запущен дважды: -- `РазмерМассива = "100"`, `КоличествоИтераций = 1000` -- `РазмерМассива = "500"`, `КоличествоИтераций = 5000` +- `РазмерМассива = 100`, `КоличествоИтераций = 1000` +- `РазмерМассива = 500`, `КоличествоИтераций = 5000` ## Комбинирование параметров 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 3af9c60..84d6f0f 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" @@ -173,7 +173,7 @@ Чекпоинт = ТекущийРезультат.Чекпоинт; РезультатЗапуска.СредаОкружения = ТекущийРезультат.СредаОкружения; - ОбработатьИзолированныйЗапуск(РезультатЗапуска, ТекущийРезультат, Чекпоинт); + ОбработатьИзолированныйЗапускИтерации(РезультатЗапуска, ТекущийРезультат, Чекпоинт); // Закончились кейсы для запуска Если Чекпоинт = Неопределено Тогда @@ -186,22 +186,25 @@ КонецПроцедуры -Процедура ОбработатьИзолированныйЗапуск(РезультатЗапуска, ТекущийРезультат, Чекпоинт) +Процедура ОбработатьИзолированныйЗапускИтерации(РезультатЗапуска, ТекущийРезультат, Чекпоинт) - ПредыдущийЗапуск = ПолучитьПоследнийЗапуск(РезультатЗапуска); - СледующийЧекпоинт = ТекущийРезультат.Чекпоинт; - - Для Каждого ТекущийЗапуск Из ТекущийРезультат.Запуски Цикл + Если ТекущийРезультат.Запуски.Количество() <> 1 Тогда + ВызватьИсключение "Ожидался результат запуска одного кейса"; + КонецЕсли; - Если МожноОбъединитьСПредыдущимЗапуском(ПредыдущийЗапуск, ТекущийЗапуск) Тогда - ОбъединитьЗамерыЗапусков(ПредыдущийЗапуск, ТекущийЗапуск); - Иначе - РезультатЗапуска.Запуски.Добавить(ТекущийЗапуск); - КонецЕсли; + ПредыдущийЗапуск = ПолучитьПоследнийЗапуск(РезультатЗапуска); + ТекущийЗапуск = ТекущийРезультат.Запуски[0]; + СледующийЧекпоинт = ТекущийРезультат.Чекпоинт; - ПредыдущийЗапуск = Неопределено; + Если ТекущийЗапуск.Замеры.Количество() <> 1 Тогда + ВызватьИсключение "Ожидался результат одной итерации кейс"; + КонецЕсли; - КонецЦикла; + Если МожноОбъединитьСПредыдущимЗапуском(ПредыдущийЗапуск, ТекущийЗапуск) Тогда + ПредыдущийЗапуск.Замеры.Добавить(ТекущийЗапуск.Замеры[0]); + Иначе + РезультатЗапуска.Запуски.Добавить(ТекущийЗапуск); + КонецЕсли; Если ТребуетсяВыводСтатистики(Чекпоинт, СледующийЧекпоинт) Тогда _Репортер.ВывестиСтатистику(ТекущийЗапуск.Статистика); @@ -239,14 +242,6 @@ КонецПроцедуры -Процедура ОбъединитьЗамерыЗапусков(ЦелевойЗапуск, ЗапускИсточник) - - Для Каждого Замер Из ЗапускИсточник.Замеры Цикл - ЦелевойЗапуск.Замеры.Добавить(Замер); - КонецЦикла; - -КонецПроцедуры - Процедура ВосстановитьКейсыЗапусков(РезультатЗапускаБенчмарка, Кейсы) КартаКейсов = Новый Соответствие(); diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\245\320\276\320\273\320\276\320\264\320\275\321\213\320\271\320\227\320\260\320\277\321\203\321\201\320\272.os" similarity index 100% rename from "tests/\320\242\320\265\321\201\321\202\321\213\320\230\320\267\320\276\320\273\320\270\321\200\320\276\320\262\320\260\320\275\320\275\321\213\321\205\320\227\320\260\320\277\321\203\321\201\320\272\320\276\320\262.os" rename to "tests/\320\242\320\265\321\201\321\202\321\213\320\241\321\202\321\200\320\260\321\202\320\265\320\263\320\270\320\270\320\245\320\276\320\273\320\276\320\264\320\275\321\213\320\271\320\227\320\260\320\277\321\203\321\201\320\272.os" From 7d0e8c53be2ef8533cf05aafe7c57fe64bad9c3d Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 8 Mar 2026 01:37:38 +0300 Subject: [PATCH 08/11] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D1=8D=D1=82=D0=B0=D0=BB=D0=BE=D0=BD=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\267\320\260\321\206\320\270\321\217.md" | 12 +-- ...20\260\320\273\320\276\320\275\321\213.md" | 99 +++++++++++++------ 2 files changed, 75 insertions(+), 36 deletions(-) diff --git "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" index 6a8f8a6..d48a68c 100644 --- "a/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" +++ "b/docs/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" @@ -78,9 +78,9 @@ # Способы задания параметров Параметры можно задавать тремя способами, каждый из которых подходит для разных сценариев: -- **Аннотации `&Параметры`** — для простых случаев с фиксированными значениями -- **Функции-источники `&ИсточникПараметров`** — для динамической генерации -- **API конфигурации** — для программного управления параметрами +- **Аннотации `&Параметры`** - для простых случаев с фиксированными значениями +- **Функции-источники `&ИсточникПараметров`** - для динамической генерации +- **API конфигурации** - для программного управления параметрами ## 1. Прямое указание через аннотацию `&Параметры` @@ -182,7 +182,7 @@ КонецФункции ``` -#### Для нескольких параметров — вариант 1: Таблица значений +#### Для нескольких параметров - вариант 1: Таблица значений Имена колонок таблицы значений должны совпадать с именами параметров метода. @@ -212,7 +212,7 @@ КонецФункции ``` -#### Для нескольких параметров — вариант 2: Массив массивов +#### Для нескольких параметров - вариант 2: Массив массивов Порядок значений в массиве должен соответствовать порядку параметров метода. @@ -244,7 +244,7 @@ КонецФункции ``` -#### Для нескольких параметров — вариант 3: Массив структур/соответствий +#### Для нескольких параметров - вариант 3: Массив структур/соответствий Ключи структуры или соответствия сопоставляются с именами параметров метода. diff --git "a/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" "b/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" index 61f532c..211af4d 100644 --- "a/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" +++ "b/docs/\320\255\321\202\320\260\320\273\320\276\320\275\321\213.md" @@ -1,16 +1,28 @@ # Эталоны -## Эталонные бенчмарки +Эталон - это точка отсчёта для сравнения результатов. В BenchmarkOneScript поддерживаются два вида эталонов: -Результаты выполнения эталонного бенчмарка используются как базовая метрика для оценки эффективности других тестов. +- **Эталонный бенчмарк** - один из методов класса помечается как базовый, остальные тесты сравниваются с ним. +- **Эталонная исполняющая среда** - одна из сред выполнения помечается как базовая, остальные среды сравниваются с ней. + +При наличии эталона в отчёте автоматически появляется колонка `Ratio` - среднее соотношение времени выполнения каждого теста относительно эталона. Значение `1.00` соответствует эталону, значения меньше `1.00` указывают на более быстрые тесты, больше `1.00` - на более медленные. + +## Эталонные бенчмарки + +Один из методов класса назначается эталоном - его результаты служат базой для вычисления `Ratio` остальных тестов в той же группе (или категории). + +**Ограничение:** в каждой категории (или среди бенчмарков без категории) допускается не более одного эталона. При нарушении запуск завершится ошибкой. ### Конфигурирование #### Аннотация ```bsl +&Бенчмарк &Эталон Процедура Бенчмарк() Экспорт + // Логика бенчмарка +КонецПроцедуры ``` #### API @@ -45,22 +57,22 @@ #### Результаты выполнения -В отчете автоматически добавляется колонка `Ratio`, показывающая среднее значение соотношений времени выполнения относительно эталона и в некоторых ситуациях колонка [`RatioSD`](#ratiosd). +В отчёте автоматически добавляется колонка `Ratio`, а в ряде случаев - колонка [`RatioSD`](#ratiosd). -| Method | Baseline | Mean | StdErr | StdDev | Ratio | Median | Op/s | -|-------------|----------|----------:|---------:|----------:|------:|----------:|-------:| -| Задержка100 | true | 100.93 ms | 18.96 us | 73.45 us | 1.000 | 100.95 ms | 9.908 | -| Задержка150 | false | 150.88 ms | 30.44 us | 117.89 us | 1.495 | 150.83 ms | 6.628 | -| Задержка50 | false | 50.91 ms | 19.17 us | 74.26 us | 0.504 | 50.93 ms | 19.644 | +| Method | Baseline | Mean | StdErr | StdDev | Ratio | Op/s | +|-------------|----------|----------:|---------:|----------:|------:|-------:| +| Задержка50 | No | 50.65 ms | 50.50 us | 195.58 us | 0.50 | 19.745 | +| Задержка100 | Yes | 100.59 ms | 38.40 us | 148.72 us | 1.00 | 9.941 | +| Задержка150 | No | 150.59 ms | 21.97 us | 85.10 us | 1.50 | 6.641 | **Интерпретация:** -- Метод `Задержка150` (Ratio 1.495) на 49.5% медленнее эталона -- Метод `Задержка50` (Ratio 0.504) в 2 раза быстрее эталона +- `Задержка150` (Ratio 1.50) - на 50% медленнее эталона +- `Задержка50` (Ratio 0.50) - в 2 раза быстрее эталона ## Множественные эталоны через категории -Для использования нескольких эталонных бенчмарков в одном классе применяйте категории. Каждая категория может иметь собственный эталон. +Если все бенчмарки сравнивать с одним общим эталоном нецелесообразно, используйте категории. Каждая категория может иметь собственный независимый эталон, и `Ratio` вычисляется отдельно внутри каждой группы. ### Пример @@ -94,24 +106,44 @@ #### Результаты выполнения -| Method | Categories | Baseline | Mean | StdErr | StdDev | Ratio | Median | Op/s | -|-------------|------------|----------|----------:|---------:|----------:|------:|----------:|-------:| -| Задержка50 | Быстрый | true | 50.86 ms | 23.53 us | 91.12 us | 1 | 50.87 ms | 19.662 | -| Задержка100 | Быстрый | false | 100.93 ms | 19.70 us | 76.28 us | 2 | 100.96 ms | 9.908 | -| Задержка300 | Медленный | true | 300.85 ms | 37.90 us | 146.77 us | 1 | 300.91 ms | 3.324 | -| Задержка350 | Медленный | false | 350.89 ms | 21.07 us | 81.60 us | 1 | 350.91 ms | 2.850 | +| Method | Categories | Baseline | Mean | StdErr | StdDev | Ratio | Op/s | +|-------------|------------|----------|----------:|---------:|---------:|------:|-------:| +| Задержка50 | Быстрый | Yes | 50.75 ms | 38.63 us | 149.6 us | 1.00 | 19.706 | +| Задержка100 | Быстрый | No | 100.59 ms | 58.63 us | 227.1 us | 2.00 | 9.942 | +| Задержка300 | Медленный | Yes | 300.54 ms | 42.51 us | 164.6 us | 1.00 | 3.327 | +| Задержка350 | Медленный | No | 350.63 ms | 71.45 us | 276.7 us | 1.17 | 2.852 | + +**Интерпретация:** + +- В категории `Быстрый`: `Задержка100` (Ratio 2) в 2 раза медленнее эталона `Задержка50`. +- В категории `Медленный`: `Задержка350` (Ratio ~1.17) на 17% медленнее эталона `Задержка300`. ## RatioSD -В некоторых ситуациях автоматически добавляется колонка `RatioSD` (стандартное отклонение соотношений времени выполнения относительно эталона). Метрика помогает выявить аномалии в измерениях, когда отдельные выбросы искажают общую картину. В следующем примере эталонный бенчмарк испорчен одиночным выбросом. +`RatioSD` - стандартное отклонение соотношений времени выполнения относительно эталона. Метрика сигнализирует о нестабильности измерений: когда отдельные выбросы делают обычные метрики (Mean, Median) противоречивыми. -### Пример +**Интерпретация:** +- Низкое значение `RatioSD` - результаты стабильны, вариативность мала. +- Высокое значение `RatioSD` - сильный разброс между запусками, возможны проблемы с воспроизводимостью теста. + +Колонка `RatioSD` добавляется **автоматически** при обнаружении значимой нестабильности. Можно также включить её явно через аннотацию: + +```bsl +&КолонкаRatioSD +Процедура ПриСозданииОбъекта() +КонецПроцедуры +``` + +### Пример: выброс в эталонном бенчмарке + +Эталонный бенчмарк выполняется 100 мс, но каждая 7-я итерация занимает дополнительные 5000 мс. ```bsl Перем Счетчик; // Число -&СтратегияХолодныйЗапуск &КоличествоИтераций(10) +&КоличествоВызововЗаИтерацию(1) +&КоличествоПрогревочныхИтераций(0) Процедура ПриСозданииОбъекта() КонецПроцедуры @@ -149,26 +181,33 @@ | Method | Baseline | Mean | StdErr | StdDev | Ratio | RatioSD | Median | Op/s | |-----------|----------|----------:|--------------:|---------------:|------:|--------:|----------:|-------:| -| Базовый | true | 600.84 ms | 500,097.32 us | 1,581,446.6 us | 1.00 | 0.00 | 100.71 ms | 1.664 | -| Медленный | false | 200.68 ms | 91.60 us | 289.7 us | 1.80 | 0.59 | 200.80 ms | 4.983 | -| Быстрый | false | 50.75 ms | 100.97 us | 319.3 us | 0.45 | 0.15 | 50.84 ms | 19.706 | - -Единичный выброс данных исказил результаты метрик. Рассмотрим бенчмарки `Базовый` и `Медленный`. Для метрики `Mean` зафиксированы значения **600 мс** (Базовый) и **200 мс** (Медленный), что дает соотношение 0.3. Для метрики `Median` результаты противоположны: **100 мс** (Базовый) и **200 мс** (Медленный), что приводит к соотношению 2.0. +| Базовый | Yes | 600.61 ms | 499,972.28 us | 1,581,051.2 us | 1.00 | 0.00 | 100.70 ms | 1.665 | +| Медленный | No | 200.54 ms | 96.35 us | 304.7 us | 1.80 | 0.59 | 200.54 ms | 4.987 | +| Быстрый | No | 50.32 ms | 88.50 us | 279.8 us | 0.45 | 0.15 | 50.21 ms | 19.875 | -Обе метрики демонстрируют противоречивую картину из-за влияния выброса. Для решения этой проблемы инструмент BenchmarkOneScript вводит метрику `RatioSD`, которая количественно оценивает нестабильность тестов. +Из-за единичного выброса метрики `Базового` дают противоречивую картину: -Принцип интерпретации: **чем выше значение `RatioSD`, тем больше вариативность результатов**, что указывает на потенциальные проблемы в воспроизводимости тестирования. +- **Mean** = 600 мс (раздут выбросом), **Median** = 100 мс (отражает типичное время). +- Если считать соотношение через Mean: `Медленный` / `Базовый` = 200 / 600 ≈ **0.33** (Медленный «быстрее»). +- Если считать через Median: 200 / 100 = **2.0** (Медленный медленнее вдвое). +Колонка `Ratio` вычисляется как среднее попарных соотношений по итерациям, а не как деление средних. Это даёт промежуточное значение **1.80**, но оно нестабильно - `RatioSD = 0.59` сигнализирует о высокой вариативности и предупреждает: результатам `Ratio` для `Медленного` доверять не следует до устранения выброса в `Базовом`. ## Эталонные среды выполнения +При сравнении нескольких версий OneScript одна из них может быть назначена эталонной. В этом режиме `Ratio` для каждого метода вычисляется как соотношение времени выполнения в данной среде к времени в эталонной среде - вне зависимости от аннотации `&Эталон` на методах. + +**Ограничение:** в конфигурации может быть помечена как эталонная только одна среда. При нарушении запуск завершится ошибкой. + +Подробнее см. в разделе [Среда выполнения](СредаВыполнения.md). + ### Конфигурирование #### Аннотация ```bsl &ИсполняющаяСреда( - Версия = "1.9.3", + Версия = "1.9.3", Наименование = "Стабильная сборка", ЭтоЭталон = Истина ) @@ -186,6 +225,6 @@ | Method | Runtime | Baseline | Mean | StdErr | StdDev | Ratio | RatioSD | Op/s | |--------|-----------------------|----------|----------:|---------:|---------:|------:|--------:|--------:| | SHA256 | 2.0.0-rc.8+608 | No | 9.048 us | 93.81 ns | 363.3 ns | 0.67 | 0.03 | 110,523 | -| SHA256 | Стабильная (1.9.3.15) | Yes | 13.561 us | 70.97 ns | 274.9 ns | 1.00 | 0.00 | 73,742 | +| SHA256 | Стабильная сборка (1.9.3.15) | Yes | 13.561 us | 70.97 ns | 274.9 ns | 1.00 | 0.00 | 73,742 | -Подробнее см. в разделе [Среда выполнения](СредаВыполнения.md) \ No newline at end of file +**Интерпретация:** версия `2.0.0-rc.8+608` быстрее эталонной сборки `1.9.3` в ~1.5 раза (Ratio 0.67). \ No newline at end of file From 563c6cdab479b4147291e5fcb2de68f108757b72 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 8 Mar 2026 01:41:37 +0300 Subject: [PATCH 09/11] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8F=20=D1=8D=D0=BA=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D1=80=D1=82=D0=B5=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...21\202\320\260\321\202\320\276\320\262.md" | 53 ++++++++++++------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git "a/docs/\320\255\320\272\321\201\320\277\320\276\321\200\321\202\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262.md" "b/docs/\320\255\320\272\321\201\320\277\320\276\321\200\321\202\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262.md" index e0cd4b0..3a3ffc5 100644 --- "a/docs/\320\255\320\272\321\201\320\277\320\276\321\200\321\202\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262.md" +++ "b/docs/\320\255\320\272\321\201\320\277\320\276\321\200\321\202\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202\320\276\320\262.md" @@ -1,41 +1,54 @@ # Экспорт результатов -**BenchmarkOneScript** позволяет сохранить результаты выполнения бенчмарков в различных форматах. По умолчанию файлы с результатами генерируются в каталоге _./BenchmarkArtifacts_ относительно текущей рабочей директории. +**BenchmarkOneScript** позволяет сохранить результаты выполнения бенчмарков в различных форматах. По умолчанию файлы сохраняются в каталог _./BenchmarkArtifacts_ относительно текущей рабочей директории. -## Конфигурирование +## Форматы -### Настройка каталога артефактов +| Аннотация | Расширение | Содержимое | +|-------------------|:----------:|----------------------------------------------------------| +| `&ЭкспортMarkdown` | `.md` | Информация о среде выполнения + таблица результатов | +| `&ЭкспортJson` | `.json` | Полная сериализация результатов запуска в формате JSON | +| `&ЭкспортHtml` | `.html` | HTML-страница с информацией о среде выполнения и таблицей результатов с CSS-стилизацией | -Каталог для сохранения результатов можно изменить двумя способами: +## Именование файлов -1. Через аннотацию в коде бенчмарка: +Файлы сохраняются по маске `<ИмяТипаКласса>-report.<расширение>`. Например, для класса `МойБенчмарк`: -```bsl -&КаталогАртефактов("path/to/artifacts") +``` +./BenchmarkArtifacts/МойБенчмарк-report.html +./BenchmarkArtifacts/МойБенчмарк-report.json +./BenchmarkArtifacts/МойБенчмарк-report.md ``` -2. Программно с использованием API конфигурации: +> Каталог создаётся автоматически. При каждом запуске файлы отчётов предыдущего прогона удаляются. -```bsl -Конфигурация.УстановитьКаталогАртефактов("path/to/artifacts"); -``` +## Конфигурирование + +### Аннотации -### Аннотации экспортеров ```bsl &ЭкспортMarkdown &ЭкспортJson &ЭкспортHtml +&КаталогАртефактов("path/to/artifacts") Процедура ПриСозданииОбъекта() +КонецПроцедуры ``` ### API ```bsl -// Добавление экспортера (например, для JSON) +// Добавление экспортеров +Конфигурация.ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Markdown); Конфигурация.ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Json); -// ЭкспортерыРезультатовБенчмарков.Html -// ЭкспортерыРезультатовБенчмарков.Markdown +Конфигурация.ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Html); + +// Установка каталога артефактов +Конфигурация.УстановитьКаталогАртефактов("path/to/artifacts"); + +// Получение текущего каталога артефактов +Каталог = Конфигурация.КаталогАртефактов(); // Получение списка экспортеров Экспортеры = Конфигурация.Экспортеры(); @@ -50,7 +63,7 @@ &ЭкспортMarkdown &ЭкспортJson &ЭкспортHtml -&КаталогАртефактов("./АртефкатыЗапускаБенчмарков") +&КаталогАртефактов("./АртефактыЗапускаБенчмарков") Процедура ПриСозданииОбъекта() КонецПроцедуры @@ -79,7 +92,7 @@ Op/s : Операций в секунду 1 us : 1 Микросекунда // Артефакты -C:\myapp\АртефкатыЗапускаБенчмарков\ИмяКласса-report.html -C:\myapp\АртефкатыЗапускаБенчмарков\ИмяКласса-report.json -C:\myapp\АртефкатыЗапускаБенчмарков\ИмяКласса-report.md -``` \ No newline at end of file +C:\myapp\АртефактыЗапускаБенчмарков\ИмяКласса-report.html +C:\myapp\АртефактыЗапускаБенчмарков\ИмяКласса-report.json +C:\myapp\АртефактыЗапускаБенчмарков\ИмяКласса-report.md +``` From 0d8976ba38ca02743bffe719142c6eb16489727d Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 8 Mar 2026 01:48:39 +0300 Subject: [PATCH 10/11] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D0=B8=20=D1=81=D1=80=D0=B5=D0=B4=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\275\320\265\320\275\320\270\321\217.md" | 64 +++++++++++++++---- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git "a/docs/\320\241\321\200\320\265\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.md" "b/docs/\320\241\321\200\320\265\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.md" index 6a7285e..008af6b 100644 --- "a/docs/\320\241\321\200\320\265\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.md" +++ "b/docs/\320\241\321\200\320\265\320\264\320\260\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\321\217.md" @@ -2,24 +2,47 @@ Для сравнения производительности в разных версиях **OneScript** используется аннотация `&ИсполняющаяСреда`, позволяющая запускать бенчмарки в нескольких средах одновременно. +## Как работает разрешение версий + +Каждый запуск бенчмарка выполняется в отдельном процессе `oscript`. Версия определяется следующим образом: + +1. **Путь к файлу** — если значение `Версия` указывает на существующий файл, он используется напрямую. +2. **Алиас или номер версии** — иначе фреймворк ищет установленную версию через [OVM (OneScript Version Manager)](https://github.com/oscript-library/ovm). + +**Порядок определения каталога установки OVM:** +1. Переменная среды `OVM_INSTALL_PATH` +2. Переменная среды `OSCRIPTBIN` (если её родительский каталог называется `ovm`) +3. Команда `ovm which current` + +**Если ни одна среда не задана**, бенчмарк выполняется в той же версии OneScript, которой запущен сам фреймворк (`current`). + ## Конфигурирование ### Аннотации -1. Базовый вариант (несколько версий через запятую) +1. Несколько версий в одной аннотации (через запятую): ```bsl &ИсполняющаяСреда("stable, dev, 1.9.3") Процедура ПриСозданииОбъекта() +КонецПроцедуры +``` + +2. Несколько аннотаций (по одной на версию): +```bsl +&ИсполняющаяСреда("stable") +&ИсполняющаяСреда("dev") +Процедура ПриСозданииОбъекта() ``` -2. С кастомным именем для отчётов +3. С именованными параметрами и произвольным наименованием для отчёта: ```bsl &ИсполняющаяСреда(Версия = "1.9.3", Наименование = "Стабильная сборка") &ИсполняющаяСреда(Версия = "dev", Наименование = "Ночная сборка") Процедура ПриСозданииОбъекта() +КонецПроцедуры ``` -3. Указание эталонной версии для сравнения +4. С указанием эталонной среды: ```bsl &ИсполняющаяСреда( Версия = "stable", @@ -27,17 +50,19 @@ ЭтоЭталон = Истина ) Процедура ПриСозданииОбъекта() +КонецПроцедуры ``` -4. Использование кастомного исполняемого файла +5. Путь к произвольному исполняемому файлу: ```bsl -&ИсполняющаяСреда(Версия = "path/to/oscript.exe", Наименование = "Моя сборка") +&ИсполняющаяСреда(Версия = "/path/to/oscript.exe", Наименование = "Моя сборка") Процедура ПриСозданииОбъекта() +КонецПроцедуры ``` ### API -1. Простой вариант указания версий +1. Простое указание версий: ```bsl Конфигурация .ДобавитьИсполняющуюСреду("stable") @@ -45,33 +70,44 @@ .ДобавитьИсполняющуюСреду("1.9.3"); ``` -2. С кастомным именем для отчётов +2. С наименованием для отчёта: ```bsl Конфигурация .ДобавитьИсполняющуюСреду("1.9.3", "Стабильная сборка") .ДобавитьИсполняющуюСреду("dev", "Ночная сборка"); ``` -3. Указание эталонной версии +3. С эталонной средой: ```bsl Конфигурация.ДобавитьИсполняющуюСреду("stable", "Стабильная сборка", Истина); ``` -4. Путь к исполняющему файлу +4. Путь к исполняемому файлу: ```bsl -Конфигурация.ДобавитьИсполняющуюСреду("path/to/oscript.exe", "Моя сборка"); +Конфигурация.ДобавитьИсполняющуюСреду("/path/to/oscript.exe", "Моя сборка"); ``` ### CLI -Для указания версий OneScript используйте опцию `--runtime` со значениями через запятую: +Опция `--runtime` принимает одно или несколько значений через запятую: ```bash -benchos run --runtime=stable,dev,1.9.3 [FILE] +benchos run --runtime='stable,dev,1.9.3' [FILE] ``` +> CLI-опция `--runtime` имеет приоритет над аннотациями `&ИсполняющаяСреда` в коде. + Подробнее см. в разделе [CLI](CLI.md). +## Эталонная среда + +Среда, помеченная как эталонная, используется базой для расчёта колонок `Ratio` и `RatioSD` в отчёте. Она отображается со значением `Yes` в колонке `Baseline`. + +- Допускается только **одна** эталонная среда на бенчмарк. +- Если эталон не задан, колонки `Ratio`/`RatioSD` не выводятся. + +Подробнее см. в разделе [Эталоны](Эталоны.md). + ## Пример ```bsl @@ -79,8 +115,8 @@ benchos run --runtime=stable,dev,1.9.3 [FILE] &ИсполняющаяСреда("dev") &ИсполняющаяСреда( - Версия = "stable", - Наименование = "Стабильная", + Версия = "stable", + Наименование = "Стабильная", ЭтоЭталон = Истина ) Процедура ПриСозданииОбъекта() From a20ff56d66d677bfc9a0c419e1423a680f934e9f Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Sun, 8 Mar 2026 01:59:33 +0300 Subject: [PATCH 11/11] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\320\263\320\237\320\260\320\274\321\217\321\202\320\270.md" | 2 +- ...\320\260\320\236\321\202\321\207\320\265\321\202\320\260.md" | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git "a/docs/\320\234\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263\320\237\320\260\320\274\321\217\321\202\320\270.md" "b/docs/\320\234\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263\320\237\320\260\320\274\321\217\321\202\320\270.md" index f768633..7d5715d 100644 --- "a/docs/\320\234\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263\320\237\320\260\320\274\321\217\321\202\320\270.md" +++ "b/docs/\320\234\320\276\320\275\320\270\321\202\320\276\321\200\320\270\320\275\320\263\320\237\320\260\320\274\321\217\321\202\320\270.md" @@ -1,6 +1,6 @@ # Мониторинг памяти -Для анализа аллокаций предусмотрена аннотация `&МониторингПамяти`. +Включает дополнительный этап измерения аллокаций памяти. При его использовании в отчёте появляется колонка `Allocated` — объём памяти, выделяемый на одну операцию. Полезно для выявления избыточных аллокаций и сравнения алгоритмов по потреблению памяти. ### Конфигурирование diff --git "a/docs/\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260.md" "b/docs/\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260.md" index 97691f9..13f2d87 100644 --- "a/docs/\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260.md" +++ "b/docs/\320\241\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\272\320\260\320\236\321\202\321\207\320\265\321\202\320\260.md" @@ -1,5 +1,7 @@ # Сортировка отчета +По умолчанию строки в таблице отчёта следуют порядку объявления бенчмарков в классе. Для изменения порядка используйте одну из аннотаций или соответствующий метод API. + ## Конфигурирование ### Аннотации