Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,8 @@ oscript_modules/

.vs/

# Git
.worktrees/

# Benchmark
BenchmarkArtifacts/
BenchmarkArtifacts/
1 change: 1 addition & 0 deletions docs/CLI.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ benchos run [OPTIONS] [FILE]
- если передан каталог, CLI ищет в нем файлы `*.os`, а с опцией `-r` делает это рекурсивно;
- если явно передан `.os`-файл без методов с `&Бенчмарк`, CLI считает, что в файле в сценарии расположен один алгоритм;
- если передано несколько `.os`-файлов без методов с аннотацией `&Бенчмарк`, каждый из них запускается отдельно, а результаты объединяются в один общий отчет;
- файл `oscript.cfg`, расположенный рядом с файлом бенчмарка, используется для подключения его зависимостей и отдельного запуска;
- при запуске каталога ожидаются обычные файлы бенчмарков с аннотациями.

### Опции
Expand Down
21 changes: 21 additions & 0 deletions docs/ЗапускБенчмарков.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,27 @@ benchos run -r ./benchmarks
- при запуске каталога ожидаются обычные файлы бенчмарков с аннотациями;
- автозапуск файлов без `&Бенчмарк` для каталога не применяется.

### Локальные зависимости

Команда `benchos run` учитывает файлы `oscript.cfg`, расположенные непосредственно
рядом с файлами бенчмарков. Это позволяет подключать зависимости бенчмарка из
локальных каталогов, в том числе когда команда запускается из другого каталога.

При первичном подключении бенчмарков из найденных файлов конфигурации используются
параметры `lib.system` и `lib.additional`. Если файлов конфигурации несколько, пути
к библиотекам учитываются в порядке переданных файлов и найденных бенчмарков.

Для изолированного запуска каждого бенчмарка применяются все параметры из файла
`oscript.cfg`, расположенного рядом именно с этим бенчмарком. Его настройки имеют
приоритет над настройками из текущего каталога и каталога программы. Пути из
`lib.system` и `lib.additional` объединяются от локальных к глобальным, а
относительные пути разрешаются относительно каталога соответствующего
`oscript.cfg`.

То же правило действует для явно переданного `.os`-файла без аннотаций
`&Бенчмарк`: его локальная конфигурация сохраняется при подготовке временного
файла для запуска.

### Примеры

```bash
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkOneScript/cmd/main.os
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
#Использовать "."

Поделка = Новый Поделка();
Поделка.ЗапуститьПриложение();
Поделка.ЗапуститьПриложение();
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
Перем _ПутьКТочкеВходаПриложения; // Строка, Неопределено

#Область ОбработчикиСобытий

// Инициализирует запускатель приложения с конфигурациями OneScript.
// Точка входа определяется по расположению сценария класса при подготовке повторного запуска.
Процедура ПриСозданииОбъекта()

_ПутьКТочкеВходаПриложения = Неопределено;

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

#КонецОбласти

#Область ПрограммныйИнтерфейс

// Перезапускает приложение с указанными файлами конфигурации OneScript.
//
// Параметры:
// ФайлыКонфигурацииOneScript - Массив из Строка - Пути к файлам oscript.cfg
// в порядке убывания приоритета
//
// Возвращаемое значение:
// Число, Неопределено - Код возврата дочернего процесса или Неопределено,
// если повторный запуск не требуется
Функция ПерезапуститьСКонфигурацией(ФайлыКонфигурацииOneScript) Экспорт

Если ПолучитьПеременнуюСреды("BENCHOS_OSCRIPT_CONFIG_APPLIED") = "1" Тогда
Возврат Неопределено;
КонецЕсли;

Если Не ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript) Тогда
Возврат Неопределено;
КонецЕсли;

Возврат ЗапуститьСКонфигурацией(ФайлыКонфигурацииOneScript);

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ТребуетсяПерезапуск(ФайлыКонфигурацииOneScript)

Если ФайлыКонфигурацииOneScript.Количество() > 0 Тогда
Возврат Истина;
КонецЕсли;

ТекущаяКонфигурация = Новый Файл(ОбъединитьПути(ТекущийКаталог(), "oscript.cfg"));
Возврат ТекущаяКонфигурация.Существует() И ТекущаяКонфигурация.ЭтоФайл();

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

Функция ЗапуститьСКонфигурацией(ФайлыКонфигурацииOneScript)

ПутьКТочкеВхода = ПутьКТочкеВходаПриложения();
МенеджерПараметров = Новый МенеджерПараметровКонфигурацииOneScript(ФайлыКонфигурацииOneScript);
ПараметрыКонфигурацииOneScript = ПараметрыКонфигурацииДляПеременнойСреды(МенеджерПараметров.Прочитать());

Процесс = СоздатьИЗапуститьПроцесс(
ПутьКТочкеВхода,
ТекущийКаталог(),
ПараметрыКонфигурацииOneScript
);

ОжидатьЗавершениеПроцесса(Процесс);

Возврат Процесс.КодВозврата;

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

Функция ПутьКТочкеВходаПриложения()

Если _ПутьКТочкеВходаПриложения <> Неопределено Тогда
Возврат _ПутьКТочкеВходаПриложения;
КонецЕсли;

_ПутьКТочкеВходаПриложения = Новый Файл(
ОбъединитьПути(ТекущийСценарий().Каталог, "..", "main.os")
).ПолноеИмя;

Возврат _ПутьКТочкеВходаПриложения;

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

Функция ПараметрыКонфигурацииДляПеременнойСреды(Параметры)

ЧастиКонфигурации = Новый Массив();
Для Каждого Параметр Из Параметры Цикл
ЧастиКонфигурации.Добавить(СтрШаблон(

Check notice on line 91 in src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os#L91

Уберите инициализацию параметров метода "Добавить" вложенными методами
"%1=%2",
Параметр.Ключ,
ЗначениеКонфигурацииДляПеременнойСреды(Параметр.Значение)
));
КонецЦикла;

Возврат СтрСоединить(ЧастиКонфигурации, ";");

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

Функция ЗначениеКонфигурацииДляПеременнойСреды(Значение)

Кавычка = """";
ЭкранированноеЗначение = СтрЗаменить(Строка(Значение), Кавычка, Кавычка + Кавычка);

Возврат Кавычка + ЭкранированноеЗначение + Кавычка;

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

Функция СоздатьИЗапуститьПроцесс(ПутьКТочкеВхода, РабочийКаталог, ПараметрыКонфигурацииOneScript)

ЛокаторИсполняющейСреды = Новый ЛокаторИсполняющейСреды();
ПутьИсполняемогоФайла = ЛокаторИсполняющейСреды.НайтиИсполняемыйФайлВКаталоге(КаталогПрограммы());

ЧастиКоманды = Новый Массив();
// OneScript извлекает executable до разбора аргументов и снимает только двойные кавычки.
ЧастиКоманды.Добавить(

Check notice on line 118 in src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os#L118

Уберите инициализацию параметров метода "Добавить" вложенными методами
ЭкранированиеАргументовКоманднойСтроки.ОбернутьИсполняемыйФайлВКавычки(
ПутьИсполняемогоФайла
)
);
ЧастиКоманды.Добавить(

Check notice on line 123 in src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os#L123

Уберите инициализацию параметров метода "Добавить" вложенными методами
ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки(
ПутьКТочкеВхода
)
);

Для Каждого Аргумент Из АргументыКоманднойСтроки Цикл
ЧастиКоманды.Добавить(

Check notice on line 130 in src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os#L130

Уберите инициализацию параметров метода "Добавить" вложенными методами
ЭкранированиеАргументовКоманднойСтроки.ОбернутьАргументКоманднойСтрокиВКавычки(
Аргумент
)
);
КонецЦикла;

ПеременныеСредыПроцесса = ПеременныеСреды();
ПеременныеСредыПроцесса.Вставить("BENCHOS_OSCRIPT_CONFIG_APPLIED", "1");
ПеременныеСредыПроцесса.Вставить("OSCRIPT_CONFIG", ПараметрыКонфигурацииOneScript);

Процесс = СоздатьПроцесс(
СтрСоединить(ЧастиКоманды, " "),
РабочийКаталог,
Ложь,
Ложь,
,
ПеременныеСредыПроцесса
);

Процесс.Запустить();

Возврат Процесс;

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

Процедура ОжидатьЗавершениеПроцесса(Процесс)

Пока Не Процесс.Завершен Цикл
Приостановить(100);

Check notice on line 159 in src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ЗапускательПриложенияСКонфигурациейOneScript.os#L159

Создайте константу с понятным названием, присвойте ей значение "100" и используйте эту константу вместо магического числа.
КонецЦикла;

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

#КонецОбласти
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,32 @@

Перем _ПарсерПараметровБенчмарковCLI; // ПарсерПараметровБенчмарковCLI

// Инициализирует команду запуска бенчмарков.
&КомандаПриложения(Имя = "run", Описание = "Запуск бенчмарков")
Процедура ПриСозданииОбъекта()
_ПарсерПараметровБенчмарковCLI = Новый ПарсерПараметровБенчмарковCLI();
КонецПроцедуры

// Запускает бенчмарки с учетом их локальных конфигураций OneScript.
&ВыполнениеКоманды
Процедура Запустить() Экспорт

ФайлыКонфигурацииOneScript = Новый ЛокаторФайловКонфигурацииOneScript()
.НайтиФайлыКонфигурации(
_МассивФайлов,
_Рекурсивно
);

КодВозврата = Новый ЗапускательПриложенияСКонфигурациейOneScript()
.ПерезапуститьСКонфигурацией(
ФайлыКонфигурацииOneScript
);

Если КодВозврата <> Неопределено Тогда
ЗавершитьРаботу(КодВозврата);
Возврат;
КонецЕсли;

Настройки = ПрочитатьНастройки();

ЗапускательФайловБенчмарков = Новый ЗапускательФайловБенчмарков(_МассивФайлов, _Рекурсивно, Настройки);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#Использовать fs

#Область ПрограммныйИнтерфейс

// Находит файлы конфигурации OneScript для переданных файлов и каталогов бенчмарков.
// Каждый файл возвращается один раз в порядке первого появления. Порядок определяется
// порядком элементов МассивФайлов и нормализованными полными путями файлов внутри каталога.
//
// Параметры:
// МассивФайлов - Массив из Строка - Пути к файлам и каталогам бенчмарков
// Рекурсивно - Булево - Искать файлы бенчмарков во вложенных каталогах
//
// Возвращаемое значение:
// Массив из Строка - Уникальные нормализованные полные пути к файлам oscript.cfg
// в порядке первого появления
Функция НайтиФайлыКонфигурации(МассивФайлов, Рекурсивно = Ложь) Экспорт

ФайлыКонфигурации = Новый Массив();
ДобавленныеФайлы = Новый Соответствие();
РазрешательВходныхФайлов = Новый РазрешательВходныхФайловБенчмарков();

Check notice on line 20 in src/BenchmarkOneScript/cmd/Классы/ЛокаторФайловКонфигурацииOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ЛокаторФайловКонфигурацииOneScript.os#L20

Возможная опечатка в "Разрешатель"
РазрешенныеВходы = РазрешательВходныхФайлов.Разрешить(МассивФайлов, Рекурсивно);

Для Каждого РазрешенныйВход Из РазрешенныеВходы Цикл

Если Не РазрешенныйВход.Разрешен Тогда
Продолжить;
КонецЕсли;

Если РазрешенныйВход.ВходнойКаталог <> Неопределено Тогда
ДобавитьФайлКонфигурации(
РазрешенныйВход.ВходнойКаталог,
ФайлыКонфигурации,
ДобавленныеФайлы
);
КонецЕсли;

Для Каждого ПолноеИмяФайла Из РазрешенныйВход.Файлы Цикл
ДобавитьФайлКонфигурации(
Новый Файл(ПолноеИмяФайла).Путь,
ФайлыКонфигурации,
ДобавленныеФайлы
);
КонецЦикла;

КонецЦикла;

Возврат ФайлыКонфигурации;

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

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ДобавитьФайлКонфигурации(Каталог, ФайлыКонфигурации, ДобавленныеФайлы)

ПутьККонфигурации = ФС.НормализоватьПуть(ОбъединитьПути(Каталог, "oscript.cfg"));
Если Не ФС.ФайлСуществует(ПутьККонфигурации) Тогда
Возврат;
КонецЕсли;

КлючФайла = КлючДедупликацииФайла(ПутьККонфигурации);
Если ДобавленныеФайлы.Получить(КлючФайла) <> Неопределено Тогда
Возврат;
КонецЕсли;

ДобавленныеФайлы.Вставить(КлючФайла, Истина);
ФайлыКонфигурации.Добавить(ПутьККонфигурации);

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

Функция КлючДедупликацииФайла(ПутьКФайлу)

Check notice on line 72 in src/BenchmarkOneScript/cmd/Классы/ЛокаторФайловКонфигурацииOneScript.os

View check run for this annotation

sonar.openbsl.ru qa-bot / SonarQube Code Analysis

src/BenchmarkOneScript/cmd/Классы/ЛокаторФайловКонфигурацииOneScript.os#L72

Возможная опечатка в "Дедупликации"

Если ЭтоWindows() Тогда
Возврат НРег(ПутьКФайлу);
КонецЕсли;

Возврат ПутьКФайлу;

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

Функция ЭтоWindows()

ТекущаяПлатформа = Новый СистемнаяИнформация().ТипПлатформы;

Возврат ТекущаяПлатформа = ТипПлатформы.Windows_x86_64
Или ТекущаяПлатформа = ТипПлатформы.Windows_x86;

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

#КонецОбласти
Loading
Loading