Skip to content

Commit 4c52663

Browse files
authored
feat: Конфигурирование через CLI (#18)
1 parent 5a40b6b commit 4c52663

15 files changed

+742
-95
lines changed

README.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
## Возможности
2020

21-
- **Гибкая настройка:** конфигурация тестов через аннотации или программный код.
21+
- **Гибкая настройка:** конфигурация тестов через аннотации, программный код и CLI.
2222
- **Параметризованные тесты:** запуск одних и тех же тестов с разными входными данными.
2323
- **Мониторинг памяти:** отслеживание аллокации памяти во время выполнения.
2424
- **Метрики:** время выполнения (среднее, минимум, максимум), стандартное отклонение и ошибка, операций в секунду (Op/s), квартили и произвольные процентили.
@@ -75,11 +75,9 @@ opm install benchmark
7575
**CLI:**
7676

7777
```bash
78-
benchos run [FILE]
78+
benchos run [OPTIONS] [FILE]
7979
```
8080

81-
`FILE` - имя файла класса бенчмарков в текущем каталоге, либо полный путь к нему
82-
8381
**API:**
8482

8583
```bsl
@@ -89,7 +87,7 @@ benchos run [FILE]
8987
Результат = Бенчмаркинг.Запустить(Тип("КонкатенацияСтрок"));
9088
```
9189

92-
Более подробно можно почитать в [документации](docs/ЗапускБенчмарков.md).
90+
Более подробно про запуск бенчмарков можно почитать в [документации](docs/ЗапускБенчмарков.md).
9391

9492
## 4. Просмотр результатов
9593

docs/CLI.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# CLI
2+
3+
## Команда `run`
4+
5+
Запускает бенчмарки по указанному файлу, имени класса или директории.
6+
7+
```bash
8+
benchos run [OPTIONS] [FILE]
9+
```
10+
11+
### Опции
12+
13+
| Опция | Описание | Пример |
14+
| --- | --- | --- |
15+
| `-r`, `--recursive` | Рекурсивный поиск в поддиректориях | |
16+
| `--iterationCount` | Количество измерительных итераций | `--iterationCount 10 ` |
17+
| `--iterationTime` | Минимальное время выполнения одной итерации (мс) | `--iterationTime 500` |
18+
| `--warmupCount` | Количество прогревочных итераций | `--warmupCount 10` |
19+
| `--invocationCount` | Количество вызовов метода за итерацию | `--invocationCount 100` |
20+
| `-m`, `--memory` | Включить мониторинг использования памяти | |
21+
| `-e`, `--exporters` | Форматы экспорта результатов (`md`, `json`, `xml`, `html`) | `-e json,xml` |
22+
| `-a`, `--artifacts` | Каталог для сохранения результатов | `-a path/to/file` |
23+
| `--throughput` | Стратегия выполнения [`ПропускнаяСпособность`](ВыборСтратегииЗапуска.md#пропускнаяспособность) | |
24+
| `--coldstart` | Стратегия выполнения [`ХолодныйЗапуск`](ВыборСтратегииЗапуска.md#холодныйзапуск) | |
25+
26+
## Примеры
27+
28+
```bash
29+
# Запуск по имени класса (файл МойКласс.os должен существовать в текущей директории)
30+
benchos run МойКласс
31+
32+
# Запуск по имени файла в текущей директории
33+
benchos run МойКласс.os
34+
35+
# Запуск по абсолютному пути
36+
benchos run /path/to/МойКласс.os
37+
38+
# Запуск всех бенчмарков в директории
39+
benchos run /path/to/benchmarks
40+
41+
# Запуск всех бенчмарков в директории, включая вложенные каталоги
42+
benchos run -r /path/to/benchmarks
43+
44+
# Рекурсивный запуск с мониторингом памяти и экспортом в JSON
45+
benchos run -r -m -e json ./benchmarks/
46+
```

docs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- [Статистика](Статистика.md)
1212
- [Сортировка отчета](СортировкаОтчета.md)
1313
- [Экспорт результатов](ЭкспортРезультатов.md)
14+
- [CLI](CLI.md)
1415
- [Аннотации](../src/BenchmarkOneScript/annotations/Классы)
1516

1617
## Примеры

docs/БыстрыйСтарт.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,9 @@ opm install benchmark
4949
**CLI:**
5050

5151
```bash
52-
benchos run [FILE]
52+
benchos run [OPTIONS] [FILE]
5353
```
5454

55-
`FILE` - имя файла класса бенчмарков в текущем каталоге, либо полный путь к нему
56-
5755
**API:**
5856

5957
```bsl
@@ -63,7 +61,7 @@ benchos run [FILE]
6361
Результат = Бенчмаркинг.Запустить(Тип("КонкатенацияСтрок"));
6462
```
6563

66-
Более подробно можно почитать в [документации](ЗапускБенчмарков.md).
64+
Более подробно про запуск бенчмарков можно почитать в [документации](ЗапускБенчмарков.md).
6765

6866
## 4. Просмотр результатов
6967

docs/ЗапускБенчмарков.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
## CLI
44

55
```bash
6-
benchos run [FILE]
6+
benchos run [OPTIONS] [FILE]
77
```
88

9-
`FILE` - имя файла класса бенчмарков в текущем каталоге, либо полный путь к нему
9+
Более подробно про CLI можно почитать в [документации](CLI.md).
1010

11-
**Примеры использования:**
11+
### Примеры использования
1212

1313
```bash
1414
# Запуск по имени класса (файл МойКласс.os должен существовать в текущей директории)
@@ -20,11 +20,14 @@ benchos run МойКласс.os
2020
# Запуск по абсолютному пути
2121
benchos run /path/to/МойКласс.os
2222

23-
# Запуск из каталога
23+
# Запуск всех бенчмарков в директории
2424
benchos run /path/to/benchmarks
2525

26-
# Запуск из каталога, включая вложенные каталоги
26+
# Запуск всех бенчмарков в директории, включая вложенные каталоги
2727
benchos run -r /path/to/benchmarks
28+
29+
# Рекурсивный запуск с мониторингом памяти и экспортом в JSON
30+
benchos run -r -m -e json ./benchmarks/
2831
```
2932

3033
## API

samples/api/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ oscript [FILE]
66

77
`FILE` - путь к файлу примера.
88

9-
Например:
9+
Пример:
1010

1111
```bash
1212
oscript ./ЗапускБенчмарковПример.os
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
Примеры бенчмарков можно запустить в консоле командой:
22

33
```bash
4-
benchos run [FILE]
4+
benchos run [OPTIONS] [FILE]
55
```
66

7-
`FILE` - путь к файлу бенчмарка.
7+
Более подробно можно почитать в [документации](../../../docs/CLI.md).
88

9-
Например:
9+
Примеры:
1010

1111
```bash
12+
# Запуск конкретного класса с бенчмарками
1213
benchos run ./БенчмаркБазовый.os
14+
15+
# Запуск всех бенчмарков в текущем каталоге
16+
benchos run .
1317
```

src/BenchmarkOneScript/cmd/Классы/КомандаЗапуска.os

Lines changed: 123 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,86 @@
44
#Использовать fs
55
#Использовать logos
66

7-
&Опция(Имя = "r recursive", Описание = "Искать бенчмарки во вложенных каталогах")
7+
&Опция(Имя = "r recursive", Описание = "Рекурсивный поиск в поддиректориях")
88
&Флаг
99
&ПоУмолчанию(Ложь)
10-
Перем Рекурсивно;
10+
Перем _Рекурсивно; // Булево
11+
12+
&Опция(Имя = "m memory", Описание = "Включить мониторинг использования памяти")
13+
&Флаг
14+
Перем _МониторингПамяти; // Булево
15+
16+
&Опция(Имя = "iterationCount", Описание = "Количество измерительных итераций")
17+
&ТЧисло
18+
Перем _КоличествоИтераций; // Число
19+
20+
&Опция(Имя = "iterationTime", Описание = "Минимальное время выполнения одной итерации в миллисекундах")
21+
&ТЧисло
22+
Перем _МинимальноеВремяИтерации; // Число
23+
24+
&Опция(Имя = "warmupCount", Описание = "Количество прогревочных итераций")
25+
&ТЧисло
26+
Перем _КоличествоПрогревочныхИтераций; // Число
27+
28+
&Опция(Имя = "invocationCount", Описание = "Количество вызовов метода за итерацию")
29+
&ТЧисло
30+
Перем _КоличествоВызововЗаИтерацию; // Число
31+
32+
&Опция(Имя = "e exporters", Описание = "Форматы экспорта результатов (md, json, xml, html)")
33+
&ТСтрока
34+
Перем _Экспортеры; // Строка
35+
36+
&Опция(Имя = "a artifacts", Описание = "Каталог для сохранения результатов")
37+
&ТСтрока
38+
Перем _КаталогАртефактов; // Строка
39+
40+
&Опция(Имя = "coldstart", Описание = "Стратегия 'Холодный запуск'")
41+
&ТБулево
42+
Перем _ХолодныйЗапуск; // Булево, Неопределено
43+
44+
&Опция(Имя = "throughput", Описание = "Стратегия 'Пропускная способность'")
45+
&ТБулево
46+
Перем _ПропускнаяСпособность; // Булево, Неопределено
1147

1248
&Аргумент(Имя = "FILE", Описание = "Каталог, полный путь к файлу или имя файла в текущей директории")
1349
&ТСтрока
14-
Перем ПутьКФайлу;
50+
Перем _ПутьКФайлу; // Строка
1551

1652
Перем _Лог;
1753

18-
&КомандаПриложения(Имя = "run", Описание = "Запускает бенчмарки")
54+
&КомандаПриложения(Имя = "run", Описание = "Запуск бенчмарков")
1955
Процедура ПриСозданииОбъекта()
2056
КонецПроцедуры
2157

2258
&ВыполнениеКоманды
2359
Процедура Запустить() Экспорт
24-
25-
Если ФС.КаталогСуществует(ПутьКФайлу) Тогда
26-
Бенчмаркинг.ЗапуститьИзКаталога(ПутьКФайлу, Рекурсивно);
60+
61+
Если ФС.КаталогСуществует(_ПутьКФайлу) Тогда
62+
Бенчмаркинг.ЗапуститьИзКаталога(_ПутьКФайлу, _Рекурсивно, Конфигурация());
2763
Возврат;
2864
КонецЕсли;
2965

30-
Файл = ФайлКласса();
66+
Файл = ФайлСценария();
3167
Если Файл = Неопределено Тогда
32-
_Лог.Ошибка("Файл <%1> не существует", ПутьКФайлу);
68+
_Лог.Ошибка("Файл <%1> не существует", _ПутьКФайлу);
3369
Возврат;
3470
КонецЕсли;
3571

3672
Тип = Бенчмаркинг.ПодключитьКласс(Файл.ПолноеИмя);
3773
Если Не Тип = Неопределено Тогда
38-
Бенчмаркинг.Запустить(Тип);
74+
Конфигурация = Новый КонфигурацияБенчмарков(Тип);
75+
Конфигурация.Объединить(Конфигурация());
76+
Бенчмаркинг.Запустить(Тип, Конфигурация);
3977
КонецЕсли;
4078

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

43-
Функция ФайлКласса()
81+
Функция ФайлСценария()
4482

4583
ВариантыПутей = Новый Массив();
46-
ВариантыПутей.Добавить(ПутьКФайлу);
47-
ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), ПутьКФайлу));
48-
ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), ПутьКФайлу + ".os"));
84+
ВариантыПутей.Добавить(_ПутьКФайлу);
85+
ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), _ПутьКФайлу));
86+
ВариантыПутей.Добавить(ОбъединитьПути(ТекущийКаталог(), _ПутьКФайлу + ".os"));
4987

5088
Для Каждого Путь Из ВариантыПутей Цикл
5189
Файл = Новый Файл(Путь);
@@ -56,4 +94,75 @@
5694

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

97+
Функция Конфигурация()
98+
99+
Конфигурация = Новый КонфигурацияБенчмарков();
100+
101+
Если _МониторингПамяти = Истина Тогда
102+
Конфигурация.ДобавитьМониторингПамяти();
103+
КонецЕсли;
104+
105+
Если ЭтоЧисло(_КоличествоИтераций) Тогда
106+
Конфигурация.УстановитьКоличествоИтераций(_КоличествоИтераций);
107+
КонецЕсли;
108+
109+
Если ЭтоЧисло(_МинимальноеВремяИтерации) Тогда
110+
Конфигурация.УстановитьМинимальноеВремяИтерации(_МинимальноеВремяИтерации);
111+
КонецЕсли;
112+
113+
Если ЭтоЧисло(_КоличествоПрогревочныхИтераций) Тогда
114+
Конфигурация.УстановитьКоличествоПрогревочныхИтераций(_КоличествоПрогревочныхИтераций);
115+
КонецЕсли;
116+
117+
Если ЭтоЧисло(_КоличествоВызововЗаИтерацию) Тогда
118+
Конфигурация.УстановитьКоличествоВызововЗаИтерацию(_КоличествоВызововЗаИтерацию);
119+
КонецЕсли;
120+
121+
Если ЗначениеЗаполнено(_КаталогАртефактов) Тогда
122+
Конфигурация.УстановитьКаталогАртефактов(_КаталогАртефактов);
123+
КонецЕсли;
124+
125+
Если _ХолодныйЗапуск = Истина Тогда
126+
Конфигурация.УстановитьСтратегию(СтратегииЗапускаБенчмарка.ХолодныйЗапуск);
127+
КонецЕсли;
128+
129+
Если _ПропускнаяСпособность = Истина Тогда
130+
Конфигурация.УстановитьСтратегию(СтратегииЗапускаБенчмарка.ПропускнаяСпособность);
131+
КонецЕсли;
132+
133+
ПрочитатьЭкспортеры(Конфигурация);
134+
135+
Возврат Конфигурация;
136+
137+
КонецФункции
138+
139+
Функция ЭтоЧисло(Значение)
140+
Возврат ТипЗнч(Значение) = Тип("Число");
141+
КонецФункции
142+
143+
Процедура ПрочитатьЭкспортеры(Конфигурация)
144+
145+
Если Не ЗначениеЗаполнено(_Экспортеры) Тогда
146+
Возврат;
147+
КонецЕсли;
148+
149+
ДопустимыеЗначения = Новый Соответствие();
150+
ДопустимыеЗначения.Вставить("markdown", "Markdown");
151+
ДопустимыеЗначения.Вставить("json", "Json");
152+
ДопустимыеЗначения.Вставить("xml", "Xml");
153+
ДопустимыеЗначения.Вставить("html", "Html");
154+
155+
Для Каждого Экспортер Из СтрРазделить(_Экспортеры, ", ", Ложь) Цикл
156+
157+
Имя = ДопустимыеЗначения[НРег(Экспортер)];
158+
159+
ТекстОшибки = СтрШаблон("Неизвестный экспортер %1. Допустимые значения: markdown, json, xml, html", Экспортер);
160+
Ожидаем.Что(Имя, ТекстОшибки).Заполнено();
161+
162+
Конфигурация.ДобавитьЭкспортер(ЭкспортерыРезультатовБенчмарков[Имя]);
163+
164+
КонецЦикла;
165+
166+
КонецПроцедуры
167+
59168
_Лог = Логирование.ПолучитьЛог("oscript.lib.benchmark.cli");

src/BenchmarkOneScript/core/Классы/ДескрипторБенчмарка.os

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#Использовать delegate
22

3-
Перем _Тип; // Тип - Тип класса бенчмарков
3+
Перем _Тип; // Тип - Класс бенчмарков
44
Перем _Метод; // Строка - Метод бенчмарка
55
Перем _ЭтоЭталон; // Булево
66
Перем _Категория; // Строка
@@ -24,7 +24,7 @@
2424

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

27-
// Тип класса бенчмарков
27+
// Класс бенчмарков
2828
//
2929
// Возвращаемое значение:
3030
// Тип

0 commit comments

Comments
 (0)