[Замер] Соответствие в структуру
База данных - HighLoad оптимизация
Сколько себя помню, всегда, когда мне нужно было конвертировать соответствие в структуру, я использовал цикл, в котором наполнял структуру.
Результат = Новый Структура;
Для Каждого текЭлемент Из ЯСоответствие Цикл
Результат.Вставить(текЭлемент.Ключ, текЭлемент.Значение);
КонецЦикла;
Уверен, что это самый популярный вариант. Конечно, нужно быть уверенным, что в ключах нет запрещенных символов, которые не сможет переварить структура. Вообще примеров конвертации может быть очень много. Но...
Когда-то давно мне пришел в голову другой способ, который использует JSON преобразование, и только на этой неделе пришла мысль в голову, все замерить.
В замере буду использовать еще два странных варианта и вариант через ЗначениеВСтрокуВнутр (этот способ мне подсказали в Телеграм канале e1c_community). Также буду использовать вариант через JSON и XML (этот способ отсутствовал в первоначальной версии статьи, он громоздкий и содержит много замен строк).
Озвученные варианты:
Запрос = Новый Запрос;
Для Каждого текЭлемент Из ЯСоответствие Цикл
Запрос.УстановитьПараметр(текЭлемент.Ключ, текЭлемент.Значение);
КонецЦикла;
Результат = Запрос.Параметры;
НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных;
Для Каждого текЭлемент Из ЯСоответствие Цикл
НастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить(текЭлемент.Ключ, текЭлемент.Значение);
КонецЦикла;
Результат = НастройкиКомпоновкиДанных.ДополнительныеСвойства;
Или
НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных;
Результат = НастройкиКомпоновкиДанных.ДополнительныеСвойства;
Для Каждого текЭлемент Из ЯСоответствие Цикл
Результат.Вставить(текЭлемент.Ключ, текЭлемент.Значение);
КонецЦикла;
Строка = ЗначениеВСтрокуВнутр(ЯСоответствие);
СтрокаМод = СтрЗаменить(Строка, "3d48feae-a9c6-4c5a-a099-9eb6477630c6", "4238019d-7e49-4fc9-91db-b6b951d5cf8e");
Результат = ЗначениеИзСтрокиВнутр(СтрокаМод);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ЯСоответствие);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ЗаписьJSON.Закрыть());
Результат = ПрочитатьJSON(ЧтениеJSON);
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЯСоответствие);
РезультатMAP = ЗаписьXML.Закрыть();
РезультатMAP = СтрЗаменить(РезультатMAP,"<Map","<Structure");
РезультатMAP = СтрЗаменить(РезультатMAP,"</Map>","</Structure>");
РезультатMAP = СтрЗаменить(РезультатMAP,"<pair>","");
РезультатMAP = СтрЗаменить(РезультатMAP,"</pair>","</Property>");
РезультатMAP = СтрЗаменить(РезультатMAP,"<Key xsi:type=""xs:string"">","<Property name=""");
РезультатMAP = СтрЗаменить(РезультатMAP,"</Key>",""">");
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(РезультатMAP);
Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Какие замеры я решил проделать?
1 Сформировать небольшое соответствие из 10 элементов. В цикле в несколько повторений провести преобразование. Замерять только работу в цикле. Повторений будет 1, 1000 и 10000.
2 Сформировать среднее соответствие из 1000 элементов. В цикле в несколько повторений провести преобразование. Замерять только работу в цикле. Повторений будет 1 и 1000.
3 Сформировать большое соответствие из 10000 элементов. В цикле в несколько повторений провести преобразование. Замерять только работу в цикле. Повторений будет 1 и 100.
- Во всех замерах, буду включать debug, а затем выключать.
- Соответствие формирую разово и наполняю его в зависимости от указанного количества элементов.
Функция СформироватьСоответствиеСМокДанными(КоличествоЭлементов = 1)
Результат = Новый Соответствие;
ШаблонКлюча = "Эл%1";
Для счетчик = 1 По КоличествоЭлементов Цикл
Результат.Вставить(СтрШаблон(ШаблонКлюча,Формат(счетчик,"ЧН=0; ЧГ=")),?(счетчик % 2 > 0,Формат(счетчик,"ЧН=0; ЧГ="),счетчик));
КонецЦикла;
Возврат Результат;
КонецФункции
Формирую соответствие, в котором в ключ элемента будет писаться "Эл1", "Эл2"..."ЭлХ". В значение "1", 2, "3", 4, "5" и т.д
Замер 1-1 (Соответствие 10 элементов, 1 повторение)
[Debug включен]
- Запрос :0мс.
- НастройкиКомпоновкиДанных :0мс.
- Структура :0мс.
- ЗначениеВСтроку :0мс.
- XML :0мс.
- JSON :0мс.
[Debug выключен]
- Запрос :0мс.
- НастройкиКомпоновкиДанных :0мс.
- Структура :0мс.
- ЗначениеВСтроку :0мс.
- НастройкиКомпоновкиДанныхВ2 :0мс.
- JSON :0мс.
- XML :1мс.
На глаз победителя выявить не удалось, и я запустил с замером и получил самые тяжелые операции:
- СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
- СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЯСоответствие);
- НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных;
При следующих замерах будет уже более показательно.
Замер 1-2 (Соответствие 10 элементов, 1000 повторений)
[Debug включен]
- JSON :43мс.
- ЗначениеВСтроку :46мс.
- Структура :70мс.
- Запрос :115мс.
- НастройкиКомпоновкиДанных :123мс.
- XML :332мс.
[Debug выключен]
- Структура :19мс.
- JSON :22мс.
- Запрос :24мс.
- ЗначениеВСтроку :42мс.
- НастройкиКомпоновкиДанных :53мс.
- НастройкиКомпоновкиДанныхВ2 :53мс.
- XML :315мс.
Обратите внимание метод через JSON вырвался вперед при включенном debug. Почти в два раза быстрее того метода, который я использую повсеместно... Что будет дальше?
Замер 1-3 (Соответствие 10 элементов, 10000 повторений)
[Debug включен]
- JSON :318мс.
- ЗначениеВСтроку :538мс.
- Структура :622мс.
- Запрос :733мс.
- НастройкиКомпоновкиДанных :1093мс.
- XML :3366мс.
[Debug выключен]
- Структура :188мс.
- JSON :228мс.
- Запрос :313мс.
- ЗначениеВСтроку :474мс.
- НастройкиКомпоновкиДанныхВ2 :523мс.
- НастройкиКомпоновкиДанных :732мс.
- XML :3602мс.
Метод через JSON просто разорвал конкурентов cо включенным debug, но и вариант ЗначениеВСтроку выглядит интересно. С выключенным debug метод используемый мной повсеместно показал лучший результат.
Теперь увеличим количество элементов в соответствии и замерим.
Замер 2-1 (Соответствие 1000 элементов, 1 повторение)
[Debug включен]
- JSON :2мс.
- ЗначениеВСтроку :3мс.
- Запрос :6мс.
- НастройкиКомпоновкиДанных :6мс.
- Структура :7мс.
- XML :23мс.
[Debug выключен]
- JSON :1мс.
- Структура :2мс.
- НастройкиКомпоновкиДанных :2мс.
- ЗначениеВСтроку :2мс.
- НастройкиКомпоновкиДанныхВ2 :2мс.
- Запрос :3мс.
- XML :20мс.
Уже на старте JSON и ЗначениеВСтроку идут в отрыв при включенном debug.
Топ операции:
- Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
- СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЯСоответствие);
- НастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить(текЭлемент.Ключ, текЭлемент.Значение);
- Каждого текЭлемент Из ЯСоответствие Цикл
Замер 2-2 (Соответствие 1000 элементов, 1000 повторений)
[Debug включен]
- JSON :1433мс.
- ЗначениеВСтроку :2457мс.
- Структура :5915мс.
- Запрос :6384мс.
- НастройкиКомпоновкиДанных :6392мс.
- XML :28048мс.
[Debug выключен]
- JSON :1206мс.
- Структура :1629мс.
- Запрос :2071мс.
- НастройкиКомпоновкиДанных :2094мс.
- ЗначениеВСтроку :2264мс.
- НастройкиКомпоновкиДанныхВ2 :2367мс.
- XML :23069мс.
Картина, по-моему, уже ясна.
Еще увеличим количество элементов в соответствии и замерим.
Замер 3-1 (Соответствие 10000 элементов, 1 повторение)
[Debug включен]
- JSON :15мс.
- ЗначениеВСтроку :25мс.
- Структура :63мс.
- НастройкиКомпоновкиДанных :65мс.
- Запрос :66мс.
- XML :232мс.
[Debug выключен]
- JSON :13мс.
- Структура :18мс.
- НастройкиКомпоновкиДанных :20мс.
- Запрос :21мс.
- НастройкиКомпоновкиДанныхВ2 :22мс.
- ЗначениеВСтроку :23мс.
- XML :228мс.
Топ операций:
- Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
- СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЯСоответствие);
- Запрос.УстановитьПараметр(текЭлемент.Ключ, текЭлемент.Значение);
- НастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить(текЭлемент.Ключ, текЭлемент.Значение);
- Каждого текЭлемент Из ЯСоответствие Цикл
Замер 3-2 (Соответствие 10000 элементов, 100 повторений)
[Debug включен]
- JSON :1883мс.
- ЗначениеВСтроку :2931мс.
- Структура :6594мс.
- Запрос :7242мс.
- НастройкиКомпоновкиДанных :7354мс.
- XML :26675мс.
[Debug выключен]
- JSON :1542мс.
- Структура :2223мс.
- Запрос :2250мс.
- НастройкиКомпоновкиДанныхВ2 :2538мс.
- НастройкиКомпоновкиДанных :2649мс.
- ЗначениеВСтроку :2810мс.
- XML :23086мс.
| Вид замера со включенным debug | 10 элем. 1 цикл |
10 элем. 1000 циклов |
10 элем. 10000 циклов |
1000 элем. 1 цикл |
1000 элем. 1000 циклов |
10000 элем. 1 цикл |
1000 элем. 100 циклов |
| JSON | 0мс | 43мс | 318мс | 2мс | 1433мс | 15мс | 1883мс |
| Структура | 0мс | 70мс | 622мс | 7мс | 5915мс | 63мс | 6594мс |
| Запрос | 0мс | 115мс | 733мс | 6мс | 6384мс | 66мс | 7242мс |
| Настройки Компоновки Данных | 0мс | 123мс | 1093мс | 6мс | 6392мс | 65мс | 7354мс |
| ЗначениеВСтроку | 0мс | 46мс | 538мс | 3мс | 2457мс | 25мс | 2931мс |
| XML | 0мс | 332мс | 3366мс | 23мс | 28048мс | 232мс | 26675мс |
| Вид замера с выключенным debug | 10 элем. 1 цикл |
10 элем. 1000 циклов |
10 элем. 10000 циклов |
1000 элем. 1 цикл |
1000 элем. 1000 циклов |
10000 элем. 1 цикл |
1000 элем. 100 циклов |
| JSON | 0мс | 22мс | 228мс | 1мс | 1206мс | 13мс | 1542мс |
| Структура | 0мс | 19мс | 188мс | 2мс | 1629мс | 18мс | 2223мс |
| Запрос | 0мс | 24мс | 313мс | 3мс | 2071мс | 21мс | 2250мс |
| Настройки Компоновки Данных | 0мс | 53мс | 732мс | 2мс | 2094мс | 20мс | 2649мс |
| Настройки Компоновки Данных В2 | 0мс | 53мс | 523мс | 2мс | 2367мс | 22мс | 2538мс |
| ЗначениеВСтроку | 0мс | 42мс | 474мс | 2мс | 2264мс | 23мс | 2810мс |
| XML | 1мс | 315мс | 3602мс | 20мс | 23069мс | 228мс | 23086мс |
Выводы:
Судя по замерам, метод с JSON хорош как при большом числе элементов в соответствии, так и при преобразовании в цикле. Нужно учесть недостатки, что ключ должен быть строкой, в которой только разрешенные символы. Соответственно если вы уверены, что ограничения нет, то почему бы и да?
На что еще хочется обратить внимание?
Циклы работают довольно-таки долго, но СериализаторXDTO.ЗаписатьXML и СериализаторXDTO.ПрочитатьXML работает крайне медленно, я бы сказал, отвратительно.
Обратите внимание, что при включенном и выключенном debug картина меняется и в местах где используется цикл с небольшим количеством элементов в соответствии выигрывает метод через структуру в цикле.
Так же есть важный нюанс отмеченный в комментариях, чем больше символов в значениях у соответствия, тем медленнее начинает работать способ с JSON (дополнительные замеры в комментариях).
На этом статью заканчиваю. Надеюсь, она была вам полезна.
П.С. Данная статья появилась благодаря читателям моего канала, она набрала оговоренное количество эмоций.
Вступайте в нашу телеграмм-группу Инфостарт
Соответствие Структура JSON XML Запрос Трансформация НастройкиКомпоновкиДанных ЗначениеВСтрокуВнутр Замер debug
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45523 TitanLuchs 109
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46649 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26336 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40342 bayselonarrend 24
Перенос данных 1C Механизмы платформы 1С Системный администратор Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?
11.12.2023 29629 dsdred 63
Механизмы платформы 1С Разработчик Бесплатно (free)
Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?».
06.10.2023 36333 SeiOkami 48
WEB-интеграция Универсальные функции Механизмы платформы 1С Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.
28.08.2023 32055 YA_418728146 8
Механизмы платформы 1С Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать
27.06.2023 55317 SeiOkami 33
&НаСервереБезКонтекста
Функция СформироватьСоответствиеСМокДанными(КоличествоЭлементов = 1, ДобавитьУидКЗначениюСоответствия = Ложь)
Результат = Новый Соответствие;
ШаблонКлюча = "Эл%1";
Для счетчик = 1 По КоличествоЭлементов Цикл
Результат.Вставить(СтрШаблон(ШаблонКлюча,Формат(счетчик,"ЧН=0; ЧГ=")),
?(счетчик % 2 > 0,?(ДобавитьУидКЗначениюСоответствия, Строка(Новый УникальныйИдентификатор),"")+Формат(счетчик,"ЧН=0; ЧГ="),
?(ДобавитьУидКЗначениюСоответствия, Строка(Новый УникальныйИдентификатор),"")+счетчик));
КонецЦикла;
Возврат Результат;
КонецФункции
Показать10 элементов, 1000 повторений
Структура :23мс.
JSON :29мс.
Запрос :32мс.
ЗначениеВСтроку :58мс.
НастройкиКомпоновкиДанныхВ2 :60мс.
НастройкиКомпоновкиДанных :69мс.
XML :378мс.
10 элементов, 10000 повторений
Структура :234мс.
JSON :295мс.
Запрос :315мс.
ЗначениеВСтроку :553мс.
НастройкиКомпоновкиДанныхВ2 :615мс.
НастройкиКомпоновкиДанных :618мс.
XML :3769мс.
1000 элементов, 1 повторений
Структура :3мс.
Запрос :7мс.
JSON :11мс.
НастройкиКомпоновкиДанныхВ2 :33мс.
НастройкиКомпоновкиДанных :33мс.
ЗначениеВСтроку :35мс.
XML :105мс.
1000 элементов, 1000 повторений
JSON :1723мс.
Структура :1889мс.
Запрос :2350мс.
НастройкиКомпоновкиДанныхВ2 :2356мс.
НастройкиКомпоновкиДанных :2570мс.
ЗначениеВСтроку :2997мс.
XML :27021мс.
10000 элементов, 1 повторений
1 замер:
JSON :25мс.
Структура :30мс.
НастройкиКомпоновкиДанных :32мс.
НастройкиКомпоновкиДанныхВ2 :33мс.
Запрос :35мс.
ЗначениеВСтроку :56мс.
XML :377мс.
2 замер:
НастройкиКомпоновкиДанныхВ2 :21мс.
Структура :24мс.
JSON :25мс.
НастройкиКомпоновкиДанных :25мс.
Запрос :26мс.
ЗначениеВСтроку :34мс.
XML :235мс.
10000 элементов, 100 повторений
1 замер:
Структура :2408мс.
JSON :2455мс.
Запрос :2514мс.
НастройкиКомпоновкиДанныхВ2 :2621мс.
НастройкиКомпоновкиДанных :2632мс.
ЗначениеВСтроку :3579мс.
XML :25325мс.
2 замер:
НастройкиКомпоновкиДанныхВ2 :2647мс.
Структура :2751мс.
JSON :2930мс.
НастройкиКомпоновкиДанных :3312мс.
Запрос :3132мс.
ЗначениеВСтроку :3960мс.
XML :34920мс.
Действительно, чем больше символов в значении соответствия, тем медленнее начинает работать JSON.
//&НаСервереБезКонтекста
&НаСервере
Функция ИспользуемJSON(знач ЯСоответствие, КоличествоЗапусков = 1000)
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для счетчик = 1 По КоличествоЗапусков Цикл
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ЯСоответствие);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ЗаписьJSON.Закрыть());
Результат = ПрочитатьJSON(ЧтениеJSON, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект);
ЧтениеJSON.Закрыть();
КонецЦикла;
Возврат ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
КонецФункции
//&НаСервереБезКонтекста
&НаСервере
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
КонецФункции
ПоказатьС данной функцией JSONу поплохело.
10 элементов, 1000 повторений
Структура :17мс
Запрос :26мс
ЗначениеВСтроку :39мс
JSON :50мс
НастройкиКомпоновкиДанныхВ2 :52мс
НастройкиКомпоновкиДанных :53мс
XML :314мс
10 элементов, 10000 повторений
Структура :182мс.
Запрос :267мс.
ЗначениеВСтроку :442мс.
JSON :546мс.
НастройкиКомпоновкиДанныхВ2 :619мс.
НастройкиКомпоновкиДанных :624мс.
XML :3597мс.
1000 элементов, 1 повторений
Структура :3мс.
Запрос :7мс.
ЗначениеВСтроку :19мс.
JSON :19мс.
НастройкиКомпоновкиДанных :33мс.
НастройкиКомпоновкиДанныхВ2 :40мс.
XML :117мс.
1000 элементов, 1000 повторений
Структура :1680мс.
Запрос :1969мс.
НастройкиКомпоновкиДанных :2104мс.
ЗначениеВСтроку :2182мс.
НастройкиКомпоновкиДанныхВ2 :2686мс.
JSON :3621мс.
XML :26117мс.
10000 элементов, 1 повторений
Структура :18мс.
НастройкиКомпоновкиДанныхВ2 :21мс.
Запрос :23мс.
НастройкиКомпоновкиДанных :23мс.
ЗначениеВСтроку :24мс.
JSON :39мс.
XML :220мс.
НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных;
Результат = НастройкиКомпоновкиДанных.ДополнительныеСвойства;
Для Каждого текЭлемент Из ЯСоответствие Цикл
Результат.Вставить(текЭлемент.Ключ, текЭлемент.Значение);
КонецЦикла;
10 элементов, 1000 повторений
НастройкиКомпоновкиДанных :100мс.
НастройкиКомпоновкиДанныхВ2 :100мс.
JSON :34мс.
10 элементов, 10000 повторений
1 замер:
НастройкиКомпоновкиДанных :998мс.
НастройкиКомпоновкиДанныхВ2 :1065мс.
JSON :333мс.
2 замер:
НастройкиКомпоновкиДанных :1146мс.
НастройкиКомпоновкиДанныхВ2 :1125мс.
JSON :393мс.
3 замер:
НастройкиКомпоновкиДанных :998мс.
НастройкиКомпоновкиДанныхВ2 :1026мс.
JSON :346мс.
1000 элементов, 1 повторений
НастройкиКомпоновкиДанных :6мс.
НастройкиКомпоновкиДанныхВ2 :6мс.
JSON :1мс.
1000 элементов, 1000 повторений
1 замер:
НастройкиКомпоновкиДанных :7432мс.
НастройкиКомпоновкиДанныхВ2 :7712мс.
JSON :1638мс.
2 замер:
НастройкиКомпоновкиДанных :6124мс.
НастройкиКомпоновкиДанныхВ2 :5998мс.
JSON :1361мс.
3 замер:
НастройкиКомпоновкиДанных :7459мс.
НастройкиКомпоновкиДанныхВ2 :7141мс.
JSON :1825мс.
10000 элементов, 1 повторений
1 замер:
НастройкиКомпоновкиДанных :65мс.
НастройкиКомпоновкиДанныхВ2 :64мс.
JSON :15мс.
2 замер:
НастройкиКомпоновкиДанных :70мс.
НастройкиКомпоновкиДанныхВ2 :65мс.
JSON :20мс.
3 замер:
НастройкиКомпоновкиДанных :81мс.
НастройкиКомпоновкиДанныхВ2 :82мс.
JSON :20мс.
10000 элементов, 100 повторений
1 замер:
НастройкиКомпоновкиДанных :7787мс.
НастройкиКомпоновкиДанныхВ2 :7332мс.
JSON :1645мс.
2 замер:
НастройкиКомпоновкиДанных :6665мс.
НастройкиКомпоновкиДанныхВ2 :7015мс.
JSON :1897мс.
3 замер:
НастройкиКомпоновкиДанных :7056мс.
НастройкиКомпоновкиДанныхВ2 :6429мс.
JSON :1822мс.
Местами быстрее, а местами медленнее. Видимо цикл вводит неопределённость.
Если ее запретить, то увидишь совсем другие результаты для циклов.
Ну или просто можно проверить однострочный вариант цикла
Для Каждого текЭлемент Из Соответствие Цикл Структура.Вставить(текЭлемент.Ключ, текЭлемент.Значение) КонецЦикла;
Тут скорость будет та же что и у JSON.
Подробнее тут
JSON: 201
Классический: 168
&НаКлиенте
Перем
Соответствие;
&НаКлиенте
Процедура Классический(Команда)
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Результат = Новый Структура;
Для Каждого КлючИЗначение Из Соответствие Цикл Результат.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение) КонецЦикла;
ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
Сообщить("Классический: " + ВремяВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура ЧерезJSON(Команда)
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Соответствие);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ЗаписьJSON.Закрыть());
Результат = ПрочитатьJSON(ЧтениеJSON);
ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
Сообщить("JSON: " + ВремяВыполнения);
КонецПроцедуры
&НаКлиенте
Процедура СформироватьСоответствие(Команда)
Соответствие = Новый Соответствие;
Для Сч = 1 По 100000 Цикл
Соответствие.Вставить("Ключ" + XMLСтрока(Сч), XMLСтрока(Новый УникальныйИдентификатор));
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СформироватьСоответствие("")
КонецПроцедуры Показать
&НаСервереБезКонтекста
Функция СформироватьСоответствиеСМокДанными(КоличествоЭлементов = 1, ДобавитьУидКЗначениюСоответствия = Ложь)
Результат = Новый Соответствие;
ШаблонКлюча = "Эл%1";
Для счетчик = 1 По КоличествоЭлементов Цикл
Результат.Вставить(СтрШаблон(ШаблонКлюча,Формат(счетчик,"ЧН=0; ЧГ=")),
?(счетчик % 2 > 0,?(ДобавитьУидКЗначениюСоответствия, Строка(Новый УникальныйИдентификатор),"")+Формат(счетчик,"ЧН=0; ЧГ="),
?(ДобавитьУидКЗначениюСоответствия, Строка(Новый УникальныйИдентификатор),"")+счетчик));
КонецЦикла;
Возврат Результат;
КонецФункции
Показать10 элементов, 1000 повторений
Структура :23мс.
JSON :29мс.
Запрос :32мс.
ЗначениеВСтроку :58мс.
НастройкиКомпоновкиДанныхВ2 :60мс.
НастройкиКомпоновкиДанных :69мс.
XML :378мс.
10 элементов, 10000 повторений
Структура :234мс.
JSON :295мс.
Запрос :315мс.
ЗначениеВСтроку :553мс.
НастройкиКомпоновкиДанныхВ2 :615мс.
НастройкиКомпоновкиДанных :618мс.
XML :3769мс.
1000 элементов, 1 повторений
Структура :3мс.
Запрос :7мс.
JSON :11мс.
НастройкиКомпоновкиДанныхВ2 :33мс.
НастройкиКомпоновкиДанных :33мс.
ЗначениеВСтроку :35мс.
XML :105мс.
1000 элементов, 1000 повторений
JSON :1723мс.
Структура :1889мс.
Запрос :2350мс.
НастройкиКомпоновкиДанныхВ2 :2356мс.
НастройкиКомпоновкиДанных :2570мс.
ЗначениеВСтроку :2997мс.
XML :27021мс.
10000 элементов, 1 повторений
1 замер:
JSON :25мс.
Структура :30мс.
НастройкиКомпоновкиДанных :32мс.
НастройкиКомпоновкиДанныхВ2 :33мс.
Запрос :35мс.
ЗначениеВСтроку :56мс.
XML :377мс.
2 замер:
НастройкиКомпоновкиДанныхВ2 :21мс.
Структура :24мс.
JSON :25мс.
НастройкиКомпоновкиДанных :25мс.
Запрос :26мс.
ЗначениеВСтроку :34мс.
XML :235мс.
10000 элементов, 100 повторений
1 замер:
Структура :2408мс.
JSON :2455мс.
Запрос :2514мс.
НастройкиКомпоновкиДанныхВ2 :2621мс.
НастройкиКомпоновкиДанных :2632мс.
ЗначениеВСтроку :3579мс.
XML :25325мс.
2 замер:
НастройкиКомпоновкиДанныхВ2 :2647мс.
Структура :2751мс.
JSON :2930мс.
НастройкиКомпоновкиДанных :3312мс.
Запрос :3132мс.
ЗначениеВСтроку :3960мс.
XML :34920мс.
Действительно, чем больше символов в значении соответствия, тем медленнее начинает работать JSON.
А в джейсоне я смогу это увидеть, только если добавлю пустую функцию обработки ошибки - туда прилетит невалидное свойство для обработки.
Так понятно мысль изложил?
В жизни не бывает "если" все хорошо. Добавлять функцию чаще всего приходится по разным причинам.
Вот я предлагаю проверить еще с пустой функцией обработки ошибок, но с валидными данными. Исказятся ли замеры?
для справки, все знают - СокрЛП - возвращает из любого типа - "строку"
//&НаСервереБезКонтекста
&НаСервере
Функция ИспользуемJSON(знач ЯСоответствие, КоличествоЗапусков = 1000)
ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для счетчик = 1 По КоличествоЗапусков Цикл
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ЯСоответствие);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ЗаписьJSON.Закрыть());
Результат = ПрочитатьJSON(ЧтениеJSON, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект);
ЧтениеJSON.Закрыть();
КонецЦикла;
Возврат ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
КонецФункции
//&НаСервереБезКонтекста
&НаСервере
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
КонецФункции
ПоказатьС данной функцией JSONу поплохело.
10 элементов, 1000 повторений
Структура :17мс
Запрос :26мс
ЗначениеВСтроку :39мс
JSON :50мс
НастройкиКомпоновкиДанныхВ2 :52мс
НастройкиКомпоновкиДанных :53мс
XML :314мс
10 элементов, 10000 повторений
Структура :182мс.
Запрос :267мс.
ЗначениеВСтроку :442мс.
JSON :546мс.
НастройкиКомпоновкиДанныхВ2 :619мс.
НастройкиКомпоновкиДанных :624мс.
XML :3597мс.
1000 элементов, 1 повторений
Структура :3мс.
Запрос :7мс.
ЗначениеВСтроку :19мс.
JSON :19мс.
НастройкиКомпоновкиДанных :33мс.
НастройкиКомпоновкиДанныхВ2 :40мс.
XML :117мс.
1000 элементов, 1000 повторений
Структура :1680мс.
Запрос :1969мс.
НастройкиКомпоновкиДанных :2104мс.
ЗначениеВСтроку :2182мс.
НастройкиКомпоновкиДанныхВ2 :2686мс.
JSON :3621мс.
XML :26117мс.
10000 элементов, 1 повторений
Структура :18мс.
НастройкиКомпоновкиДанныхВ2 :21мс.
Запрос :23мс.
НастройкиКомпоновкиДанных :23мс.
ЗначениеВСтроку :24мс.
JSON :39мс.
XML :220мс.
текСоответствие = Новый Соответствие;
//здесь заполняем соответствие
//...
Рез = Новый Структура;
Для Каждого Индекс = 0 По текСоответствие.Количество()-1 Цикл
текКлюч = текСоответствие[Индекс].Ключ;
//здесь дополнительно переводим ключ в тип Строка и проводим валидацию ключа - например, удаляем запрещенные символы
//...
текЗначение = текСоответствие[Индекс].Значение;
//здесь дополнительно накладываем отбор и фильтрацию на значение, если нужны определенные значения
//...
Если Рез.Свойство(текКлюч) Тогда
//наложение и задвоение ключей - возможна потеря информации для ключей ссылочного типа
Иначе
Рез.Вставить(текКлюч, текЗначение);
КонецЕсли;
КонецЦикла;
ПоказатьНе замерял, но странно.
Чаще всего для тех мест где нужны ключи без различных символов. В соответствии в ключ можно почти что угодно записать.
Вообще не обращайте внимание это не частая задача, но когда понадобится вы статью вспомните.
Не воспринимайте как критику, такие статьи с замерами мне в общем нравятся, информация ценная.
ЗЫ: И да, есть с соответствием (unorderedmap) одна нехорошая штукуевина - перестройка хеша. Причина - достижение уровня коллизий в Х% (мелкомягкие на своем сайте пишут, при при 30% коллизий оно становится медленнее двоичного поиска, который, имха, работает в структуре).
для решения данной задачи я использовал Соот-е для хранения всех объектов метаданных конфигурации, в значениях хранятся Структуры.
При решении задачи понял, что любое дерево легко представить в виде структуры, но не в виде соот-я.
Вообще, формат джейсон больше похож на структуру, чем на соот-е. И умение манипулировать соот-ем и структурой всегда будет выделять разработчика 1ссреди остальных.
Вот в этой статье широко используется коллаборация структуры и соот-я
в моей практике приходилось создавать скелет, ключами которого становились наименования реквизитов - то есть строковые ключи использовались, поэтому излишне было использовать соответствие.
наверное, я хотел сказать, что в задачах с графами и деревьями для хранения информации и сведений - эти самые графы и деревья можно хранить в виде Структур (в терминах 1С).
Предположу, что для каких -то задач было бы полезно хранить деревья в виде Соотв-я (в терминах 1С). Как следствие, может возникнуть задача - для одной задачи хранить дерево в виде Структуры, для другой подзадачи - хранить в виде Соот-я. И между подзадачами требуется конвертировать один формат в другой... Это к вопросу - зачем конвертировать Соот-е в Струк.
СтруктураСоответствий = Новый Структура;
СоответствиеСтруктур = Новый Соответствие;
СтруктураСоответствий.Вставить("Один", "Один");
СтруктураСоответствий.Вставить("Два", "Два");
СтруктураСоответствий.Вставить("Три", "Три");
СтруктураСоответствий.Вставить("Четыре", "Четыре");
Для Каждого Стр из СтруктураСоответствий Цикл
СоответствиеСтруктур.Вставить(Стр.Ключ, Стр.Значение);
КонецЦикла;
СтруктураСоответствий.Вставить("СС", СоответствиеСтруктур);
СоответствиеСтруктур.Вставить("СС", СтруктураСоответствий);
//Интересно получается при вычислении структуры из соответствия и наоборот
//СоответствиеСтруктур[0].Значение[4].Значение[0].Значение[4].Значение[0].Значение[4].Значение[0].Значение[4].Значение[0]
Показать1с не про скорость, все используют 1й вариант - он прост, понятен и достаточен. Разница в какие-то мс - смешно.
Мне лично грустно за людей у которых отсутствует желание, что-то проверить, провести эксперимент. Когда работа превращается в однообразие последовательных действий не вызывающих ни каких желаний и чувств, невольно превращаешься в робота...
А ваш пример самый простой, и как мне показалось, бесполезный на практике.
Прошу замерить и добавить.
Поток = Новый ПотокВПамяти;
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьПоток(Поток);
ЗаписатьJSON(ЗаписьJSON, ЯСоответствие);
ЗаписьJSON.Закрыть();
Поток.Перейти(0, ПозицияВПотоке.Начало);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Поток);
Результат = ПрочитатьJSON(ЧтениеJSON);
Показать10 элементов, 1000 повторений
Структура :55мс.
JSON :73мс.
Запрос :87мс.
ЗначениеВСтроку :117мс.
JSONВ2 :140мс.
НастройкиКомпоновкиДанныхВ2 :161мс.
НастройкиКомпоновкиДанных :181мс.
XML :1001мс.
10 элементов, 10000 повторений
JSON :736мс.
Структура :941мс.
Запрос :971мс.
ЗначениеВСтроку :1543мс.
JSONВ2 :1622мс.
НастройкиКомпоновкиДанных :2088мс.
НастройкиКомпоновкиДанныхВ2 :2171мс.
XML :12660мс.
1000 элементов, 1 повторений
JSONВ2 :4мс.
JSON :4мс.
Структура :4мс.
НастройкиКомпоновкиДанных :5мс.
Запрос :6мс.
ЗначениеВСтроку :6мс.
НастройкиКомпоновкиДанныхВ2 :7мс.
XML :58мс.
1000 элементов, 1000 повторений
JSON :1107мс.
Структура :1667мс.
Запрос :2017мс.
НастройкиКомпоновкиДанных :2031мс.
JSONВ2 :2156мс.
ЗначениеВСтроку :2710мс.
НастройкиКомпоновкиДанныхВ2 :3733мс.
XML :31898мс.
10000 элементов, 1 повторений
JSON :31мс.
Структура :44мс.
JSONВ2 :50мс.
Запрос :55мс.
ЗначениеВСтроку :59мс.
НастройкиКомпоновкиДанных :64мс.
НастройкиКомпоновкиДанныхВ2 :71мс.
XML :636мс.
Когда меня пошлют подальше и скажут "делай, я сказал", я сделаю циклом и только циклом. Почему? Да набарахтался уже с этими 1С-извращениями вроде ТабличныйДокумент в ТаблицаЗначений через ПостроительЗапроса... Кроме "типа" лаконичного кода, никаких особенно плюсов...
Когда мне скажут "ускоряй на 2 секунды а то зарежем", я уже сам пошлю всех подальше и уволюсь нафиг))) потому что 1С это 1С, скорость у нее понятная и конкретная, и заниматься извращениями чтобы выиграть 2 секунды на каком-то сферическом объеме, ну такое себе...
Это лирика... Статья интересная, аффтар красавчег, пеши исчо!!!
Тут вы указали только про Ключ и это касается любого способа преобразования. А в качестве Значения не пройдет только для JSON.
В остальном спасибо за статью. Может где-то потребуется оптимизировать выполнение процедуры и тогда можно будет вспомнить про все методы, указанные в статье и что-то применить.
Писал долго, но смыл улавливаете? Я иногда встречаю здесь описание удивительных технологий, вызывающих устойчивое напоминание о "...усердии, достойном лучшего применения..."
Успокойтесь, пользователь не заметит - какими спичками вы жонглируете)
Я написал прагматичное решение для реально существующего процесса.
Так что, спасибо за "детонатор"))
Я переписал эту часть расчётов в типовой конфигурации, а в статье подробно описал - где и как. Код открытый - приводится для примера.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 2227620
Создание 02.11.24 10:00
Обновление 02.11.24 10:00
Просмотры 9170
Загрузки 0
Рейтинг
31
Комментарии 78
Код открыт Да
Рубрики Механизмы платформы 1С HighLoad оптимизация
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)