diff --git a/README.md b/README.md index aa4b73b..9941e05 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ## Возможности -- **Гибкая настройка:** конфигурация тестов через аннотации или программный код. +- **Гибкая настройка:** конфигурация тестов через аннотации, программный код и CLI. - **Параметризованные тесты:** запуск одних и тех же тестов с разными входными данными. - **Мониторинг памяти:** отслеживание аллокации памяти во время выполнения. - **Метрики:** время выполнения (среднее, минимум, максимум), стандартное отклонение и ошибка, операций в секунду (Op/s), квартили и произвольные процентили. @@ -75,11 +75,9 @@ opm install benchmark **CLI:** ```bash -benchos run [FILE] +benchos run [OPTIONS] [FILE] ``` -`FILE` - имя файла класса бенчмарков в текущем каталоге, либо полный путь к нему - **API:** ```bsl @@ -89,7 +87,7 @@ benchos run [FILE] Результат = Бенчмаркинг.Запустить(Тип("КонкатенацияСтрок")); ``` -Более подробно можно почитать в [документации](docs/ЗапускБенчмарков.md). +Более подробно про запуск бенчмарков можно почитать в [документации](docs/ЗапускБенчмарков.md). ## 4. Просмотр результатов diff --git a/docs/CLI.md b/docs/CLI.md new file mode 100644 index 0000000..2ea8f00 --- /dev/null +++ b/docs/CLI.md @@ -0,0 +1,46 @@ +# CLI + +## Команда `run` + +Запускает бенчмарки по указанному файлу, имени класса или директории. + +```bash +benchos run [OPTIONS] [FILE] +``` + +### Опции + +| Опция | Описание | Пример | +| --- | --- | --- | +| `-r`, `--recursive` | Рекурсивный поиск в поддиректориях | | +| `--iterationCount` | Количество измерительных итераций | `--iterationCount 10 ` | +| `--iterationTime` | Минимальное время выполнения одной итерации (мс) | `--iterationTime 500` | +| `--warmupCount` | Количество прогревочных итераций | `--warmupCount 10` | +| `--invocationCount` | Количество вызовов метода за итерацию | `--invocationCount 100` | +| `-m`, `--memory` | Включить мониторинг использования памяти | | +| `-e`, `--exporters` | Форматы экспорта результатов (`md`, `json`, `xml`, `html`) | `-e json,xml` | +| `-a`, `--artifacts` | Каталог для сохранения результатов | `-a path/to/file` | +| `--throughput` | Стратегия выполнения [`ПропускнаяСпособность`](ВыборСтратегииЗапуска.md#пропускнаяспособность) | | +| `--coldstart` | Стратегия выполнения [`ХолодныйЗапуск`](ВыборСтратегииЗапуска.md#холодныйзапуск) | | + +## Примеры + +```bash +# Запуск по имени класса (файл МойКласс.os должен существовать в текущей директории) +benchos run МойКласс + +# Запуск по имени файла в текущей директории +benchos run МойКласс.os + +# Запуск по абсолютному пути +benchos run /path/to/МойКласс.os + +# Запуск всех бенчмарков в директории +benchos run /path/to/benchmarks + +# Запуск всех бенчмарков в директории, включая вложенные каталоги +benchos run -r /path/to/benchmarks + +# Рекурсивный запуск с мониторингом памяти и экспортом в JSON +benchos run -r -m -e json ./benchmarks/ +``` \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index fea540e..dd72e52 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,6 +11,7 @@ - [Статистика](Статистика.md) - [Сортировка отчета](СортировкаОтчета.md) - [Экспорт результатов](ЭкспортРезультатов.md) +- [CLI](CLI.md) - [Аннотации](../src/BenchmarkOneScript/annotations/Классы) ## Примеры 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 6b74cba..75a2a26 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" @@ -49,11 +49,9 @@ opm install benchmark **CLI:** ```bash -benchos run [FILE] +benchos run [OPTIONS] [FILE] ``` -`FILE` - имя файла класса бенчмарков в текущем каталоге, либо полный путь к нему - **API:** ```bsl @@ -63,7 +61,7 @@ benchos run [FILE] Результат = Бенчмаркинг.Запустить(Тип("КонкатенацияСтрок")); ``` -Более подробно можно почитать в [документации](ЗапускБенчмарков.md). +Более подробно про запуск бенчмарков можно почитать в [документации](ЗапускБенчмарков.md). ## 4. Просмотр результатов 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 936381d..3050708 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" @@ -3,12 +3,12 @@ ## CLI ```bash -benchos run [FILE] +benchos run [OPTIONS] [FILE] ``` -`FILE` - имя файла класса бенчмарков в текущем каталоге, либо полный путь к нему +Более подробно про CLI можно почитать в [документации](CLI.md). -**Примеры использования:** +### Примеры использования ```bash # Запуск по имени класса (файл МойКласс.os должен существовать в текущей директории) @@ -20,11 +20,14 @@ benchos run МойКласс.os # Запуск по абсолютному пути benchos run /path/to/МойКласс.os -# Запуск из каталога +# Запуск всех бенчмарков в директории benchos run /path/to/benchmarks -# Запуск из каталога, включая вложенные каталоги +# Запуск всех бенчмарков в директории, включая вложенные каталоги benchos run -r /path/to/benchmarks + +# Рекурсивный запуск с мониторингом памяти и экспортом в JSON +benchos run -r -m -e json ./benchmarks/ ``` ## API diff --git a/samples/api/README.md b/samples/api/README.md index 0e22d72..5c72462 100644 --- a/samples/api/README.md +++ b/samples/api/README.md @@ -6,7 +6,7 @@ oscript [FILE] `FILE` - путь к файлу примера. -Например: +Пример: ```bash oscript ./ЗапускБенчмарковПример.os diff --git "a/samples/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/README.md" "b/samples/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/README.md" index 816197d..003e3c1 100644 --- "a/samples/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/README.md" +++ "b/samples/benchmarks/\320\232\320\273\320\260\321\201\321\201\321\213/README.md" @@ -1,13 +1,17 @@ Примеры бенчмарков можно запустить в консоле командой: ```bash -benchos run [FILE] +benchos run [OPTIONS] [FILE] ``` -`FILE` - путь к файлу бенчмарка. +Более подробно можно почитать в [документации](../../../docs/CLI.md). -Например: +Примеры: ```bash +# Запуск конкретного класса с бенчмарками benchos run ./БенчмаркБазовый.os + +# Запуск всех бенчмарков в текущем каталоге +benchos run . ``` 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 73d596e..46ab201 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" @@ -4,48 +4,86 @@ #Использовать fs #Использовать logos -&Опция(Имя = "r recursive", Описание = "Искать бенчмарки во вложенных каталогах") +&Опция(Имя = "r recursive", Описание = "Рекурсивный поиск в поддиректориях") &Флаг &ПоУмолчанию(Ложь) -Перем Рекурсивно; +Перем _Рекурсивно; // Булево + +&Опция(Имя = "m memory", Описание = "Включить мониторинг использования памяти") +&Флаг +Перем _МониторингПамяти; // Булево + +&Опция(Имя = "iterationCount", Описание = "Количество измерительных итераций") +&ТЧисло +Перем _КоличествоИтераций; // Число + +&Опция(Имя = "iterationTime", Описание = "Минимальное время выполнения одной итерации в миллисекундах") +&ТЧисло +Перем _МинимальноеВремяИтерации; // Число + +&Опция(Имя = "warmupCount", Описание = "Количество прогревочных итераций") +&ТЧисло +Перем _КоличествоПрогревочныхИтераций; // Число + +&Опция(Имя = "invocationCount", Описание = "Количество вызовов метода за итерацию") +&ТЧисло +Перем _КоличествоВызововЗаИтерацию; // Число + +&Опция(Имя = "e exporters", Описание = "Форматы экспорта результатов (md, json, xml, html)") +&ТСтрока +Перем _Экспортеры; // Строка + +&Опция(Имя = "a artifacts", Описание = "Каталог для сохранения результатов") +&ТСтрока +Перем _КаталогАртефактов; // Строка + +&Опция(Имя = "coldstart", Описание = "Стратегия 'Холодный запуск'") +&ТБулево +Перем _ХолодныйЗапуск; // Булево, Неопределено + +&Опция(Имя = "throughput", Описание = "Стратегия 'Пропускная способность'") +&ТБулево +Перем _ПропускнаяСпособность; // Булево, Неопределено &Аргумент(Имя = "FILE", Описание = "Каталог, полный путь к файлу или имя файла в текущей директории") &ТСтрока -Перем ПутьКФайлу; +Перем _ПутьКФайлу; // Строка Перем _Лог; -&КомандаПриложения(Имя = "run", Описание = "Запускает бенчмарки") +&КомандаПриложения(Имя = "run", Описание = "Запуск бенчмарков") Процедура ПриСозданииОбъекта() КонецПроцедуры &ВыполнениеКоманды Процедура Запустить() Экспорт - - Если ФС.КаталогСуществует(ПутьКФайлу) Тогда - Бенчмаркинг.ЗапуститьИзКаталога(ПутьКФайлу, Рекурсивно); + + Если ФС.КаталогСуществует(_ПутьКФайлу) Тогда + Бенчмаркинг.ЗапуститьИзКаталога(_ПутьКФайлу, _Рекурсивно, Конфигурация()); Возврат; КонецЕсли; - Файл = ФайлКласса(); + Файл = ФайлСценария(); Если Файл = Неопределено Тогда - _Лог.Ошибка("Файл <%1> не существует", ПутьКФайлу); + _Лог.Ошибка("Файл <%1> не существует", _ПутьКФайлу); Возврат; КонецЕсли; Тип = Бенчмаркинг.ПодключитьКласс(Файл.ПолноеИмя); Если Не Тип = Неопределено Тогда - Бенчмаркинг.Запустить(Тип); + Конфигурация = Новый КонфигурацияБенчмарков(Тип); + Конфигурация.Объединить(Конфигурация()); + Бенчмаркинг.Запустить(Тип, Конфигурация); КонецЕсли; КонецПроцедуры -Функция ФайлКласса() +Функция ФайлСценария() ВариантыПутей = Новый Массив(); - ВариантыПутей.Добавить(ПутьКФайлу); - ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), ПутьКФайлу)); - ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), ПутьКФайлу + ".os")); + ВариантыПутей.Добавить(_ПутьКФайлу); + ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), _ПутьКФайлу)); + ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), _ПутьКФайлу + ".os")); Для Каждого Путь Из ВариантыПутей Цикл Файл = Новый Файл(Путь); @@ -56,4 +94,75 @@ КонецФункции +Функция Конфигурация() + + Конфигурация = Новый КонфигурацияБенчмарков(); + + Если _МониторингПамяти = Истина Тогда + Конфигурация.ДобавитьМониторингПамяти(); + КонецЕсли; + + Если ЭтоЧисло(_КоличествоИтераций) Тогда + Конфигурация.УстановитьКоличествоИтераций(_КоличествоИтераций); + КонецЕсли; + + Если ЭтоЧисло(_МинимальноеВремяИтерации) Тогда + Конфигурация.УстановитьМинимальноеВремяИтерации(_МинимальноеВремяИтерации); + КонецЕсли; + + Если ЭтоЧисло(_КоличествоПрогревочныхИтераций) Тогда + Конфигурация.УстановитьКоличествоПрогревочныхИтераций(_КоличествоПрогревочныхИтераций); + КонецЕсли; + + Если ЭтоЧисло(_КоличествоВызововЗаИтерацию) Тогда + Конфигурация.УстановитьКоличествоВызововЗаИтерацию(_КоличествоВызововЗаИтерацию); + КонецЕсли; + + Если ЗначениеЗаполнено(_КаталогАртефактов) Тогда + Конфигурация.УстановитьКаталогАртефактов(_КаталогАртефактов); + КонецЕсли; + + Если _ХолодныйЗапуск = Истина Тогда + Конфигурация.УстановитьСтратегию(СтратегииЗапускаБенчмарка.ХолодныйЗапуск); + КонецЕсли; + + Если _ПропускнаяСпособность = Истина Тогда + Конфигурация.УстановитьСтратегию(СтратегииЗапускаБенчмарка.ПропускнаяСпособность); + КонецЕсли; + + ПрочитатьЭкспортеры(Конфигурация); + + Возврат Конфигурация; + +КонецФункции + +Функция ЭтоЧисло(Значение) + Возврат ТипЗнч(Значение) = Тип("Число"); +КонецФункции + +Процедура ПрочитатьЭкспортеры(Конфигурация) + + Если Не ЗначениеЗаполнено(_Экспортеры) Тогда + Возврат; + КонецЕсли; + + ДопустимыеЗначения = Новый Соответствие(); + ДопустимыеЗначения.Вставить("markdown", "Markdown"); + ДопустимыеЗначения.Вставить("json", "Json"); + ДопустимыеЗначения.Вставить("xml", "Xml"); + ДопустимыеЗначения.Вставить("html", "Html"); + + Для Каждого Экспортер Из СтрРазделить(_Экспортеры, ", ", Ложь) Цикл + + Имя = ДопустимыеЗначения[НРег(Экспортер)]; + + ТекстОшибки = СтрШаблон("Неизвестный экспортер %1. Допустимые значения: markdown, json, xml, html", Экспортер); + Ожидаем.Что(Имя, ТекстОшибки).Заполнено(); + + Конфигурация.ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков[Имя]); + + КонецЦикла; + +КонецПроцедуры + _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.cli"); \ 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 cbb31c7..4f6a5eb 100644 --- "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" +++ "b/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\272\321\200\320\270\320\277\321\202\320\276\321\200\320\221\320\265\320\275\321\207\320\274\320\260\321\200\320\272\320\260.os" @@ -1,6 +1,6 @@ #Использовать delegate -Перем _Тип; // Тип - Тип класса бенчмарков +Перем _Тип; // Тип - Класс бенчмарков Перем _Метод; // Строка - Метод бенчмарка Перем _ЭтоЭталон; // Булево Перем _Категория; // Строка @@ -24,7 +24,7 @@ КонецПроцедуры -// Тип класса бенчмарков +// Класс бенчмарков // // Возвращаемое значение: // Тип 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 db6c3e0..b7df6ff 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" @@ -10,14 +10,14 @@ Перем _Хронометр; // Хронометр Перем _Лог; // Лог -// Запускатель бенчмарков +// Запускает бенчмарки // // Параметры: -// Источник - Тип - Тип класса бенчмарков +// Источник - Тип - Класс бенчмарков // - КоллекцияДескрипторовБенчмарков // - ДескрипторБенчмарка -// - Произвольный - Экземпляр класса бенчмарков -// Конфигурация - КонфигурацияБенчмарков - Конфигурация бенчмарков +// - Произвольный - Экземпляр класса с бенчмарками +// Конфигурация - КонфигурацияБенчмарков - Полностью заменяет текущую конфигурацию на переданную Процедура ПриСозданииОбъекта(Источник, Конфигурация = Неопределено) Инициализировать(Источник, Конфигурация); @@ -589,17 +589,21 @@ Процедура ЭкспортироватьРезультаты(РезультатыЗапусков) КаталогАртефактов = _Конфигурация.КаталогАртефактов(); - Если Не ЗначениеЗаполнено(КаталогАртефактов) Тогда + МаскаФайлов = СтрШаблон("%1-*", РезультатыЗапусков.ИмяКласса); + Экспортеры = _Конфигурация.Экспортеры(); + + Если Не ЗначениеЗаполнено(КаталогАртефактов) Или Экспортеры.Количество() = 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\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 5d6c864..120027a 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" @@ -3,21 +3,25 @@ Перем _Лог; // Лог Перем _Каталог; // Строка Перем _ИскатьВПодкаталогах; // Булево +Перем _Конфигурация; // КонфигурацияБенчмарков -// Запускает бенчмарки из каталога +// Запускает все бенчмарки, найденные в указанном каталоге // // Параметры: -// Каталог - Строка - Путь к каталогу -// ИскатьВПодкаталогах - Булево - Искать в подкаталогах -Процедура ПриСозданииОбъекта(Каталог, ИскатьВПодкаталогах = Ложь) +// Каталог - Строка - Путь к каталогу с бенчмарками +// ИскатьВПодкаталогах - Булево - Сканировать все вложенные каталоги +// Конфигурация - КонфигурацияБенчмарков - Конфигурация, которая с приоритетом будет объединена +// с каждой конфигурацией бенчмарка +Процедура ПриСозданииОбъекта(Каталог, ИскатьВПодкаталогах = Ложь, Конфигурация = Неопределено) _Каталог = Каталог; _ИскатьВПодкаталогах = ИскатьВПодкаталогах; + _Конфигурация = Конфигурация; _Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.ЗапускательБенчмарковИзКаталога"); КонецПроцедуры #Область ПрограммныйИнтерфейс -// Запускает бенчмарки из каталога +// Запускает все бенчмарки, найденные в указанном каталоге // // Возвращаемое значение: // ТаблицаЗначений: @@ -25,7 +29,7 @@ // * ИмяКласса - Строка - Имя класса // * ИмяФайла - Строка - Имя файла // * ПутьКФайлу - Строка - Путь к файлу сценария -// * Успешно - Булево - Запуск бенчмарков выполнен успешно +// * Успешно - Булево - Индикатор корректного выполнения Функция Запустить() Экспорт Результат = ТаблицаРезультата(); @@ -40,20 +44,25 @@ Для Каждого Файл Из Файлы Цикл - Объект = Бенчмаркинг.ПодключитьКласс(Файл.ПолноеИмя); - Если Объект = Неопределено Тогда + Тип = Бенчмаркинг.ПодключитьКласс(Файл.ПолноеИмя); + Если Тип = Неопределено Тогда Продолжить; КонецЕсли; СтрокаРезультата = Результат.Добавить(); - СтрокаРезультата.ИмяКласса = Строка(Тип(Объект)); + СтрокаРезультата.ИмяКласса = Строка(Тип); СтрокаРезультата.ПутьКФайлу = Файл.ПолноеИмя; СтрокаРезультата.ИмяФайла = Файл.ИмяБезРасширения; СтрокаРезультата.Результат = Неопределено; СтрокаРезультата.Успешно = Истина; + Конфигурация = Новый КонфигурацияБенчмарков(Тип); + Если Не _Конфигурация = Неопределено Тогда + Конфигурация.Объединить(_Конфигурация); + КонецЕсли; + Попытка - СтрокаРезультата.Результат = Бенчмаркинг.Запустить(Объект); + СтрокаРезультата.Результат = Бенчмаркинг.Запустить(Тип, Конфигурация); Исключение СтрокаРезультата.Успешно = Ложь; _Лог.Ошибка("Возникла ошибка при запуске бенчмарков класса <%1>: %2", diff --git "a/src/BenchmarkOneScript/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\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 075f8d1..35008c7 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" @@ -2,18 +2,30 @@ #Использовать delegate Перем _Стратегия; // см. СтратегииЗапускаБенчмарка +Перем _СтратегияПоУмолчанию; // см. СтратегииЗапускаБенчмарка Перем _КоличествоИтераций; // Число +Перем _КоличествоИтерацийПоУмолчанию; // Число Перем _КоличествоВызововЗаИтерацию; // Число +Перем _КоличествоВызововЗаИтерациюПоУмолчанию; // Число Перем _КоличествоПрогревочныхИтераций; // Число +Перем _КоличествоПрогревочныхИтерацийПоУмолчанию; // Число Перем _МинимальноеВремяИтерации; // Число - мс +Перем _МинимальноеВремяИтерацииПоУмолчанию; // Число - мс Перем _МинимальноеКоличествоВызововЗаИтерацию; // Число +Перем _МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию; // Число Перем _СортировкаОтчета; // см. СортировкиОтчетаБенчмарков +Перем _СортировкаОтчетаПоУмолчанию; // см. СортировкиОтчетаБенчмарков Перем _ТребуетсяМониторингПамяти; // Булево +Перем _ТребуетсяМониторингПамятиПоУмолчанию; // Булево +Перем _КаталогАртефактов; // Строка +Перем _КаталогАртефактовПоУмолчанию; // Строка Перем _Параметры; // Массив из ПараметрБенчмарка Перем _Обработчики; // Соответствие Перем _Колонки; // Массив из Строка - см. КолонкиОтчетаБенчмарков -Перем _КаталогАртефактов; // Строка -Перем _Экспортеры; // Массив из Объект +Перем _Экспортеры; // Массив из см. ЭкспортерыРезультатовБенчмарков + +Перем _МодифицированныеПоля; // Соответствие +Перем _Рефлектор; // Рефлектор, Неопределено // Конфигурация бенчмарков // @@ -21,26 +33,34 @@ // Источник - Тип, Произвольный - Тип или экземпляр класса бенчмарков Процедура ПриСозданииОбъекта(Источник = Неопределено) - КоличествоИтераций = 15; - КоличествоВызововЗаИтерацию = 0; - КоличествоПрогревочныхИтераций = 6; - МинимальноеВремяИтерации = 100; - МинимальноеКоличествоВызововЗаИтерацию = 4; - КаталогАртефактов = ".\BenchmarkArtifacts"; + _СтратегияПоУмолчанию = СтратегииЗапускаБенчмарка.ПропускнаяСпособность; + _КоличествоИтерацийПоУмолчанию = 15; + _КоличествоВызововЗаИтерациюПоУмолчанию = 0; + _КоличествоПрогревочныхИтерацийПоУмолчанию = 6; + _МинимальноеВремяИтерацииПоУмолчанию = 100; + _МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию = 4; + _СортировкаОтчетаПоУмолчанию = СортировкиОтчетаБенчмарков.ПоУмолчанию; + _КаталогАртефактовПоУмолчанию = ".\BenchmarkArtifacts"; + _ТребуетсяМониторингПамятиПоУмолчанию = Ложь; _Параметры = Новый Массив(); _Обработчики = Новый Соответствие(); _Колонки = Новый Массив(); _Экспортеры = Новый Массив(); - _ТребуетсяМониторингПамяти = Ложь; + _МодифицированныеПоля = Новый Соответствие(); - УстановитьСтратегию(СтратегииЗапускаБенчмарка.ПропускнаяСпособность); - УстановитьКоличествоИтераций(КоличествоИтераций); - УстановитьКоличествоВызововЗаИтерацию(КоличествоВызововЗаИтерацию); - УстановитьКоличествоПрогревочныхИтераций(КоличествоПрогревочныхИтераций); - УстановитьМинимальноеВремяИтерации(МинимальноеВремяИтерации); - УстановитьМинимальноеКоличествоВызововЗаИтерацию(МинимальноеКоличествоВызововЗаИтерацию); - УстановитьКаталогАртефактов(КаталогАртефактов); + _ТребуетсяМониторингПамяти = _ТребуетсяМониторингПамятиПоУмолчанию; + + УстановитьСтратегию(_СтратегияПоУмолчанию); + УстановитьКоличествоИтераций(_КоличествоИтерацийПоУмолчанию); + УстановитьКоличествоВызововЗаИтерацию(_КоличествоВызововЗаИтерациюПоУмолчанию); + УстановитьКоличествоПрогревочныхИтераций(_КоличествоПрогревочныхИтерацийПоУмолчанию); + УстановитьМинимальноеВремяИтерации(_МинимальноеВремяИтерацииПоУмолчанию); + УстановитьМинимальноеКоличествоВызововЗаИтерацию(_МинимальноеКоличествоВызововЗаИтерациюПоУмолчанию); + УстановитьСортировкуОтчета(_СортировкаОтчетаПоУмолчанию); + УстановитьКаталогАртефактов(_КаталогАртефактовПоУмолчанию); + + _МодифицированныеПоля.Очистить(); Если Не Источник = Неопределено Тогда ИзвлекательКонфигурацииБенчмарков.Извлечь(Источник, ЭтотОбъект); @@ -62,9 +82,11 @@ // ЭтотОбъект Функция УстановитьКоличествоИтераций(КоличествоИтераций) Экспорт + Ожидаем.Что(КоличествоИтераций, "Количество итераций").ИмеетТип("Число"); Ожидаем.Что(КоличествоИтераций, "Количество итераций не может быть меньше 1").Больше(0); _КоличествоИтераций = КоличествоИтераций; + УстановитьМодифицированность(ИмяПоля_КоличествоИтераций()); Возврат ЭтотОбъект; @@ -94,9 +116,11 @@ // ЭтотОбъект Функция УстановитьКоличествоВызововЗаИтерацию(КоличествоВызововЗаИтерацию) Экспорт + Ожидаем.Что(КоличествоВызововЗаИтерацию, "Количество вызовов за итерацию").ИмеетТип("Число"); Ожидаем.Что(КоличествоВызововЗаИтерацию, "Количество вызовов за итерацию не может быть меньше 0").БольшеИлиРавно(0); _КоличествоВызововЗаИтерацию = КоличествоВызововЗаИтерацию; + УстановитьМодифицированность(ИмяПоля_КоличествоВызововЗаИтерацию()); Возврат ЭтотОбъект; @@ -128,9 +152,13 @@ // ЭтотОбъект Функция УстановитьКоличествоПрогревочныхИтераций(КоличествоПрогревочныхИтераций) Экспорт - Ожидаем.Что(КоличествоПрогревочныхИтераций, "Количество прогревочных итераций не может быть меньше 0").БольшеИлиРавно(0); + Ожидаем.Что(КоличествоПрогревочныхИтераций, "Количество прогревочных итераций").ИмеетТип("Число"); + Ожидаем + .Что(КоличествоПрогревочныхИтераций, "Количество прогревочных итераций не может быть меньше 0") + .БольшеИлиРавно(0); _КоличествоПрогревочныхИтераций = КоличествоПрогревочныхИтераций; + УстановитьМодифицированность(ИмяПоля_КоличествоПрогревочныхИтераций()); Возврат ЭтотОбъект; @@ -148,8 +176,8 @@ // Устанавливает минимальное время выполнения одной итерации бенчмарка в миллисекундах // -// BenchmarkOneScript динамически подбирает количество вызовов за итерацию (см. АннотацияКоличествоВызововЗаИтерацию) так, -// чтобы одна итерация длилась не меньше указанного времени. +// BenchmarkOneScript динамически подбирает количество вызовов за итерацию (см. АннотацияКоличествоВызововЗаИтерацию) +// так, чтобы одна итерация длилась не меньше указанного времени. // Увеличивает стабильность замеров для коротких операций. // // Игнорируется для стратегии "ХолодныйЗапуск". @@ -161,9 +189,11 @@ // ЭтотОбъект Функция УстановитьМинимальноеВремяИтерации(МинимальноеВремяИтерации) Экспорт + Ожидаем.Что(МинимальноеВремяИтерации, "Минимальное время итерации").ИмеетТип("Число"); Ожидаем.Что(МинимальноеВремяИтерации, "Минимальное время итерации не может быть меньше 1 мс").Больше(0); _МинимальноеВремяИтерации = МинимальноеВремяИтерации; + УстановитьМодифицированность(ИмяПоля_МинимальноеВремяИтерации()); Возврат ЭтотОбъект; @@ -193,11 +223,13 @@ // ЭтотОбъект Функция УстановитьМинимальноеКоличествоВызововЗаИтерацию(МинимальноеКоличествоВызововЗаИтерацию) Экспорт + Ожидаем.Что(МинимальноеКоличествоВызововЗаИтерацию, "Минимальное количество вызовов за итерацию").ИмеетТип("Число"); Ожидаем .Что(МинимальноеКоличествоВызововЗаИтерацию, "Минимальное количество вызовов за итерацию не может быть меньше 1") .Больше(0); _МинимальноеКоличествоВызововЗаИтерацию = МинимальноеКоличествоВызововЗаИтерацию; + УстановитьМодифицированность(ИмяПоля_МинимальноеКоличествоВызововЗаИтерацию()); Возврат ЭтотОбъект; @@ -226,6 +258,7 @@ Функция УстановитьСтратегию(Стратегия) Экспорт _Стратегия = Стратегия; + УстановитьМодифицированность(ИмяПоля_Стратегия()); Возврат ЭтотОбъект; @@ -255,6 +288,7 @@ Функция ДобавитьПараметр(Имя, Значение) Экспорт _Параметры.Добавить(Новый ПараметрБенчмарка(Имя, Значение, Ложь)); + УстановитьМодифицированность(ИмяПоля_Параметры()); Возврат ЭтотОбъект; @@ -278,6 +312,7 @@ Функция ОчиститьПараметры() Экспорт _Параметры.Очистить(); + УстановитьМодифицированность(ИмяПоля_Параметры()); Возврат ЭтотОбъект; @@ -312,6 +347,7 @@ Функция УстановитьСортировкуОтчета(Сортировка) Экспорт _СортировкаОтчета = Сортировка; + УстановитьМодифицированность(ИмяПоля_СортировкаОтчета()); Возврат ЭтотОбъект; @@ -337,6 +373,7 @@ Функция ДобавитьМониторингПамяти() Экспорт _ТребуетсяМониторингПамяти = Истина; + УстановитьМодифицированность(ИмяПоля_ТребуетсяМониторингПамяти()); Возврат ЭтотОбъект; @@ -374,7 +411,8 @@ // ** ДескрипторыБенчмарков - КоллекцияДескрипторовБенчмарков // ** Конфигурация - КонфигурацияБенчмарков // ** СредаОкружения - СредаОкруженияБенчмарков -// ** РезультатыЗапусков - ТаблицаЗначений - см. ЗапускательБенчмарков.НоваяТаблицаРезультатовЗапусков +// ** РезультатыЗапусков - ТаблицаЗначений - +// см. ЗапускательБенчмарков.НоваяТаблицаРезультатовЗапусков // ** Отчет - ОтчетБенчмарков // // ПередКаждым - Вызывается перед каждым запуском бенчмарка. @@ -411,6 +449,7 @@ КонецЕсли; _Обработчики[ИмяСобытия][Обработчик] = Новый Структура("ЕстьПараметры"); + УстановитьМодифицированность(ИмяПоля_ОбработчикиСобытий()); Возврат ЭтотОбъект; @@ -433,6 +472,45 @@ КонецФункции +// Удаляет все обработчики всех событий +// +// Возвращаемое значение: +// ЭтотОбъект +Функция УдалитьОбработчикиСобытий() Экспорт + + _Обработчики.Очистить(); + УстановитьМодифицированность(ИмяПоля_ОбработчикиСобытий()); + + Возврат ЭтотОбъект; + +КонецФункции + +// Обработчики событий +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - см. СобытияБенчмарков +// * Значение - Массив из Строка - Массив экспортных методов экземпляра класса бенчмарков +// - Массив из Делегат - Массив делегатов +Функция ОбработчикиСобытий() Экспорт + + События = Новый Соответствие(); + + Для Каждого ОбработчикиСобытия Из _Обработчики Цикл + + Обработчики = Новый Массив(); + Для Каждого ОбработчикСобытия Из ОбработчикиСобытия.Значение Цикл + Обработчики.Добавить(ОбработчикСобытия.Ключ); + КонецЦикла; + + События[ОбработчикиСобытия.Ключ] = Обработчики; + + КонецЦикла; + + Возврат События; + +КонецФункции + // Делегаты обработчиков по имени события // // Параметры: @@ -487,6 +565,8 @@ _Колонки.Добавить(Колонка); КонецЕсли; + УстановитьМодифицированность(ИмяПоля_Колонки()); + Возврат ЭтотОбъект; КонецФункции @@ -509,6 +589,19 @@ КонецФункции +// Удаляет все добавленные колонки отчета +// +// Возвращаемое значение: +// ЭтотОбъект +Функция УдалитьКолонки() Экспорт + + _Колонки.Очистить(); + УстановитьМодифицированность(ИмяПоля_Колонки()); + + Возврат ЭтотОбъект; + +КонецФункции + // Добавленные колонки отчета // // Возвращаемое значение: @@ -533,16 +626,12 @@ // Возвращаемое значение: // ЭтотОбъект Функция УстановитьКаталогАртефактов(КаталогАртефактов) Экспорт + _КаталогАртефактов = КаталогАртефактов; + УстановитьМодифицированность(ИмяПоля_КаталогАртефактов()); + Возврат ЭтотОбъект; -КонецФункции -// Экспортеры -// -// Возвращаемое значение: -// Массив из см. ЭкспортерыРезультатовБенчмарков -Функция Экспортеры() Экспорт - Возврат Новый Массив(Новый ФиксированныйМассив(_Экспортеры)); КонецФункции // Добавляет экспортер @@ -553,8 +642,20 @@ // Возвращаемое значение: // ЭтотОбъект Функция ДобавитьЭкспортер(Экспортер) Экспорт + _Экспортеры.Добавить(Экспортер); + УстановитьМодифицированность(ИмяПоля_Экспортеры()); + Возврат ЭтотОбъект; + +КонецФункции + +// Экспортеры +// +// Возвращаемое значение: +// Массив из см. ЭкспортерыРезультатовБенчмарков +Функция Экспортеры() Экспорт + Возврат Новый Массив(Новый ФиксированныйМассив(_Экспортеры)); КонецФункции // Сброс всех экспортеров @@ -562,8 +663,116 @@ // Возвращаемое значение: // ЭтотОбъект Функция УдалитьЭкспортеры() Экспорт + _Экспортеры.Очистить(); + УстановитьМодифицированность(ИмяПоля_Экспортеры()); + + Возврат ЭтотОбъект; + +КонецФункции + +// Объединяет переданную конфигурацию с текущей конфигурацию +// +// Параметры: +// Конфигурация - КонфигурацияБенчмарков +// +// Возвращаемое значение: +// ЭтотОбъект +Функция Объединить(Конфигурация) Экспорт + + ТаблицаКонфигурации = Конфигурация.ВТаблицу(); + ЗначенияМодифицированныхПолей = Новый Соответствие(); + + Для Каждого Строка Из ТаблицаКонфигурации Цикл + Если Строка.Модифицирован Тогда + ЗначенияМодифицированныхПолей.Вставить(Строка.Имя, Строка.Значение); + КонецЕсли; + КонецЦикла; + + ПрименитьМодифицированноеПоле( + ИмяПоля_Стратегия(), + "УстановитьСтратегию", + ЗначенияМодифицированныхПолей); + + ПрименитьМодифицированноеПоле( + ИмяПоля_КоличествоИтераций(), + "УстановитьКоличествоИтераций", + ЗначенияМодифицированныхПолей); + + ПрименитьМодифицированноеПоле( + ИмяПоля_КоличествоВызововЗаИтерацию(), + "УстановитьКоличествоВызововЗаИтерацию", + ЗначенияМодифицированныхПолей); + + ПрименитьМодифицированноеПоле( + ИмяПоля_КоличествоПрогревочныхИтераций(), + "УстановитьКоличествоПрогревочныхИтераций", + ЗначенияМодифицированныхПолей); + + ПрименитьМодифицированноеПоле( + ИмяПоля_МинимальноеВремяИтерации(), + "УстановитьМинимальноеВремяИтерации", + ЗначенияМодифицированныхПолей); + + ПрименитьМодифицированноеПоле( + ИмяПоля_МинимальноеКоличествоВызововЗаИтерацию(), + "УстановитьМинимальноеКоличествоВызововЗаИтерацию", + ЗначенияМодифицированныхПолей); + + ПрименитьМодифицированноеПоле( + ИмяПоля_СортировкаОтчета(), + "УстановитьСортировкуОтчета", + ЗначенияМодифицированныхПолей); + + ПрименитьМодифицированноеПоле( + ИмяПоля_КаталогАртефактов(), + "УстановитьКаталогАртефактов", + ЗначенияМодифицированныхПолей); + + Если ЗначенияМодифицированныхПолей[ИмяПоля_ТребуетсяМониторингПамяти()] = Истина Тогда + ДобавитьМониторингПамяти(); + КонецЕсли; + + ПрименитьМодифицированныеПараметры(ЗначенияМодифицированныхПолей); + ПрименитьМодифицированныеОбработчикиСобытий(ЗначенияМодифицированныхПолей); + ПрименитьМодифицированныеКолонки(ЗначенияМодифицированныхПолей); + ПрименитьМодифицированныеЭкспортеры(ЗначенияМодифицированныхПолей); + Возврат ЭтотОбъект; + +КонецФункции + +// Конвертация объекта конфигурации в таблицу значений +// +// Возвращаемое значение: +// ТаблицаЗначение: +// * Имя - Строка - Имя поля +// * Значение - Произвольный - Значение поля +// * Модифицирован - Булево - Индикатор модифицированности поля +Функция ВТаблицу() Экспорт + + Таблица = Новый ТаблицаЗначений(); + Таблица.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка")); + Таблица.Колонки.Добавить("Значение"); + Таблица.Колонки.Добавить("Модифицирован", Новый ОписаниеТипов("Булево")); + + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Стратегия(), Стратегия()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоИтераций(), КоличествоИтераций()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоВызововЗаИтерацию(), КоличествоВызововЗаИтерацию()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КоличествоПрогревочныхИтераций(), КоличествоПрогревочныхИтераций()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_МинимальноеВремяИтерации(), МинимальноеВремяИтерации()); + ДобавитьСтрокуВТаблицу( + Таблица, ИмяПоля_МинимальноеКоличествоВызововЗаИтерацию(), МинимальноеКоличествоВызововЗаИтерацию()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_СортировкаОтчета(), СортировкаОтчета()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_КаталогАртефактов(), КаталогАртефактов()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ТребуетсяМониторингПамяти(), ТребуетсяМониторингПамяти()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Параметры(), Параметры()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_ОбработчикиСобытий(), ОбработчикиСобытий()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Колонки(), Колонки()); + ДобавитьСтрокуВТаблицу(Таблица, ИмяПоля_Экспортеры(), Экспортеры()); + + Возврат Таблица; + КонецФункции #КонецОбласти @@ -580,6 +789,85 @@ КонецФункции +Процедура УстановитьМодифицированность(ИмяПоля_) + _МодифицированныеПоля[ИмяПоля_] = Истина; +КонецПроцедуры + +Процедура ПрименитьМодифицированноеПоле(ИмяПоля, МетодУстановки, ЗначенияМодифицированныхПолей) + + Если _Рефлектор = Неопределено Тогда + _Рефлектор = Новый Рефлектор(); + КонецЕсли; + + Если Не ЗначенияМодифицированныхПолей[ИмяПоля] = Неопределено Тогда + + Параметры = Новый Массив(); + Параметры.Добавить(ЗначенияМодифицированныхПолей[ИмяПоля]); + + _Рефлектор.ВызватьМетод(ЭтотОбъект, МетодУстановки, Параметры); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПрименитьМодифицированныеЭкспортеры(ЗначенияМодифицированныхПолей) + + Если ЗначенияМодифицированныхПолей[ИмяПоля_Экспортеры()] = Неопределено Тогда + Возврат; + КонецЕсли; + + УдалитьЭкспортеры(); + + Для Каждого Экспортер Из ЗначенияМодифицированныхПолей[ИмяПоля_Экспортеры()] Цикл + ДобавитьЭкспортер(Экспортер); + КонецЦикла; + +КонецПроцедуры + +Процедура ПрименитьМодифицированныеКолонки(ЗначенияМодифицированныхПолей) + + Если ЗначенияМодифицированныхПолей[ИмяПоля_Колонки()] = Неопределено Тогда + Возврат; + КонецЕсли; + + УдалитьКолонки(); + + Для Каждого Колонка Из ЗначенияМодифицированныхПолей[ИмяПоля_Колонки()] Цикл + ДобавитьКолонку(Колонка); + КонецЦикла; + +КонецПроцедуры + +Процедура ПрименитьМодифицированныеОбработчикиСобытий(ЗначенияМодифицированныхПолей) + + Если ЗначенияМодифицированныхПолей[ИмяПоля_ОбработчикиСобытий()] = Неопределено Тогда + Возврат; + КонецЕсли; + + УдалитьОбработчикиСобытий(); + + Для Каждого СтрокаСобытия Из ЗначенияМодифицированныхПолей[ИмяПоля_ОбработчикиСобытий()] Цикл + Для Каждого Обработчик Из СтрокаСобытия.Значение Цикл + ДобавитьОбработчикСобытия(СтрокаСобытия.Ключ, Обработчик); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +Процедура ПрименитьМодифицированныеПараметры(ЗначенияМодифицированныхПолей) + + Если ЗначенияМодифицированныхПолей[ИмяПоля_Параметры()] = Неопределено Тогда + Возврат; + КонецЕсли; + + ОчиститьПараметры(); + + Для Каждого Параметр Из ЗначенияМодифицированныхПолей[ИмяПоля_Параметры()] Цикл + ДобавитьПараметр(Параметр.Имя, Параметр.Значение); + КонецЦикла; + +КонецПроцедуры + Функция ЕстьПараметрыМетода(Делегат) РефлекторОбъекта = Новый РефлекторОбъекта(Делегат.Объект()); @@ -590,4 +878,71 @@ КонецФункции +Функция ДобавитьСтрокуВТаблицу(Таблица, Имя, Значение) Экспорт + + Строка = Таблица.Добавить(); + Строка.Имя = Имя; + Строка.Значение = Значение; + Строка.Модифицирован = _МодифицированныеПоля[Имя]; + + Возврат Строка; + +КонецФункции + +#Область ИменаПолей + +Функция ИмяПоля_Стратегия() + Возврат "Стратегия"; +КонецФункции + +Функция ИмяПоля_КоличествоИтераций() + Возврат "КоличествоИтераций"; +КонецФункции + +Функция ИмяПоля_КоличествоВызововЗаИтерацию() + Возврат "КоличествоВызововЗаИтерацию"; +КонецФункции + +Функция ИмяПоля_КоличествоПрогревочныхИтераций() + Возврат "КоличествоПрогревочныхИтераций"; +КонецФункции + +Функция ИмяПоля_МинимальноеВремяИтерации() + Возврат "МинимальноеВремяИтерации"; +КонецФункции + +Функция ИмяПоля_МинимальноеКоличествоВызововЗаИтерацию() + Возврат "МинимальноеКоличествоВызововЗаИтерацию"; +КонецФункции + +Функция ИмяПоля_СортировкаОтчета() + Возврат "СортировкаОтчета"; +КонецФункции + +Функция ИмяПоля_КаталогАртефактов() + Возврат "КаталогАртефактов"; +КонецФункции + +Функция ИмяПоля_ТребуетсяМониторингПамяти() + Возврат "ТребуетсяМониторингПамяти"; +КонецФункции + +Функция ИмяПоля_Параметры() + Возврат "Параметры"; +КонецФункции + +Функция ИмяПоля_ОбработчикиСобытий() + Возврат "ОбработчикиСобытий"; +КонецФункции + +Функция ИмяПоля_Колонки() + Возврат "Колонки"; +КонецФункции + +Функция ИмяПоля_Экспортеры() + Возврат "Экспортеры"; +КонецФункции + +#КонецОбласти + #КонецОбласти \ 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 1f1cb0b..63a9318 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,7 +8,7 @@ // Запускает бенчмарки // // Параметры: -// Источник - Тип - Тип класса бенчмарков +// Источник - Тип - Класс бенчмарков // - КоллекцияДескрипторовБенчмарков // - ДескрипторБенчмарка // - Произвольный - Экземпляр класса бенчмарков @@ -41,11 +41,13 @@ КонецФункции -// Запускает бенчмарки из каталога +// Запускает все бенчмарки, найденные в указанном каталоге // // Параметры: -// Каталог - Строка - Путь к каталогу -// ИскатьВПодкаталогах - Булево - Искать в подкаталогах +// Каталог - Строка - Путь к каталогу с бенчмарками +// ИскатьВПодкаталогах - Булево - Сканировать все вложенные каталоги +// Конфигурация - КонфигурацияБенчмарков - Конфигурация, которая с приоритетом будет объединена +// с каждой конфигурацией бенчмарка // // Возвращаемое значение: // ТаблицаЗначений: @@ -53,10 +55,10 @@ // * ИмяКласса - Строка - Имя класса // * ИмяФайла - Строка - Имя файла // * ПутьКФайлу - Строка - Путь к файлу сценария -// * Успешно - Булево - Запуск бенчмарков выполнен успешно -Функция ЗапуститьИзКаталога(Каталог, ИскатьВПодкаталогах = Ложь) Экспорт +// * Успешно - Булево - Индикатор корректного выполнения +Функция ЗапуститьИзКаталога(Каталог, ИскатьВПодкаталогах = Ложь, Конфигурация = Неопределено) Экспорт - ЗапускательБенчмарковИзКаталога = Новый ЗапускательБенчмарковИзКаталога(Каталог, ИскатьВПодкаталогах); + ЗапускательБенчмарковИзКаталога = Новый ЗапускательБенчмарковИзКаталога(Каталог, ИскатьВПодкаталогах, Конфигурация); Возврат ЗапускательБенчмарковИзКаталога.Запустить(); КонецФункции @@ -71,7 +73,7 @@ // ПутьКФайлу - Строка - Путь к файлу класса бенчмарков // // Возвращаемое значение: -// Произвольный, Неопределено +// Тип, Неопределено Функция ПодключитьКласс(ПутьКФайлу) Экспорт Объект = Неопределено; @@ -83,13 +85,13 @@ Попытка ПодключитьСценарий(ПутьКФайлу, ИмяКласса); - Объект = Новый(ИмяКласса); + Тип = Тип(ИмяКласса); Исключение _Лог.Ошибка("Не удалось подключить сценарий бенчмарков <%1> по причине: %2", ПутьКФайлу, ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; - ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Объект); + ДескрипторыБенчмарков = Новый КоллекцияДескрипторовБенчмарков(Тип); Если ДескрипторыБенчмарков.Количество() = 0 Тогда _Лог.Предупреждение("Класс <%1> не содержит бенчмарков", ИмяКласса); Возврат Неопределено; @@ -97,7 +99,7 @@ _Лог.Отладка("Найдено бенчмарков в классе <%1>: %2 шт.", ИмяКласса, ДескрипторыБенчмарков.Количество()); - Возврат Объект; + Возврат Тип; КонецФункции 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 c23530c..e210a6f 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" @@ -20,6 +20,7 @@ Процедура Тест_ЗапускБенчмарковИзКаталога() Экспорт Каталог = "./tests/fixtures/Классы/БенчмаркиЧерезКаталог"; + Результат = Бенчмаркинг.ЗапуститьИзКаталога(Каталог); Ожидаем.Что(Результат).ИмеетДлину(2); @@ -32,6 +33,7 @@ Процедура Тест_ЗапускБенчмарковИзКаталогаРекурсивно() Экспорт Каталог = "./tests/fixtures/Классы/БенчмаркиЧерезКаталог"; + Результат = Бенчмаркинг.ЗапуститьИзКаталога(Каталог, Истина); Ожидаем.Что(Результат).ИмеетДлину(3); @@ -45,6 +47,7 @@ Процедура Тест_ЗапускБенчмарковИзНесуществующегоКаталога() Экспорт Каталог = "./tests/fixtures/Классы/НесуществующийКаталог"; + Результат = Бенчмаркинг.ЗапуститьИзКаталога(Каталог); Ожидаем.Что(Результат).ИмеетДлину(0); @@ -55,6 +58,7 @@ Процедура Тест_ЗапускБенчмарковСОшибкой() Экспорт Каталог = "./tests/fixtures/Классы/БенчмаркиСОшибкой"; + Результат = Бенчмаркинг.ЗапуститьИзКаталога(Каталог); Ожидаем.Что(Результат).ИмеетДлину(2); @@ -64,12 +68,13 @@ КонецПроцедуры &Тест -Процедура Тест_ПодключениеКлассаБенчмарков() Экспорт +Процедура Тест_ПодключениеНесуществующегоКлассаБенчмарков() Экспорт ПутьКФайлу = "./tests/fixtures/Классы/БенчмаркНесуществующий.os"; - Объект = Бенчмаркинг.ПодключитьКласс(ПутьКФайлу); - Ожидаем.Что(Объект).ЭтоНеопределено(); + Тип = Бенчмаркинг.ПодключитьКласс(ПутьКФайлу); + + Ожидаем.Что(Тип).ЭтоНеопределено(); КонецПроцедуры @@ -77,9 +82,10 @@ Процедура Тест_ПодключениеКлассаБенчмарковБезБенчмарков() Экспорт ПутьКФайлу = "./tests/fixtures/Классы/БенчмаркБезБенчмарков.os"; - Объект = Бенчмаркинг.ПодключитьКласс(ПутьКФайлу); - Ожидаем.Что(Объект).ЭтоНеопределено(); + Тип = Бенчмаркинг.ПодключитьКласс(ПутьКФайлу); + + Ожидаем.Что(Тип).ЭтоНеопределено(); КонецПроцедуры @@ -638,4 +644,18 @@ Ожидаем.Что(Текст).Равно(ТекстЭталон); +КонецПроцедуры + +&Тест +Процедура Тест_ДолженПроверитьПередачуКонфигурацииПриЗапускеИзКаталога() Экспорт + + Каталог = "./tests/fixtures/Классы/БенчмаркиЧерезКаталог"; + Конфигурация = Новый КонфигурацияБенчмарков() + .УстановитьКоличествоИтераций(2); + + Результат = Бенчмаркинг.ЗапуститьИзКаталога(Каталог, , Конфигурация); + + Ожидаем.Что(Результат, "Результат").Заполнено(); + Ожидаем.Что(Результат[0].Результат.Конфигурация.КоличествоИтераций()).Равно(2); + КонецПроцедуры \ No newline at end of file diff --git "a/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" "b/tests/\320\242\320\265\321\201\321\202\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.os" index 4d781d3..43c8691 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" @@ -603,4 +603,102 @@ Ожидаем.Что(Конфигурация.Экспортеры()).ИмеетДлину(0); +КонецПроцедуры + +&Тест +Процедура Тест_ОбъединениеКонфигурацииПустойСПолностьюЗаполненной() Экспорт + + ПередаваемаяКонфигурация = Новый КонфигурацияБенчмарков() + .УстановитьСтратегию(СтратегииЗапускаБенчмарка.ХолодныйЗапуск) + .УстановитьКоличествоИтераций(111) + .УстановитьКоличествоВызововЗаИтерацию(111) + .УстановитьКоличествоПрогревочныхИтераций(111) + .УстановитьМинимальноеВремяИтерации(111) + .УстановитьМинимальноеКоличествоВызововЗаИтерацию(111) + .УстановитьСортировкуОтчета(СортировкиОтчетаБенчмарков.ОтБыстрыхКМедленным) + .УстановитьКаталогАртефактов("path") + .ДобавитьМониторингПамяти() + .ДобавитьПараметр("col1", 111) + .ДобавитьПараметр("col2", 222) + .ДобавитьОбработчикСобытия(СобытияБенчмарков.ПередВсеми, "Обработчик1") + .ДобавитьОбработчикСобытия(СобытияБенчмарков.ПослеКаждого, "Обработчик2") + .ДобавитьОбработчикСобытия(СобытияБенчмарков.ПослеКаждого, "Обработчик3") + .ДобавитьКолонку(КолонкиОтчетаБенчмарков.НижнийКвартиль) + .ДобавитьКолонку(КолонкиОтчетаБенчмарков.ВерхнийКвартиль) + .ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Json) + .ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Html); + + НоваяКонфигурация = Новый КонфигурацияБенчмарков() + .Объединить(ПередаваемаяКонфигурация); + + ОбработчикиСобытий = НоваяКонфигурация.ОбработчикиСобытий(); + + Ожидаем.Что(НоваяКонфигурация.Стратегия(), "Стратегия").Равно(СтратегииЗапускаБенчмарка.ХолодныйЗапуск); + Ожидаем.Что(НоваяКонфигурация.КоличествоИтераций(), "Количество итераций").Равно(111); + Ожидаем.Что(НоваяКонфигурация.КоличествоВызововЗаИтерацию(), "Количество вызовов за итерацию").Равно(111); + Ожидаем.Что(НоваяКонфигурация.КоличествоПрогревочныхИтераций(), "Количество прогревочных итераций").Равно(111); + Ожидаем.Что(НоваяКонфигурация.МинимальноеВремяИтерации(), "Минимальное время итерации").Равно(111); + Ожидаем.Что(НоваяКонфигурация.МинимальноеКоличествоВызововЗаИтерацию(), "Минимальное количество вызовов за итерацию").Равно(111); + Ожидаем.Что(НоваяКонфигурация.СортировкаОтчета(), "Сортировка отчета").Равно(СортировкиОтчетаБенчмарков.ОтБыстрыхКМедленным); + Ожидаем.Что(НоваяКонфигурация.Параметры()[0].Имя, "Параметры").Равно("col1"); + Ожидаем.Что(НоваяКонфигурация.Параметры()[1].Имя, "Параметры").Равно("col2"); + Ожидаем.Что(ОбработчикиСобытий[СобытияБенчмарков.ПередВсеми], "Обработчики событий").Содержит("Обработчик1"); + Ожидаем.Что(ОбработчикиСобытий[СобытияБенчмарков.ПослеКаждого], "Обработчики событий").Содержит("Обработчик2"); + Ожидаем.Что(ОбработчикиСобытий[СобытияБенчмарков.ПослеКаждого], "Обработчики событий").Содержит("Обработчик3"); + Ожидаем.Что(НоваяКонфигурация.Колонки(), "Колонки").Содержит(КолонкиОтчетаБенчмарков.НижнийКвартиль); + Ожидаем.Что(НоваяКонфигурация.Колонки(), "Колонки").Содержит(КолонкиОтчетаБенчмарков.ВерхнийКвартиль); + Ожидаем.Что(НоваяКонфигурация.Экспортеры(), "Экспортеры").Содержит(ЭкспортерыРезультатовБенчмарков.Json); + Ожидаем.Что(НоваяКонфигурация.Экспортеры(), "Экспортеры").Содержит(ЭкспортерыРезультатовБенчмарков.Html); + +КонецПроцедуры + +&Тест +Процедура Тест_ОбъединениеЗаполненныхКонфигураций() Экспорт + + КонфигурацияПриемник = Новый КонфигурацияБенчмарков() + .УстановитьКоличествоИтераций(111) + .УстановитьКоличествоВызововЗаИтерацию(111) + .ДобавитьКолонку(КолонкиОтчетаБенчмарков.НижнийКвартиль) + .ДобавитьОбработчикСобытия(СобытияБенчмарков.ПередВсеми, "Обработчик1"); + + КонфигурацияИсточник = Новый КонфигурацияБенчмарков() + .УстановитьКоличествоИтераций(222) + .ДобавитьКолонку(КолонкиОтчетаБенчмарков.ВерхнийКвартиль) + .ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков.Html) + .ДобавитьОбработчикСобытия(СобытияБенчмарков.ПослеВсех, "Обработчик2"); + + КонфигурацияПриемник.Объединить(КонфигурацияИсточник); + ОбработчикиСобытий = КонфигурацияПриемник.ОбработчикиСобытий(); + + Ожидаем.Что(КонфигурацияПриемник.КоличествоИтераций(), "Количество итераций").Равно(222); + Ожидаем.Что(КонфигурацияПриемник.КоличествоВызововЗаИтерацию(), "Количество вызовов за итерацию").Равно(111); + Ожидаем.Что(КонфигурацияПриемник.КоличествоПрогревочныхИтераций(), "Количество прогревочных итераций").Равно(6); + Ожидаем.Что(КонфигурацияПриемник.Колонки(), "Колонки").ИмеетДлину(1); + Ожидаем.Что(КонфигурацияПриемник.Колонки(), "Колонки").Содержит(КолонкиОтчетаБенчмарков.ВерхнийКвартиль); + Ожидаем.Что(КонфигурацияПриемник.Экспортеры(), "Экспортеры").Содержит(ЭкспортерыРезультатовБенчмарков.Html); + Ожидаем.Что(ОбработчикиСобытий[СобытияБенчмарков.ПередВсеми], "Обработчики событий").ЭтоНеопределено(); + Ожидаем.Что(ОбработчикиСобытий[СобытияБенчмарков.ПослеВсех], "Обработчики событий").Содержит("Обработчик2"); + +КонецПроцедуры + +&Тест +Процедура Тест_ОбъединениеКонфигурацийНаДефолтноеЗначение() Экспорт + + КоличествоИтерацийПоУмолчанию = 15; + + КонфигурацияПриемник = Новый КонфигурацияБенчмарков() + .УстановитьКоличествоИтераций(111) + .УстановитьКоличествоВызововЗаИтерацию(111) + .УстановитьСтратегию(СтратегииЗапускаБенчмарка.ХолодныйЗапуск); + + КонфигурацияИсточник = Новый КонфигурацияБенчмарков() + .УстановитьКоличествоИтераций(КоличествоИтерацийПоУмолчанию) + .УстановитьСтратегию(СтратегииЗапускаБенчмарка.ПропускнаяСпособность); + + КонфигурацияПриемник.Объединить(КонфигурацияИсточник); + + Ожидаем.Что(КонфигурацияПриемник.КоличествоИтераций(), "Количество итераций").Равно(КоличествоИтерацийПоУмолчанию); + Ожидаем.Что(КонфигурацияПриемник.КоличествоВызововЗаИтерацию(), "Количество вызовов за итерацию").Равно(111); + Ожидаем.Что(КонфигурацияПриемник.Стратегия(), "Стратегия").Равно(СтратегииЗапускаБенчмарка.ПропускнаяСпособность); + КонецПроцедуры \ No newline at end of file