Skip to content

perf(model): сборка сущности без копий таблицы колонок - #151

Merged
nixel2007 merged 6 commits into
claude/entity-opentelemetry-integration-uhz1qnfrom
claude/model-object-cache-uhz1qn
Sep 25, 2026
Merged

nixel2007 merged 6 commits into
claude/entity-opentelemetry-integration-uhz1qnfrom
claude/model-object-cache-uhz1qn

Conversation

@nixel2007

@nixel2007 nixel2007 commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner

Поверх #149.

Что было

При сборке сущности из строки результата ОбъектМодели на каждое значение каждой колонки:

  • копировал таблицу колонок: Колонки() отдавал Колонки.Скопировать(), а УстановитьЗначениеКолонкиВПоле, ПривестиЗначениеПоля, ПолучитьПриведенноеЗначениеПоля искали колонку через Колонки().Найти(...); ещё одна копия — в цикле РаботаСКоннекторами.ЗаполнитьКолонки на каждую строку;
  • заново строил Соответствие из восьми ОписаниеТипов (ВыполнитьПриведениеЗначения → СоответствиеТиповМоделиОписанийТипов());
  • собирал новую ФиксированнаяСтруктура на каждый Идентификатор().

Полезная работа — приведение и запись поля — около 2 мкс из ~72 мкс на колонку.

Что сделано

  • Колонки() отдаёт саму таблицу модели, только для чтения; контракт описан в комментарии и в docs/ОбъектМодели.md. Служебный_Колонки() удалён: ОбработкаКоллекций и ЗаполнитьКолонки берут Колонки(). Колонка ищется Найти по таблице модели.
  • Карта ОписаниеТипов строится один раз в конструкторе.
  • Поле Идентификатор хранит ФиксированнуюСтруктуру, Идентификатор() просто его возвращает.
  • Неизвестное поле или колонка дают «В модели сущности <Тип> нет поля|колонки <Имя>» вместо ошибки обращения к полю Неопределено, текст которой зависел от локали.

Потокобезопасность: новых общих изменяемых данных нет. Таблица колонок и карта типов после конструктора только читаются; перебор и Найти в движке ничего не пишут, ОписаниеТипов.ПривестиЗначение читает только неизменяемые поля. Таблицу колонок меняет лишь ОбработкаКоллекций — у только что созданного объекта модели элемента коллекции, который другим потокам ещё не виден. Внутри entity все остальные вызывающие Колонки() таблицу только читают.

Замер

219 строк, 12 колонок, пул сущностей заполнен:

до после
PostgreSQL 863 мкс на строку 378
SQLite 859 358
SQLite, 24 колонки 1756 589

Тесты

tests/ОбъектМодели.os: Колонки() отдаёт таблицу модели; правка колонок видна приведению; поле и колонка ищутся каждый по своему имени; неизвестные поле и колонка дают исключение с текстом; идентификатор неизменяем и отдаётся один и тот же.

Полный прогон с SQLite и PostgreSQL: 314 из 314.

🤖 Generated with Claude Code

https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp

Охрана перед кэшированием: копия Колонки() не влияет на модель, правка
служебных колонок видна приведению, поле и колонка ищутся каждый по
своему имени, неизвестные поле и колонка дают исключение, идентификатор
неизменяем.

Исключения проверяются явной попыткой: ВыбрасываетИсключение() из asserts
без фрагмента текста проходит и без исключения.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
ОбъектМодели строит в конструкторе соответствия колонок по имени поля и
по имени колонки, карту описаний типов и неизменяемый идентификатор;
дальше они только читаются. Раньше на каждое значение каждой строки
копировалась таблица колонок и заново строилась карта из восьми
ОписаниеТипов. Соответствия ссылаются на строки самой таблицы, поэтому
правка через Служебный_Колонки() видна и им. Публичный Колонки() по-прежнему
отдает копию.

РаботаСКоннекторами.ЗаполнитьКолонки обходит таблицу модели без копии.

Замер, 219 строк, 12 колонок, пул сущностей заполнен: PostgreSQL 863 ->
407 мкс на строку, SQLite 859 -> 292.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
ПривестиЗначениеПоля, ПолучитьПриведенноеЗначениеПоля и
УстановитьЗначениеКолонкиВПоле с именем, которого нет в модели, бросают
«В модели сущности <Тип> нет поля|колонки <Имя>» вместо ошибки
обращения к полю Неопределено, текст которой зависит от локали. Тесты
проверяют текст через ВыбрасываетИсключение.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
@coderabbitai

coderabbitai Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: de8a5a36-1010-46ca-bfb9-8f305cfc43b1

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Колонки() отдает саму таблицу модели, только для чтения; служебный
Служебный_Колонки() удален - ОбработкаКоллекций и ЗаполнитьКолонки
берут Колонки(). Поиск колонки - Найти по таблице модели вместо двух
соответствий. Поле Идентификатор хранит ФиксированнуюСтруктуру,
отдельное поле под нее не нужно.

Замер, 219 строк, 12 колонок, пул сущностей заполнен: PostgreSQL 378
мкс на строку, SQLite 358 - на уровне варианта с соответствиями.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Описание метода говорит, что таблица колонок только для чтения, без
подробностей реализации. Почему ОбработкаКоллекций ее все же меняет -
в комментарии на месте изменения.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Индексы строятся в конструкторе, после заполнения таблицы; поиск
колонки в ОбъектМодели идет по ним. ОбработкаКоллекций меняет у строк
только тип колонки и тип ссылки, индексированные имена не трогает.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
@nixel2007
nixel2007 merged commit cc82b22 into claude/entity-opentelemetry-integration-uhz1qn Sep 25, 2026
15 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants