Полиморфные объекты: Структура vs. Обработка. Сравнение производительности

25.03.26

Разработка - Механизмы платформы 1С

Сравнительный анализ производительности при использовании полиморфных объектов, реализованных с использованием двух различных подходов: Структура и Обработка.

Постановка проблемы

Чтобы с ходу погрузить вас в проблематику, приведу иллюстративный пример задачи.

Требуется создать несколько вариантов реализации интерфейса Множество. Общая идея представлена на UML-диаграмме.

 

 

Требуется соблюдать принцип LSP (3-й принцип S.O.L.I.D): клиентский код не должен зависеть от того, с каким вариантом реализации имеет дело. Другими словами, нужен классический полиморфизм, основанный на абстрактном интерфейсе.

Однако, данный пример я привел лишь для иллюстрации проблемы. Эта статья не про множества, а про использование двух различных подходов для реализации полиморфных объектов в 1С: в виде структур и в виде обработок. Я задался целью сравнить эти два подхода с точки зрения производительности.

 

Изложение подходов

Реализация полиморфного объекта в виде Структуры:

  1. Для каждого варианта реализации создается общий модуль, содержащий функцию-конструктор структуры и реализацию методов интерфейса.
  2. Свойства структуры служат для хранения свойств объекта.
  3. Также структура обязательно содержит свойство Модуль, содержащее ссылку на общий модуль реализации.
  4. Клиентский код вызывает методы в виде МойОбъект.Модуль.МойМетод(МойОбъект, <другие параметры...>).
  5. Клиентский код должен рассматривать структуру как черный ящик и не обращаться ни к каким свойствам, кроме свойства Модуль (исключение составляют публичные свойства, если они есть). Иначе будет нарушен принцип LSP. Ответственность за соблюдение этого правила возлагается на разработчика клиентского кода.

Реализация полиморфного объекта в виде Обработки:

  1. Для каждого варианта реализации создается Обработка, в которой модуль объекта содержит реализацию методов интерфейса.
  2. Приватные свойства хранятся как переменные модуля объекта.
  3. Клиентский код вызывает методы в виде МойОбъект.Метод(<параметры...>).
  4. Инкапсуляция обеспечивается средствами языка: переменные модуля объекта недоступны извне.

Оба подхода имеют свои плюсы и минусы. Обработка больше похожа на объект в понимании ООП. Она естественным образом обеспечивает защиту данных. Методы вызываются в объектном стиле.

Структура же - это всего лишь структура, подход из эпохи процедурного программирования. Она не обеспечивает никакой защиты данных объекта, и должна явным образом передаваться в каждый метод в виде параметра. Наличие смешанного состава публичных и приватных свойств сильно осложняет следование правилу черного ящика - разработчик клиентского кода всегда должен помнить, какие свойства разрешено использовать, а какие должны попадать в "слепое пятно". Это утомляет. С другой стороны, структура может применяться на клиенте, тогда как обработка - только на сервере.

Но это методологические различия, а какой из подходов будет работать быстрее?

 

Тестовый пример

Для задачи сравнительного анализа был реализован тестовый пример, изображенный на следующей диаграмме

 

 

Объект содержит умеренное количество свойств, из которых реально используется только одно, остальные служат для придания веса.

Конструктор объекта инициализирует все свойства начальными значениями.

Метод Тест() выполняет заданное количество итераций цикла, в котором свойство Значение увеличивается на 1, после чего возвращает Значение.

 

Все вышеописанное поведение было эквивалентным образом реализовано двумя способами.

 
 Реализация в виде СТРУКТУРЫ
 
 Реализация в виде ОБРАБОТКИ

 

 

Методика сравнения

Сравнение проводилось с варьированием трех факторов:

  • Интенсивность создания экземпляров объекта.
  • Интенсивность вызова методов объекта.
  • Интенсивность обращения к свойствам внутри метода.

В ходе замера выполнялось заданное количество циклов создания объекта. Внутри каждого цикла создания выполнялось заданное количество циклов вызова метода. Внутри метода выполнялось заданное количество циклов обращения к свойству объекта.

В разных тестах использовалось разное соотношение количества итераций на каждом уровне цикла. При этом общее количество итераций внутреннего цикла всегда было одинаковым - 100000.

 

Результаты замеров

Для порядка укажу, что замеры выполнялись на машине с такими параметрами: Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz, 16,0 ГБ ОЗУ, Win 10, 1С 8.3.27. Однако, абсолютные значения в данном случае не столь важны, важно соотношение величин.

Замер выполнялся без режима отладки. Под отладчиком все существенно медленнее и соотношения другие.

Результаты замеров приведены в таблице:

 

 

Расшифровка:

  • "Циклов создания" - количество циклов создания экземпляра объекта (самый внешний цикл)
  • "Циклов вызова" - количество циклов вызова метода (средний цикл)
  • "Циклов внутренних" - количество циклов внутри метода (самый внутренний цикл)
  • "Структура время" - время выполнения для объекта Структура (мс)
  • "Обработка время" - время выполнения для объекта Обработка (мс)
  • "Эффект обработки" - выигрыш времени при использовании обработки по сравнению с использованием структуры (%).

 

Анализ результатов

Экземпляр обработки создается дольше, чем экземпляр структуры. Это видно в тесте №1, где вся масса итераций приходится на создание объектов. В данном примере - в 3 раза дольше (-187%). Однако, при увеличении количества свойств объекта эта разница сокращается. Например, если добавить к нашему тестовому объекту еще 10 свойств, эффект обработки будет уже (-81%), причем исключительно из-за увеличения времени создания структуры - обработка создается за то же время.

А вот дальше наблюдается такая закономерность: по мере смещения интенсивности от внешнего цикла к внутреннему, обработка начинает выигрывать у структуры. Наивысший эффект обработки достигается, когда интенсивность по максимуму сосредоточена внутри метода, т.е. основная нагрузка приходится на код, выполняющий обращения к свойствам объекта. Здесь обработка вдвое превосходит структуру по скорости. Но и в большинстве промежуточных вариантов обработка либо выигрывает, либо выглядит по крайней мере не хуже структуры.

Секрет кроется в том, что операция обращения к свойству структуры - вовсе не дешевое удовольствие, она выполняется существенно медленнее, чем обращение к переменной модуля. Это наглядно видно по результатам замера производительности:

 

 

Здесь также можно оценить время, уходящее на создание и инициализацию свойств структуры: 4.74, против 14.35 на создание обработки. Для структуры время создания линейно зависит от количества свойств, тогда как для обработки - не зависит почти никак.

Вызов метода обработки выполняется несколько медленнее, чем вызов общего модуля через свойство структуры. Полагаю, это связано с выполнением контроля прав доступа при вызове методов обработки.

Интересная аномалия наблюдается в тестах №№2-3. Если в других случаях эффект обработки растет по мере смещения интенсивности от среднего цикла к внутреннему, то здесь почему-то наблюдается обратная динамика. Пока не нашел этому объяснения.

 

Выводы

Реализация объекта в виде структуры дает выигрыш только при следующих условиях: объекты с малым количеством свойств создаются с высокой частотой, при этом являясь по сути одноразовыми, т.е. для каждого экземпляра будут выполняться единичные вызовы методов, которые будут выполнять единичные обращения к свойствам.

Если предполагается интенсивное обращение к свойствам экземпляра, однозначно выгоднее реализовать объект как обработку.

Если объект содержит большое количество свойств, выигрыш структуры в скорости создания экземпляра сводится на нет и обработка начинает смотреться как минимум не хуже.

Разумеется, все это справедливо только при выполнении на сервере. На клиенте структура пока является единственным вариантом. Есть, правда, вариант использовать модуль формы, но в силу того, что создание экземпляра формы невозможно без обращения к серверу, данный вариант всерьез не рассматривается.

 

Из всего вышесказанного следует, что было бы очень неплохо, если бы в платформе 1С существовал "легковесный объект", как альтернатива обработке.

Обработка в 1С выполнена в стиле "бизнес-сущности". Она несет значительный груз наследственности от своего базового класса: 4 метода, 1 событие, реквизиты, формы, команды, макеты и контроль прав доступа на уровне ролей (подозреваю, что именно последнее вносит главный вклад в затраты на создание экземпляра). Для объекта внутренней архитектуры, который не предназначен для взаимодействия с пользователем, всё это - лишний балласт.

Легковесный объект не должен содержать ничего, кроме модуля объекта и модуля менеджера. Как общий модуль, только с возможностью создания экземпляров. А также он порождал бы новый тип, например Тип("Объект.МойОбъект"). И было бы неплохо, если бы использование было возможно не только на сервере, но и на клиенте (по аналогии с общим модулем: признаки Клиент, Сервер).

Вступайте в нашу телеграмм-группу Инфостарт

структура обработка производительность объекты полиморфизм

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    30515    TitanLuchs    106    

149

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    16696    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    19991    user2122906    9    

66

Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 Бесплатно (free)

Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.

17.01.2025    34553    user2122906    12    

62

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    31064    dsdred    100    

147

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    27455    bayselonarrend    22    

176

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    14918    dsdred    22    

85
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 1063 25.03.26 09:36 Сейчас в теме
классический полиморфизм, основанный на абстрактном интерфейсе.
Народ побежал курить жёлтые книжки, в надежде найти там эти понятия )))
2. Трактор 1279 25.03.26 10:20 Сейчас в теме
Спасибо. Задумался над тем чтобы в своём проекте переделать структуру на обработку. Тем более, что объект только один. Прошу прощения за неприличное слово - синглтон.
3. korvintorson 85 25.03.26 10:41 Сейчас в теме
(2) Если синглтон - тогда это общий модуль.
4. Трактор 1279 25.03.26 10:43 Сейчас в теме
(3) а свойства? Надо много свойств.
5. korvintorson 85 25.03.26 10:45 Сейчас в теме
(2) Впрочем, если он внутри интенсивно лопатит данные, которые вы сейчас храните в структуре, то да, имеет смысл использовать модуль объекта с переменными, даже в единственном экземпляре.
6. kalyaka 1158 25.03.26 13:55 Сейчас в теме
при получении формы есть неявный вызов без контекста, вполне можно рассмотреть :)
7. korvintorson 85 25.03.26 14:22 Сейчас в теме
(6) Вообще-то с контекстом, там обработчик ПриСозданииНаСервере выполняется. Но достаточно просто того факта, что это серверный вызов. Это уже исключает возможность высокочастотного создания объектов таким способом.
Плюс к тому надо еще выяснить, сколько памяти отъедает созданная форма, даже пустая. Где-то читал, что немало, но сам не проверял.
8. kalyaka 1158 25.03.26 16:09 Сейчас в теме
(7) Точно, получается с контекстом.
Ну в контексте максимизации производительности конечно не очень, а в принципе использовать можно там, где это удобно. Например это могут быть лайтовые обработки, где удобно быстро накидать код в стиле текучего интерфейса на клиенте. Скажем нужно обработать несериализуемые данные на клиенте.
9. korvintorson 85 25.03.26 16:25 Сейчас в теме
(8) Если единичный экземпляр, и без ОПП-подхода прям плохо, тогда да.
10. vandalsvq 1702 25.03.26 17:59 Сейчас в теме
А гибридная модель, с автосборкой решения?

То есть делим все на две модели:
- разработка
- использование

Для разработки, делаем клиент-серверные ОМ, то есть идем по варианту Структура. Однако, обработки создаем, реквизиты накидываем (или не накидываем, тогда см. ниже). Далее делаем сборщик проекта, он уже собирает релиз таким образом, чтобы методы конструкторы - учитывали в каком контексте выполняются и маршрутизировали между Структурой и Обработкой. Также сборщик отвечает за трансляцию методов в обработку (или цепочку обработок). Таким образом мы получаем сборку для использования, которая уже в зависимости от контекста работает каким-то путем.

Набросал на ходу, с учетом своего опыта сборки расширений, когда расширение для разработки отличается от расширения для использования
11. vandalsvq 1702 25.03.26 18:10 Сейчас в теме
(10) но сразу скажу, я сам на модели обработок сижу и это чисто серверная модель. Если мне надо где-то в КлиентСервер - это отдельные совершенно структуры, ОМ и так далее. Пусть даже с копипастом части кода. Автосборка что-то между собой перекидывает, ну так, чтобы иметь единую кодовую базу
12. korvintorson 85 25.03.26 19:36 Сейчас в теме
(10) Мне не нравятся структуры в качестве объектов, в статье я написал почему. Так что использую обработки, где это только возможно. Но вот возникла задача с множествами - мелкие объекты, которые, возможно (пока не факт) будут создаваться в значительных количествах с большой частотой. И задался вопросом, насколько это будет эффективно.
13. vandalsvq 1702 25.03.26 21:39 Сейчас в теме
(12) ну может тогда гибрид + сборщик.
14. korvintorson 85 26.03.26 00:38 Сейчас в теме
(13) посмотреть бы пример, как это выглядит
18. Darklight 37 27.03.26 12:51 Сейчас в теме
(10) Ох... как же много раз я об этом думал!
Даже хотел заменить весь ЯП 1С - на что-то на подобии Kotlin - и просто компилировать его либо в опкоды-1С (увы, лишь серверные), либо в код на ЯП 1С (компиляторы ЯП Kotlin, кстати, так и делают - для JVM и для JS соответственно - так что теоретически - это не утопия, заодно можно было и оптимизацию кода делать - на которую 1С просто забила напрочь - так что выходной код может ещё и существенно быстрее работать)!
М-да - было бы круто - но я не потяну такой проект - ну и явно встанет вопрос - а где разрабатывать в таком новом ЯП для 1С? 1C EDT расширять - боже упаси трогать эту бяку - но можно ещё в VS Code расширения написать - но всё-равно - это всё не очень удобно а качественное расширение, с поддержкой контекста конфигурации - это не хилая такая разработка!
15. o.nikolaev 217 26.03.26 18:00 Сейчас в теме
Наконец-то кто-то это проверил. Все хотел я сам проверить - а что же быстрее, но было лень. Ура, все сделалось само )
16. Alxby 1147 26.03.26 21:06 Сейчас в теме
Неплохо! А как изменятся результаты, если у обработки сделать public свойства, т.е. реквизиты обработки? А если не реквизиты, а экспортные переменные модуля объекта? А если сравнить скорость доступа извне к этим свойствам объекта-обработки со скоростью доступа к private свойствам через сеттеры/геттеры?
17. Darklight 37 27.03.26 12:38 Сейчас в теме
Эх... мечты мечты...
Сам уже несколько раз порывался перейти на кастомный квазии-ООП в 1С - даже базовые модули написал. Уж очень очень очень сильно мне не хватает ООП в 1С - прям больно и безрадостно без него! Ну ничего не могу поделать - я 100% адепт ООП, полюбил давно, ещё в школьные годы, задолго до знакомства 1С.
И я тоже задавался этой же дилеммой - обработка vs структура! Пришёл к выводу:
а. Всё же структура универсальнее и легковеснее
б. Оставить вариант поддержки реализации через обработку/форму - тоже стоит... унифицировав, по-возможности, все основные API поддержки квази-ООП независимо от фактического контейнера

У обработки есть три наиболее весомых недостатка
1. Доступность только в контексте сервера/толстого клиента! ОЧЕНЬ ВЕСОМЫЙ! Конечно, в тонком клиентском контексте аналогично можно использовать Управляемые формы...
2. Невозможность простой сериализации! Конечно руками всё модно написать - но это колоссальный труд - когда это надо не на одном двух объектах, а хотя бы на сотне? А меньше - ну это вообще какой-то детский сад - зачем тут с этим всем вообще заморачиваться!
3. Обработки засоряют дерево конфигурации - опять же - если их несколько то пофиг - но всё это затевать ради нескольких обработок - это не серьёзно - если уж выстраивать иную модель программирования - то там объекты растут как на дрожжах - и несколько тысяч в серьёзных проектах - это ещё даже не так уж много... ЭТО ОЧЕНЬ ВЫСОМЫЙ НЕДОСТАТОК! Безусловно, можно схитрить - и перейти на внешние обработки, хранимые в макетах - но тут начнутся проблемы с контролем безопасности со стороны платформы в серверном контексте... выйти за рамки безопасного режима в таких обработках будет сложно...

Помимо этого, можно ещё задаться вопросом, которым автор не соизволил задаться самостоятельно - а какие будут затраты памяти? Опять же - на десятке созданных обработок - это всё ерунда - а на сотне? А на сотне у каждого пользователя из тысячи пользователей?

Безусловно я согласен с автором - в 1С Предприятие 8 очень не хватает чего-то на подобии Класса/Объекта, желательно с ООП и контрактами/интерфейсами - но топы из компании 1С видимо так не считают - они даже в 1С Элемент/Исполнитель это не реализовали - так что это уже скорее утопия - пока ветер не переменится... а он в России меняется обычно только в одном печальном случае...
19. korvintorson 85 27.03.26 14:37 Сейчас в теме
(17) А позавчера у меня наконец дошли руки глубоко влезть в 1С Элемент.
И я обнаружил, что там есть все, о чем я писал у себя последние 3 месяца. И абстрактные интерфейсы с наследованием (контракты), и виртуальные таблицы, и функции первого класса с лямбдами. Структуры с методами. Перечисления с методами (а-ля джава). Строгая типизация. Иерархия типов.
Неприятно удивило только полное отсутствие инкапсуляции данных. Но может добавят еще.
VyacheslavShilov; +1 Ответить
23. starik-2005 3217 30.03.26 10:22 Сейчас в теме
(19)
еприятно удивило только полное отсутствие инкапсуляции данных.
А зачем? Это все в питоне есть.
20. starik-2005 3217 27.03.26 17:13 Сейчас в теме
В 1С много красивых и разных объектов. Некоторые при некотором умении можно даже на клиенте использовать: https://infostart.ru/1c/reports/2319582/
VyacheslavShilov; +1 Ответить
21. korvintorson 85 27.03.26 19:07 Сейчас в теме
(20) Кстати, а что там на счет потребления памяти экземпляром формы? Сколько змейка жрет зайцев памяти на клиенте? Я где-то читал, что форма даже пустая неплохо отъедает.
22. starik-2005 3217 30.03.26 10:21 Сейчас в теме
(21)
жрет зайцев памяти
Смотрел. Вообще немного, т.к. в форме почти нет реквизитов. Но скорость создания - да, не быстро. Но это если десятками тыщ создавать. Для змейки вполне.
Для отправки сообщения требуется регистрация/авторизация