Repository navigation
Тип записи сущности регистрируется один раз на тип сущности - #165
Segate-ekb wants to merge 2 commits into
Conversation
…щности, а не компилируется для каждой строки
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
WalkthroughИзменения регистрируют общий тип активной записи для каждого типа сущности. Экземпляры получают хранилище и модель от менеджера. Тесты проверяют регистрацию, операции с записями и изоляцию между менеджерами. Документация уточняет тип записи и имя метода чтения. ChangesАктивные записи
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~20 minutes Change: Refactor Suggested reviewers: Merge Risk: ⚪ Minimal · up to
|
|
|
||
| Возврат Декоратор; | ||
| // Проверка и регистрация под одной блокировкой: тип регистрируется ровно один раз на процесс. | ||
| Возврат ТипыЗаписей.ВычислитьЕслиОтсутствует( |
There was a problem hiding this comment.
Читать под блокировкой на горячем пути очень дорого. Надо менять на CoW-карта здесь подойдёт лучше.
Проблема
АктивнаяЗапись.Создатьстроила декоратор для каждой записи:ПостроительДекоратора(...).Построить()генерирует исходник и компилирует его черезЗагрузитьСценарийИзСтрокина каждую строку, прочитанную из базы или созданную черезСоздатьЭлемент. Каждая запись несла собственный скомпилированный сценарий — это и время, и память: на hub.oscript.io пул сущностей со скомпилированными декораторами держал сотни мегабайт, которые не отпускались.Что изменилось
ЗаписьСущности_<ТипСущности>(ПостроительДекоратора.ЗарегистрироватьВСистемеТипов). Регистрация идёт под блокировкойСинхронизированнаяКарта.ВычислитьЕслиОтсутствует, поэтому в многопоточном приложении тип регистрируется ровно один раз на процесс.Новый ИмяТипа; хранилище и модель данных привязываются к экземпляру черезРефлектор, а не к типу, поэтому записи разных менеджеров одного типа сущности по-прежнему сохраняются каждая в свой источник.АктивнаяЗапись.ТипСущностиопределяет декоратор черезОбработкаДекоратора.ЭтоДекоратор, а не поТипЗнч = Сценарий.tests/АктивнаяЗапись.os(наКоннекторInMemory): у записей одного типа сущности один тип;Сохранить/Прочитать/Удалитьчерез запись; записи разных менеджеров пишут в свои источники;Сохранить/Удалитьзаписи через менеджер.docs/АктивнаяЗапись.md: описание типа записи, имя метода чтения приведено к фактическому (Прочитать).Совместимость
ТипЗнч(Запись)теперь возвращаетТип("ЗаписьСущности_<ТипСущности>"), а неТип("Сценарий"). Исходный тип сущности, как и раньше, даётАктивнаяЗапись.ТипСущности(Запись)илиОбработкаДекоратора.ИсходныйТип(Запись).Сохранить,Прочитать,Удалить), пул сущностей и тождество записей в пуле не менялись.Замеры: было / стало
Библиотека BenchmarkOneScript v0.9.1, OneScript v2.2.1, macOS, Apple M5 Pro.
КоннекторInMemory, сущность с четырьмя полями, 1000 строк; 5 итераций, 1 прогревочная, 1 вызов за итерацию,&МониторингПамяти.Закрыть()хранилища, затемПолучить(Тип)Получить(Тип)по заполненному пулуСоздатьЭлемент(Тип)Полные отчёты библиотеки:
Было (master, dd5d20e)
Стало (эта ветка)
Повторное чтение из пула декоратор не строит ни до, ни после, поэтому его цифры — контроль: разница в пределах разброса.
Исходник бенчмарка
Сущность замера:
Идентификатор(&Идентификатор,&ГенерируемоеЗначение, Целое),Имя,Описание,Скачиваний(Целое), таблицаПакетыЗамера. Запуск:oscript oscript_modules/benchmark/src/BenchmarkOneScript/cmd/main.os run --memory ЧтениеСущностей.os.Проверка
Локально зелёные
tests/АктивнаяЗапись.os,tests/КоннекторInMemory.os,tests/КоннекторJSON.os,tests/ОбъектМодели.os. Наборы на SQLite и PostgreSQL локально не запускались (arm64 macOS без SQLite.Interop), их проверяет CI.🤖 Generated with Claude Code
Summary by CodeRabbit
Новые возможности
Документация
Тесты