Skip to content

Commit 45043a8

Browse files
committed
Init
0 parents  commit 45043a8

File tree

13 files changed

+677
-0
lines changed

13 files changed

+677
-0
lines changed

.gitignore

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# OneScript
2+
Components/
3+
out/
4+
oscript_modules/
5+
*.ospx
6+
7+
# VS Code
8+
.vscode/
9+
10+
# .NET
11+
[Dd]ebug/
12+
[Rr]elease/
13+
[Bb]in/
14+
[Oo]bj/
15+
16+
.vs/

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2025 Dmitry Ivanov, <[email protected]>
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# allocs
2+
3+
[![Release](https://img.shields.io/github/release/Stivo182/oscript-allocs.svg)](https://github.com/Stivo182/oscript-allocs/releases)
4+
[![Тестирование](https://github.com/Stivo182/oscript-allocs/actions/workflows/test.yml/badge.svg)](https://github.com/Stivo182/oscript-allocs/actions/workflows/test.yml)
5+
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6+
7+
`allocs` — Инструмент для мониторинга потребления управляемой памяти в скриптах на платформе OneScript.
8+
9+
## Установка
10+
11+
```bsl
12+
opm install allocs
13+
```
14+
15+
## Использование
16+
17+
```bsl
18+
МониторПамяти = Новый МониторПамяти();
19+
```
20+
21+
| Метод | Описание |
22+
|-------------------------|----------|
23+
| `Начать()` / `Start()` | Запускает замер памяти |
24+
| `Завершить()` / `Stop()` | Возвращает количество байт, выделенных с момента вызова `Начать()` |
25+
| `РазмерКучи()` / `HeapSize()` | Текущий размер управляемой кучи |
26+
| `ВсегоВыделеноБайт()` / `TotalAllocatedBytes()` | Общее количество байт, выделенных управляемой памятью в процессе работы приложения с момента его старта |
27+
28+
> [!IMPORTANT]
29+
> Не используйте метод `РазмерКучи()` для измерения дельты выделенной памяти (аллокаций).
30+
31+
### Пример измерения выделенной памяти
32+
33+
```bsl
34+
Монитор = Новый МониторПамяти();
35+
Монитор.Начать();
36+
37+
// Здесь код, потребление памяти которого нужно измерить
38+
Массив = Новый Массив;
39+
Для і = 1 По 100000 Цикл
40+
Массив.Добавить("Длинная строка для теста памяти");
41+
КонецЦикла;
42+
43+
ВыделеноБайт = Монитор.Завершить();
44+
45+
Сообщить("Выделено примерно: " + Формат(ВыделеноБайт / 1024 / 1024, "ЧДЦ=2") + " МБ");
46+
```
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
2+
#Использовать 1commands
3+
#Использовать fs
4+
5+
Процедура Подготовить() Экспорт
6+
7+
ИменаФайловБиблиотек = Новый Соответствие();
8+
ИменаФайловБиблиотек.Вставить("1script_allocs.dll");
9+
10+
СобратьБиблиотекуDotNET();
11+
ПодготовитьКаталогСКомпонентами(ИменаФайловБиблиотек);
12+
ПроверитьНаличиеБиблиотекиDotNET(ИменаФайловБиблиотек);
13+
14+
КонецПроцедуры
15+
16+
Процедура СобратьБиблиотекуDotNET()
17+
18+
КаталогРелиза = ОбъединитьПути(ТекущийКаталог(), "src/bin/Release");
19+
ФС.ОбеспечитьПустойКаталог(КаталогРелиза);
20+
21+
Команда = Новый Команда;
22+
Команда.УстановитьСтрокуЗапуска("dotnet build src -c Release");
23+
Команда.ПоказыватьВыводНемедленно(Истина);
24+
Команда.УстановитьКодировкуВывода(КодировкаТекста.UTF8);
25+
26+
КодВозврата = Команда.Исполнить();
27+
Если Не КодВозврата = 0 Тогда
28+
ВызватьИсключение "Не удалось выполнить сборку .NET библиотеки";
29+
КонецЕсли;
30+
31+
КонецПроцедуры
32+
33+
Процедура ПодготовитьКаталогСКомпонентами(ИменаФайловБиблиотек)
34+
35+
СоответствиеПапок = Новый Соответствие();
36+
СоответствиеПапок.Вставить("net4", "net48");
37+
СоответствиеПапок.Вставить("dotnet", "net8.0");
38+
39+
КаталогСКомпонентами = ОбъединитьПути(ТекущийКаталог(), "Components");
40+
41+
ФС.ОбеспечитьПустойКаталог(КаталогСКомпонентами);
42+
43+
Для Каждого Соответствие Из СоответствиеПапок Цикл
44+
ИмяКаталогаOscript = Соответствие.Ключ;
45+
ИмяКаталогаDotnet = Соответствие.Значение;
46+
47+
ПутьККаталгуOscript = ОбъединитьПути(КаталогСКомпонентами, ИмяКаталогаOscript);
48+
ФС.ОбеспечитьПустойКаталог(ПутьККаталгуOscript);
49+
50+
ПутьККаталгуDotnet = ОбъединитьПути(ТекущийКаталог(), "src/bin/Release", ИмяКаталогаDotnet);
51+
52+
Для Каждого Строка Из ИменаФайловБиблиотек Цикл
53+
ИмяФайла = Строка.Ключ;
54+
ПутьИсточник = ОбъединитьПути(ПутьККаталгуDotnet, ИмяФайла);
55+
ПутьПриемник = ОбъединитьПути(ПутьККаталгуOscript, ИмяФайла);
56+
57+
Если ФС.ФайлСуществует(ПутьИсточник) Тогда
58+
ПереместитьФайл(ПутьИсточник, ПутьПриемник);
59+
КонецЕсли;
60+
КонецЦикла;
61+
КонецЦикла;
62+
63+
КонецПроцедуры
64+
65+
Процедура ПроверитьНаличиеБиблиотекиDotNET(ИменаФайловБиблиотек)
66+
67+
Для Каждого ИмяПапки Из СтрРазделить("net4,dotnet", ",") Цикл
68+
Для Каждого Строка Из ИменаФайловБиблиотек Цикл
69+
70+
ИмяФайла = Строка.Ключ;
71+
ИмяЦелевойПапки = Строка.Значение;
72+
73+
Если ЗначениеЗаполнено(ИмяЦелевойПапки) И ИмяЦелевойПапки <> ИмяПапки Тогда
74+
Продолжить;
75+
КонецЕсли;
76+
77+
ПутьКФайлу = ОбъединитьПути(ТекущийКаталог(), "Components", ИмяПапки, ИмяФайла);
78+
Если Не ФС.ФайлСуществует(ПутьКФайлу) Тогда
79+
ВызватьИсключение СтрШаблон("Отсутсвует .NET библиотека %1 в папке Components/%2", ИмяФайла, ИмяПапки);
80+
КонецЕсли;
81+
82+
КонецЦикла;
83+
КонецЦикла;
84+
85+
КонецПроцедуры

package-loader.os

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
// Пояснения по переменным даны в конце модуля
2+
Перем ПоказатьСообщенияЗагрузки;
3+
4+
Процедура ПриЗагрузкеБиблиотеки(Путь, СтандартнаяОбработка, Отказ)
5+
6+
Вывести("
7+
|ПриЗагрузкеБиблиотеки " + Путь);
8+
9+
СтандартнаяОбработка = Ложь;
10+
11+
Вывести("Обрабатываем структуру каталогов по соглашению");
12+
ОбработатьСтруктуруКаталоговПоСоглашению(Путь);
13+
14+
КонецПроцедуры
15+
16+
Процедура ОбработатьСтруктуруКаталоговПоСоглашению(Путь)
17+
18+
КаталогиВК = Новый Массив;
19+
КаталогиВК.Добавить(ОбъединитьПути(Путь, "Components"));
20+
КаталогиВК.Добавить(ОбъединитьПути(Путь, "Компоненты"));
21+
22+
Для Каждого мКаталог Из КаталогиВК Цикл
23+
24+
ОбработатьКаталогВК(мКаталог);
25+
26+
КонецЦикла;
27+
28+
КонецПроцедуры
29+
30+
// По соглашению ВК должны лежать в подпапках, названных, как значения перечисления ТипПлатформы.
31+
// Имя файла, являющегося внешней компонентой должно иметь префикс 1script_
32+
// Components
33+
// net4 (фреймворк .net48
34+
// 1script_barcode.dll
35+
// dotnet (.net современных версий, он же netcore)
36+
// 1script_barcode.dll
37+
// NativeApi
38+
// Windows_x86
39+
// 1script_barcode.dll
40+
// Windows_x86_64
41+
// 1script_barcode.dll
42+
// Linux_x86_64
43+
// 1script_barcode.so
44+
// остальные не поддерживаются (ЖВПР)
45+
//
46+
Процедура ОбработатьКаталогВК(Знач Путь)
47+
48+
СИ = Новый СистемнаяИнформация();
49+
МажорнаяВерсия = Лев(СИ.Версия,1);
50+
51+
Если МажорнаяВерсия = "1" Тогда
52+
ОбработатьБиблиотекиCLR(ОбъединитьПути(Путь, "net4"));
53+
ИначеЕсли МажорнаяВерсия = "2" Тогда
54+
ОбработатьБиблиотекиCLR(ОбъединитьПути(Путь, "dotnet"));
55+
Иначе
56+
Вывести("Неизвестная мажорная версия системы: " + МажорнаяВерсия);
57+
КонецЕсли;
58+
59+
КонецПроцедуры
60+
61+
Процедура ОбработатьБиблиотекиCLR(Путь)
62+
63+
КандидатыВКомпоненты = НайтиФайлы(Путь, "1script_*.dll");
64+
Для Каждого Кандидат Из КандидатыВКомпоненты Цикл
65+
66+
Если Не Кандидат.ЭтоФайл() Тогда
67+
Продолжить;
68+
КонецЕсли;
69+
70+
Вывести("Загружаю файл " + Кандидат.Имя);
71+
ЗагрузитьБиблиотеку(Кандидат.ПолноеИмя);
72+
73+
КонецЦикла;
74+
75+
КонецПроцедуры
76+
77+
Процедура Вывести(Знач Сообщение)
78+
Если ПоказатьСообщенияЗагрузки Тогда
79+
Сообщить(Сообщение);
80+
КонецЕсли;
81+
КонецПроцедуры
82+
83+
Функция ПолучитьБулевоИзПеременнойСреды(Знач ИмяПеременнойСреды, Знач ЗначениеПоУмолчанию)
84+
85+
Рез = ЗначениеПоУмолчанию;
86+
РезИзСреды = ПолучитьПеременнуюСреды(ИмяПеременнойСреды);
87+
Если ЗначениеЗаполнено(РезИзСреды) Тогда
88+
РезИзСреды = СокрЛП(РезИзСреды);
89+
Попытка
90+
Рез = Число(РезИзСреды) <> 0 ;
91+
Исключение
92+
Рез = ЗначениеПоУмолчанию;
93+
ТекстСообщения = СтрШаблон("Неверный формат переменной среды %1. Ожидали 1 или 0, а получили %2",
94+
ИмяПеременнойСреды,
95+
РезИзСреды);
96+
Сообщить(ТекстСообщения);
97+
КонецПопытки;
98+
КонецЕсли;
99+
100+
Возврат Рез;
101+
102+
КонецФункции
103+
104+
// Если Истина, то выдаются подробные сообщения о порядке загрузке пакетов, классов, модулей,
105+
// что помогает при анализе проблем очень полезно при анализе ошибок загрузки
106+
// Переменная среды может принимать значение 0 (выключено) или 1 (включено)
107+
// Значение флага по умолчанию - Ложь
108+
ПоказатьСообщенияЗагрузки = ПолучитьБулевоИзПеременнойСреды(
109+
"OSLIB_LOADER_TRACE", Ложь);
110+
111+
// для установки других значений переменных среды и запуска скриптов можно юзать следующую командную строку
112+
// (set OSLIB_LOADER_TRACE=1) && (oscript .\tasks\test.os)

packagedef

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#Использовать "build"
2+
3+
Процедура ПередСборкой(РабочийКаталог) Экспорт
4+
ПодготовкаКомпонентов.Подготовить();
5+
КонецПроцедуры
6+
7+
Описание
8+
.Имя("allocs")
9+
.Версия("0.1.0")
10+
.Автор("Dmitry Ivanov")
11+
.АдресАвтора("https://github.com/Stivo182")
12+
.Описание("Инструмент для мониторинга потребления управляемой памяти")
13+
.ВерсияСреды("1.9.4")
14+
.ВключитьФайл("Components")
15+
.ВключитьФайл("package-loader.os")
16+
.ВключитьФайл("README.md")
17+
.РазработкаЗависитОт("1testrunner")
18+
.РазработкаЗависитОт("asserts")
19+
.РазработкаЗависитОт("1commands")
20+
.РазработкаЗависитОт("fs")

src/AllocsOneScript.csproj

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>net48;net8.0;</TargetFrameworks>
5+
<LangVersion>10.0</LangVersion>
6+
<PackageProjectUrl>https://github.com/Stivo182/oscript-allocs</PackageProjectUrl>
7+
<RepositoryUrl>https://github.com/Stivo182/oscript-alloc</RepositoryUrl>
8+
<Title>Allocs for OneScript</Title>
9+
<Company>Stivo182</Company>
10+
<Copyright>Stivo182</Copyright>
11+
<Version>1.0.0</Version>
12+
<AssemblyVersion>1.0.0</AssemblyVersion>
13+
<AssemblyName>1script_allocs</AssemblyName>
14+
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
15+
</PropertyGroup>
16+
17+
<ItemGroup Condition="'$(TargetFramework)'=='net8.0'">
18+
<PackageReference Include="OneScript.StandardLibrary" Version="2.0.0-rc6" />
19+
</ItemGroup>
20+
21+
<ItemGroup Condition="'$(TargetFramework)'=='net48'">
22+
<PackageReference Include="OneScript.StandardLibrary" Version="1.9.4" />
23+
</ItemGroup>
24+
25+
</Project>

src/AllocsOneScript.sln

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.10.35004.147
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AllocsOneScript", "AllocsOneScript.csproj", "{F8186095-8CDA-45DD-8314-A9114437098B}"
7+
EndProject
8+
Global
9+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
10+
Debug|Any CPU = Debug|Any CPU
11+
Release|Any CPU = Release|Any CPU
12+
EndGlobalSection
13+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
14+
{F8186095-8CDA-45DD-8314-A9114437098B}.Debug|Any CPU.ActiveCfg = Release|Any CPU
15+
{F8186095-8CDA-45DD-8314-A9114437098B}.Debug|Any CPU.Build.0 = Release|Any CPU
16+
{F8186095-8CDA-45DD-8314-A9114437098B}.Release|Any CPU.ActiveCfg = Release|Any CPU
17+
{F8186095-8CDA-45DD-8314-A9114437098B}.Release|Any CPU.Build.0 = Release|Any CPU
18+
EndGlobalSection
19+
GlobalSection(SolutionProperties) = preSolution
20+
HideSolutionNode = FALSE
21+
EndGlobalSection
22+
GlobalSection(ExtensibilityGlobals) = postSolution
23+
SolutionGuid = {379362BD-D5E7-4D7A-9450-E58C42F901F4}
24+
EndGlobalSection
25+
EndGlobal

0 commit comments

Comments
 (0)