[Замер] Соответствие в структуру

02.11.24

База данных - 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(ЧтениеJSON);

 

 
Способ через XML:
Запись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 включен]

  1. Запрос :0мс.
  2. НастройкиКомпоновкиДанных :0мс.
  3. Структура :0мс.
  4. ЗначениеВСтроку :0мс.
  5. XML :0мс.
  6. JSON :0мс.

 

[Debug выключен]

  1. Запрос :0мс.
  2. НастройкиКомпоновкиДанных :0мс.
  3. Структура :0мс.
  4. ЗначениеВСтроку :0мс.
  5. НастройкиКомпоновкиДанныхВ2 :0мс.
  6. JSON :0мс.
  7. XML :1мс.

 

На глаз победителя выявить не удалось, и я запустил с замером и получил самые тяжелые операции:

  1. СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
  2. СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЯСоответствие);
  3. НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных;        

 

При следующих замерах будет уже более показательно.

 

Замер 1-2 (Соответствие 10 элементов, 1000 повторений)

[Debug включен]

  1. JSON :43мс.
  2. ЗначениеВСтроку :46мс.
  3. Структура :70мс.
  4. Запрос :115мс.
  5. НастройкиКомпоновкиДанных :123мс.
  6. XML :332мс.

 

[Debug выключен]

  1. Структура :19мс.
  2. JSON :22мс.
  3. Запрос :24мс.
  4. ЗначениеВСтроку :42мс.
  5. НастройкиКомпоновкиДанных :53мс.
  6. НастройкиКомпоновкиДанныхВ2 :53мс.
  7. XML :315мс.

 

Обратите внимание метод через JSON вырвался вперед при включенном debug. Почти в два раза быстрее того метода, который я использую повсеместно... Что будет дальше?

 

Замер 1-3 (Соответствие 10 элементов, 10000 повторений)

[Debug включен]

  1. JSON :318мс.
  2. ЗначениеВСтроку :538мс.
  3. Структура :622мс.
  4. Запрос :733мс.
  5. НастройкиКомпоновкиДанных :1093мс.
  6. XML :3366мс.

 

[Debug выключен]

  1. Структура :188мс.
  2. JSON :228мс.
  3. Запрос :313мс.
  4. ЗначениеВСтроку :474мс.
  5. НастройкиКомпоновкиДанныхВ2 :523мс.
  6. НастройкиКомпоновкиДанных :732мс.
  7. XML :3602мс.

 

Метод через JSON просто разорвал конкурентов cо включенным debug, но и вариант ЗначениеВСтроку выглядит интересно. С выключенным debug метод используемый мной повсеместно показал лучший результат.

 

Теперь увеличим количество элементов в соответствии и замерим.

 

Замер 2-1 (Соответствие 1000 элементов, 1 повторение)

[Debug включен]

  1. JSON :2мс.
  2. ЗначениеВСтроку :3мс.
  3. Запрос :6мс.
  4. НастройкиКомпоновкиДанных :6мс.
  5. Структура :7мс.
  6. XML :23мс.

 

[Debug выключен]

  1. JSON :1мс.
  2. Структура :2мс.
  3. НастройкиКомпоновкиДанных :2мс.
  4. ЗначениеВСтроку :2мс.
  5. НастройкиКомпоновкиДанныхВ2 :2мс.
  6. Запрос :3мс.
  7. XML :20мс.

 

Уже на старте JSON и ЗначениеВСтроку идут в отрыв при включенном debug.

 

Топ операции:

  1. Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
  2. СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЯСоответствие);       
  3. НастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить(текЭлемент.Ключ, текЭлемент.Значение);      
  4. Каждого текЭлемент Из ЯСоответствие Цикл

 

Замер 2-2 (Соответствие 1000 элементов, 1000 повторений)

[Debug включен]

  1. JSON :1433мс.
  2. ЗначениеВСтроку :2457мс.
  3. Структура :5915мс.
  4. Запрос :6384мс.
  5. НастройкиКомпоновкиДанных :6392мс.
  6. XML :28048мс.

 

[Debug выключен]

  1. JSON :1206мс.
  2. Структура :1629мс.
  3. Запрос :2071мс.
  4. НастройкиКомпоновкиДанных :2094мс.
  5. ЗначениеВСтроку :2264мс.
  6. НастройкиКомпоновкиДанныхВ2 :2367мс.
  7. XML :23069мс.

 

Картина, по-моему, уже ясна.

 

Еще увеличим количество элементов в соответствии и замерим.

 

Замер 3-1 (Соответствие 10000 элементов, 1 повторение)

[Debug включен]

  1. JSON :15мс.
  2. ЗначениеВСтроку :25мс.
  3. Структура :63мс.
  4. НастройкиКомпоновкиДанных :65мс.
  5. Запрос :66мс.
  6. XML :232мс.

 

[Debug выключен]

  1. JSON :13мс.
  2. Структура :18мс.
  3. НастройкиКомпоновкиДанных :20мс.
  4. Запрос :21мс.
  5. НастройкиКомпоновкиДанныхВ2 :22мс.
  6. ЗначениеВСтроку :23мс.
  7. XML :228мс.

 

Топ операций:

  1. Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
  2. СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ЯСоответствие);
  3. Запрос.УстановитьПараметр(текЭлемент.Ключ, текЭлемент.Значение);
  4. НастройкиКомпоновкиДанных.ДополнительныеСвойства.Вставить(текЭлемент.Ключ, текЭлемент.Значение);
  5. Каждого текЭлемент Из ЯСоответствие Цикл

 

Замер 3-2 (Соответствие 10000 элементов, 100 повторений)

[Debug включен]

  1. JSON :1883мс.
  2. ЗначениеВСтроку :2931мс.
  3. Структура :6594мс.
  4. Запрос :7242мс.
  5. НастройкиКомпоновкиДанных :7354мс.
  6. XML :26675мс.

 

[Debug выключен]

  1. JSON :1542мс.
  2. Структура :2223мс.
  3. Запрос :2250мс.
  4. НастройкиКомпоновкиДанныхВ2 :2538мс.
  5. НастройкиКомпоновкиДанных :2649мс.
  6. ЗначениеВСтроку :2810мс.
  7. 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

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    8332    bayselonarrend    20    

156

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    12758    257    ZAOSTG    84    

115

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24320    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15386    YA_418728146    7    

169

Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    26737    SeiOkami    32    

115

Запросы HighLoad оптимизация Программист Запросы Бесплатно (free)

Многие знают, что для ускорения работы запроса нужно «изучить план». При этом сам план обычно обескураживает: куча разноцветных иконок и стрелочек; ничего не понятно, но очень интересно! Аналитик производительности Александр Денисов на конференции Infostart Event 2021 Moscow Premiere рассказал, как выполняется план запроса и что нужно сделать, чтобы с его помощью находить проблемы производительности.

20.06.2023    29296    Филин    37    

118

Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Мало кто знает, что поле "Глобального поиска" в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.

27.03.2023    8810    SeiOkami    10    

143
Отзывы
13. dsdred 3645 02.11.24 14:47 Сейчас в теме
(12)
Я как бы намекаю, может быть выложите обработку, которой замеры делаются.

Пожалуйста, берите.
Прикрепленные файлы:
СоответствиеВСтруктуру.epf
18. dsdred 3645 02.11.24 16:09 Сейчас в теме
(14) Сделал в обработке галочку (УИ в значение соответствия) добавляет УТ + Счетчик и отключил debug
&НаСервереБезКонтекста
Функция СформироватьСоответствиеСМокДанными(КоличествоЭлементов = 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.
33. dsdred 3645 03.11.24 20:22 Сейчас в теме
(21) Код:
//&НаСервереБезКонтекста
&НаСервере
Функция Используем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мс.
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ixijixi 1932 02.11.24 11:24 Сейчас в теме
Не берусь утверждать на 100%, но возможно такой вариант НастройкиКомпоновкиДанных будет немного быстрее
НастройкиКомпоновкиДанных = Новый НастройкиКомпоновкиДанных;
Результат = НастройкиКомпоновкиДанных.ДополнительныеСвойства;
Для Каждого текЭлемент Из ЯСоответствие Цикл 
        Результат.Вставить(текЭлемент.Ключ, текЭлемент.Значение);             
КонецЦикла;
2. dsdred 3645 02.11.24 12:31 Сейчас в теме
(1) Сейчас измерим. Отпишусь.
3. dsdred 3645 02.11.24 13:17 Сейчас в теме
(1) НастройкиКомпоновкиДанныхВ2 - это метод с вашим кодом

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мс.


Местами быстрее, а местами медленнее. Видимо цикл вводит неопределённость.
8. ixijixi 1932 02.11.24 14:32 Сейчас в теме
(3) Спасибо. В основном быстрее, но в пределах погрешности, КМК. Можно пренебречь)
4. tormozit 7238 02.11.24 13:44 Сейчас в теме
Опять статья с замерами с разрешенной отладкой =(
Если ее запретить, то увидишь совсем другие результаты для циклов.
Ну или просто можно проверить однострочный вариант цикла
Для Каждого текЭлемент Из Соответствие Цикл Структура.Вставить(текЭлемент.Ключ, текЭлемент.Значение) КонецЦикла;

Тут скорость будет та же что и у JSON.
Подробнее тут https://infostart.ru/1c/articles/1732527/
Serg2000mr; s22; dsdred; +3 Ответить
5. dsdred 3645 02.11.24 13:46 Сейчас в теме
(4) Сейчас проверим. Отпишусь.
6. dsdred 3645 02.11.24 14:13 Сейчас в теме
(4) Debug отключил. Измерил и статью обновил.
7. SlavaKron 02.11.24 14:14 Сейчас в теме
Проверил на файловой без отладки.
JSON: 201
Классический: 168
&НаКлиенте
Перем
	Соответствие;

&НаКлиенте
Процедура Классический(Команда)
	ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	Результат = Новый Структура;
	Для Каждого КлючИЗначение Из Соответствие Цикл Результат.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение) КонецЦикла;
	ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
	Сообщить("Классический: " + ВремяВыполнения);
КонецПроцедуры

&НаКлиенте
Процедура ЧерезJSON(Команда)
	ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, Соответствие);
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(ЗаписьJSON.Закрыть());
	Результат = ПрочитатьJSON(ЧтениеJSON);
	ВремяВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала;
	Сообщить("JSON: " + ВремяВыполнения);
КонецПроцедуры

&НаКлиенте
Процедура СформироватьСоответствие(Команда)
	Соответствие = Новый Соответствие;
	Для Сч = 1 По 100000 Цикл
		Соответствие.Вставить("Ключ" + XMLСтрока(Сч), XMLСтрока(Новый УникальныйИдентификатор));
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	СформироватьСоответствие("")
КонецПроцедуры
Показать
10. dsdred 3645 02.11.24 14:33 Сейчас в теме
(7) Спасибо. Файловый не пробовал. Не встречаю по работе файловые базы.
12. SlavaKron 02.11.24 14:42 Сейчас в теме
(10) Ок, Клиент-Сервер:
JSON: 248
Классический: 202
Я как бы намекаю, может быть выложите обработку, которой замеры делаются.
13. dsdred 3645 02.11.24 14:47 Сейчас в теме
(12)
Я как бы намекаю, может быть выложите обработку, которой замеры делаются.

Пожалуйста, берите.
Прикрепленные файлы:
СоответствиеВСтруктуру.epf
14. SlavaKron 02.11.24 14:56 Сейчас в теме
(13)
?(счетчик % 2 > 0,Формат(счетчик,"ЧН=0; ЧГ="),счетчик)
Понятно. Чуть увеличьте значение элементов хотя бы до 36 символов и увидите разницу. Скорость преобразования JSON сильнее зависит от фактического объема данных.
15. dsdred 3645 02.11.24 14:57 Сейчас в теме
(14) Хорошо, сделаю. Отпишусь.
18. dsdred 3645 02.11.24 16:09 Сейчас в теме
(14) Сделал в обработке галочку (УИ в значение соответствия) добавляет УТ + Счетчик и отключил debug
&НаСервереБезКонтекста
Функция СформироватьСоответствиеСМокДанными(КоличествоЭлементов = 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.
9. ixijixi 1932 02.11.24 14:33 Сейчас в теме
Дмитрий, не сочтите за наглость - а можно в таблицу свести результаты? Так нагляднее будет.
11. dsdred 3645 02.11.24 14:34 Сейчас в теме
(9) Конечно можно.
Сейчас набросаю.
16. dsdred 3645 02.11.24 15:46 Сейчас в теме
(9) Добавил сводные таблицы
17. ixijixi 1932 02.11.24 15:49 Сейчас в теме
(16) Благодарю премного!
61. starik-2005 3092 12.11.24 11:01 Сейчас в теме
(9)
а можно в таблицу свести результаты?
А зачем останавливаться? Даешь график!
62. dsdred 3645 12.11.24 12:54 Сейчас в теме
63. starik-2005 3092 12.11.24 13:16 Сейчас в теме
19. nvv1970 02.11.24 17:39 Сейчас в теме
Json без фукнции обработки ошибок - "время поиска ошибки в джейсоне на ветер".
А как поведет себя json при добавлении фукнции? Не замедлится ли?
20. dsdred 3645 02.11.24 17:44 Сейчас в теме
(19) я написал про это. Что подходит только если уверен что строка и не содержит неразрешенные символы.
По большему счету в любом из перечисленных способов нужна проверка.
21. nvv1970 02.11.24 17:52 Сейчас в теме
(20) Когда я напишу простой обход структуры/соответсвия и мой код свалится на невалидном ключе - я его смогу отладить. Дополнительных действий для отладки мне не потребуется. Я спокойно остановлюсь на ошибке и увижу какой ключ вызывает исключение.
А в джейсоне я смогу это увидеть, только если добавлю пустую функцию обработки ошибки - туда прилетит невалидное свойство для обработки.
Так понятно мысль изложил?

В жизни не бывает "если" все хорошо. Добавлять функцию чаще всего приходится по разным причинам.
Вот я предлагаю проверить еще с пустой функцией обработки ошибок, но с валидными данными. Исказятся ли замеры?
artbear; RustIG; Артано; +3 Ответить
22. dsdred 3645 02.11.24 17:56 Сейчас в теме
26. dsdred 3645 02.11.24 20:25 Сейчас в теме
(21) я правильно понимаю речь идет про ФункцияПреобразованияЗаписи?
Или какой-то другой вариант?
31. nvv1970 02.11.24 22:24 Сейчас в теме
(26) ПрочитатьJSON( , , , , ИмяФункцииВосстановления, , , )
32. dsdred 3645 03.11.24 00:57 Сейчас в теме
(31)Я все функции вызывал без контекста. У данной функции: Использование функции вне контекста не допускается.

Для такого эксперимента придется все функции вне контекста вызывать.

Ладно, завтра проверю.
23. aximo 2101 02.11.24 20:01 Сейчас в теме
Вместо «ЗначениеВСтроку» можно использовать «СокрЛП»

Не увидел версию платформы, возможно результаты меняются от версии к версии
24. dsdred 3645 02.11.24 20:04 Сейчас в теме
(23) непонял как СокрЛП заменит ЗначениеВСтроку?

Версия 8.3.24.1548
25. aximo 2101 02.11.24 20:24 Сейчас в теме
(24) ваша правда, ЗначениеВСтрокуВнутр - есть такая функция, я обратил внимание на ваши примеры, где "ЗначениеВСтроку" - такой функции нет, но я и сам никогда не применял подобное.

для справки, все знают - СокрЛП - возвращает из любого типа - "строку"
27. dsdred 3645 02.11.24 20:27 Сейчас в теме
(25) Про СокрЛП все знают. Удаляет пробелы слева и справа. Но в моих примерах нет такой надобности.
28. aximo 2101 02.11.24 20:29 Сейчас в теме
(27) с преобразованием типа
29. Трактор 1254 02.11.24 21:36 Сейчас в теме
Если заняться нечем, то вполне годное развлечение. Одобряю.
30. dsdred 3645 02.11.24 22:12 Сейчас в теме
(29) В точку. У меня отдых организованный самим себе, поэтому и развлекаюсь.
34. RustIG 1752 05.11.24 11:53 Сейчас в теме
(29) помогает разгрузить мозг и отвлечься от сложных людей - и по сути сконцентрироваться на позитивном :)
тот случай - когда любимое хобби = работа
Трактор; dsdred; +2 Ответить
36. dsdred 3645 05.11.24 11:56 Сейчас в теме
(34) Точно подмечено.
Это кайфово, когда ночью решил провести пару экспериментов, но чутка увлекся. Выключаешь комп, а на улице уже утро ;))
33. dsdred 3645 03.11.24 20:22 Сейчас в теме
(21) Код:
//&НаСервереБезКонтекста
&НаСервере
Функция Используем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мс.
35. RustIG 1752 05.11.24 11:54 Сейчас в теме
текСоответствие = Новый Соответствие; 

//здесь заполняем соответствие
//...

Рез = Новый Структура; 
Для Каждого Индекс = 0 По текСоответствие.Количество()-1 Цикл
	
	текКлюч = текСоответствие[Индекс].Ключ; 

	//здесь дополнительно переводим ключ в тип Строка и проводим валидацию ключа - например, удаляем запрещенные символы
	//...
	
	текЗначение = текСоответствие[Индекс].Значение;
	
	//здесь дополнительно накладываем отбор и фильтрацию на значение, если нужны определенные значения
	//...
	
	Если Рез.Свойство(текКлюч) Тогда
		//наложение и задвоение ключей - возможна потеря информации для ключей ссылочного типа
	Иначе 
		Рез.Вставить(текКлюч, текЗначение);
	КонецЕсли;      

КонецЦикла;
Показать
37. Serg2000mr 740 05.11.24 13:36 Сейчас в теме
У меня вопрос - зачем вообще бывает нужно конвертировать соответствие в структуру? Ни разу не сталкивался с такой задачей. Поиск по соответствию работает на 15-20% быстрее, чем по структуре, поэтому там где можно всегда использую именно его.
zqzq; SerVer1C; +2 Ответить
38. dsdred 3645 05.11.24 13:43 Сейчас в теме
(37)
Поиск по соответствию работает на 15-20% быстрее

Не замерял, но странно.

зачем вообще бывает нужно конвертировать соответствие в структуру?

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

Вообще не обращайте внимание это не частая задача, но когда понадобится вы статью вспомните.
39. Serg2000mr 740 05.11.24 14:58 Сейчас в теме
(38) Я когда-то заинтересовался соответствием после этой статьи https://infostart.ru/1c/articles/340587/. Производил замеры для сравнения со структурой.

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

Не воспринимайте как критику, такие статьи с замерами мне в общем нравятся, информация ценная.
40. dsdred 3645 05.11.24 14:59 Сейчас в теме
(39) Посмотрю статью. Спасибо.
Serg2000mr; +1 Ответить
64. starik-2005 3092 12.11.24 13:32 Сейчас в теме
(38)
Не замерял, но странно.
Почему? Соответствие - это unorderedmap, использующий хештаблицу для поиска. При определенном удачном положении меркурия отнсительно юпитера дает эффективность О(1) при некоторой вычислительной нагрузке на расчет хеша, которая не сильно больше нагрузки проверки сильно разных строк. Т.е. один раз вычисляется хеш ключа и, если боги окажутся благосклонны, то хеш этот не будет иметь коллизий, что приведет к О(1). Но надеяться на О(1) - это такое, ибо для хеша приличной вариативности нужно очень много памяти (ибо, скажу по секрету, хеш - это 16-24 битный индекс массива указателей на массив).

ЗЫ: И да, есть с соответствием (unorderedmap) одна нехорошая штукуевина - перестройка хеша. Причина - достижение уровня коллизий в Х% (мелкомягкие на своем сайте пишут, при при 30% коллизий оно становится медленнее двоичного поиска, который, имха, работает в структуре).
41. SlavaKron 05.11.24 15:33 Сейчас в теме
(37)
Поиск по соответствию работает на 15-20% быстрее, чем по структуре
Поиск по структуре работает примерно на 110% быстрее, чем поиск по соответствию.
44. Serg2000mr 740 05.11.24 22:46 Сейчас в теме
(41) Хм.. а какой способ замера был у вас?
42. RustIG 1752 05.11.24 18:17 Сейчас в теме
(37) зачем конвертировать Соотв в Структуру - не знаю, но вот в своей публикации https://infostart.ru/1c/tools/2127221/
для решения данной задачи я использовал Соот-е для хранения всех объектов метаданных конфигурации, в значениях хранятся Структуры.
При решении задачи понял, что любое дерево легко представить в виде структуры, но не в виде соот-я.
Вообще, формат джейсон больше похож на структуру, чем на соот-е. И умение манипулировать соот-ем и структурой всегда будет выделять разработчика 1ссреди остальных.
Вот в этой статье широко используется коллаборация структуры и соот-я https://dzen.ru/a/ZhA3nuEUB24kyGRE
45. Serg2000mr 740 05.11.24 23:36 Сейчас в теме
(42) Почему дерево нельзя в виде соответствия сделать?
55. RustIG 1752 06.11.24 14:20 Сейчас в теме
(45) чисто технически в теории можно - от задачи в конечном итоге зависит. я не корректно выразился.

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

наверное, я хотел сказать, что в задачах с графами и деревьями для хранения информации и сведений - эти самые графы и деревья можно хранить в виде Структур (в терминах 1С).

Предположу, что для каких -то задач было бы полезно хранить деревья в виде Соотв-я (в терминах 1С). Как следствие, может возникнуть задача - для одной задачи хранить дерево в виде Структуры, для другой подзадачи - хранить в виде Соот-я. И между подзадачами требуется конвертировать один формат в другой... Это к вопросу - зачем конвертировать Соот-е в Струк.
56. Serg2000mr 740 06.11.24 14:54 Сейчас в теме
(55) Да это я понимаю, что какая-то функция БСП может принимать на входе только структуру, а в наличии может быть соответствие. Но в реальной практике ни разу не сталкивался с такой задачей, да еще и на больших объемах.
57. RustIG 1752 06.11.24 18:15 Сейчас в теме
(56) я вот вроде тоже реальной практикой занимаюсь, и тоже не сталкивался :)
мы просто не в том озере плаваем :)
43. DENSKR 16 05.11.24 18:33 Сейчас в теме
СтруктураСоответствий = Новый Структура;
	СоответствиеСтруктур = Новый Соответствие;
	
	СтруктураСоответствий.Вставить("Один", "Один");
	СтруктураСоответствий.Вставить("Два", "Два");
	СтруктураСоответствий.Вставить("Три", "Три");
	СтруктураСоответствий.Вставить("Четыре", "Четыре");
	
	Для Каждого Стр из СтруктураСоответствий Цикл
		СоответствиеСтруктур.Вставить(Стр.Ключ, Стр.Значение);
	КонецЦикла;
	
	СтруктураСоответствий.Вставить("СС", СоответствиеСтруктур);
	СоответствиеСтруктур.Вставить("СС", СтруктураСоответствий);
	
//Интересно получается при вычислении структуры из соответствия и наоборот
//СоответствиеСтруктур[0].Значение[4].Значение[0].Значение[4].Значение[0].Значение[4].Значение[0].Значение[4].Значение[0]
Показать
46. shard 281 05.11.24 23:57 Сейчас в теме
Было бы интересно посмотреть на быстродействие при записи цикла в одну строку (http://www.gilev.ru/forum/viewtopic.php?f=18&t=1158)
47. Serg2000mr 740 06.11.24 00:31 Сейчас в теме
(46) Да Tormozit в (4) уже обращал внимание
50. dsdred 3645 06.11.24 11:25 Сейчас в теме
(46) на сколько я понял из https://infostart.ru/1c/articles/1732527/
разница в скорости у цикла зависит от того включена отладка или нет. Поэтому я провел замер с включенной отладкой и с выключенной.
48. triviumfan 97 06.11.24 09:47 Сейчас в теме
Не совсем понимаю зачем это было делать.
1с не про скорость, все используют 1й вариант - он прост, понятен и достаточен. Разница в какие-то мс - смешно.
49. dsdred 3645 06.11.24 10:09 Сейчас в теме
(48) интереса ради. До начала измерений я не знал разницу в скорости. Я учился на инженера. Простой человек на часы смотрит и думает красиво, хорошее качество и тд. Инженер смотрит на часы и думает, а как они устроены и готовится их разобрать. Соберет ли обратно? Это уже второй вопрос.

Мне лично грустно за людей у которых отсутствует желание, что-то проверить, провести эксперимент. Когда работа превращается в однообразие последовательных действий не вызывающих ни каких желаний и чувств, невольно превращаешься в робота...
51. triviumfan 97 06.11.24 12:19 Сейчас в теме
(49) Интерес возникает в других родах задач: например, а насколько быстрее алгоритм решения линейных уравнений нативной функции платформы (РассчитатьСистемыЛинейныхУравнений) против самописной, или там, сортировка какая-нибудь, или примеры с коррелированными запросами, сравнить их выполнение на разных субд + против обычных ВТ и тому подобное.
А ваш пример самый простой, и как мне показалось, бесполезный на практике.
52. dsdred 3645 06.11.24 12:23 Сейчас в теме
(51) Обратите внимание, вы зашли в неинтересную для вас тему на Инфостарте и при этом написали в ней комментарий. Мало того продолжили переписку. ;)

П.С. Чаще всего когда мне, что-то не интересно я так не поступаю...
58. triviumfan 97 06.11.24 18:42 Сейчас в теме
(52) Не совсем так. Тема производительности интересна, просто рассмотренные примеры на практике бесполезны.
59. dsdred 3645 06.11.24 21:17 Сейчас в теме
(58) у всех разная практика.

Грубо говоря гинекологу вряд-ли подойдут методы окулиста и наоборот.
53. swenzik 06.11.24 14:09 Сейчас в теме
Вариант JSON через поток в памяти внезапно на 20% медленнее, чем через текстовую переменную.
Прошу замерить и добавить.

Поток = Новый ПотокВПамяти;

ЗаписьJSON     = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьПоток(Поток);
ЗаписатьJSON(ЗаписьJSON, ЯСоответствие);            
ЗаписьJSON.Закрыть();

Поток.Перейти(0, ПозицияВПотоке.Начало);

ЧтениеJSON     = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Поток);
Результат = ПрочитатьJSON(ЧтениеJSON);
Показать
54. dsdred 3645 06.11.24 14:14 Сейчас в теме
60. dsdred 3645 07.11.24 13:54 Сейчас в теме
(53) JSONВ2 - ваш метод

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мс.
65. user1950534 15.11.24 11:30 Сейчас в теме
Когда (и если) мне понадобится сделать такую шляпу, как конвертировать коллекцию А в коллекцию Б, я сперва выясню, откуда берется коллекция А и почему её изначально нельзя получить в виде Б.

Когда меня пошлют подальше и скажут "делай, я сказал", я сделаю циклом и только циклом. Почему? Да набарахтался уже с этими 1С-извращениями вроде ТабличныйДокумент в ТаблицаЗначений через ПостроительЗапроса... Кроме "типа" лаконичного кода, никаких особенно плюсов...

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

Это лирика... Статья интересная, аффтар красавчег, пеши исчо!!!
DemetrKlim; dsdred; +2 Ответить
66. dsdred 3645 15.11.24 11:35 Сейчас в теме
(65) спасибо за комментарий. Улыбнуло.
user1950534; +1 Ответить
67. terrin 19.11.24 12:39 Сейчас в теме
Метод через JSON имеет один очень большой недостаток от остальных описанных методов. Он работает пока в соответствии в качестве значения у нас простые типы. Как только в качестве значения появится ссылка на справочник, документ и прочее так сразу метод становится не работоспособным.
68. dsdred 3645 19.11.24 13:08 Сейчас в теме
(67) согласен и про это я написал в статье в пункте выводы.
Нужно учесть недостатки, что ключ должен быть строкой, в которой только разрешенные символы.
69. terrin 19.11.24 13:18 Сейчас в теме
(68)
Тут вы указали только про Ключ и это касается любого способа преобразования. А в качестве Значения не пройдет только для JSON.
В остальном спасибо за статью. Может где-то потребуется оптимизировать выполнение процедуры и тогда можно будет вспомнить про все методы, указанные в статье и что-то применить.
70. DemetrKlim 180 24.11.24 16:13 Сейчас в теме
Известный (ныне покойный) актёр и директор цирка Юрий Никулин оставил интереснейшие мемуары, озаглавленные как "Почти серьёзно". Это просто история отечественного цирка. Там описан такой реальный сюжет. Один из жонглёров решил сделать уникальный номер - жонглировать... спичками!! Не коробками, а именно, спичками. Примерно три года мучительно тренировался, вышел на готовый номер. Наконец, свершилось - вышел на публику и приступил. В зале мёртвая тишина... И тут до исполнителя дошло - никому вообще не видно, что он там делает, даже с первого ряда это выглядело, как суетливое махание руками. В отчаянии жонглер убежал за кулисы и застрелился из револьвера дрессировщиков.
Писал долго, но смыл улавливаете? Я иногда встречаю здесь описание удивительных технологий, вызывающих устойчивое напоминание о "...усердии, достойном лучшего применения..."
Успокойтесь, пользователь не заметит - какими спичками вы жонглируете)
71. dsdred 3645 25.11.24 10:48 Сейчас в теме
(70) в отличие от жанглера я делал это чисто для себя и выложил только потому, что в моей группе набралось определенное количество эмоций.
Стреляться не затеваю ))
72. DemetrKlim 180 25.11.24 10:53 Сейчас в теме
(71) Но этот текст сподвиг меня на написание полезной прагматичной статьи, которая вот-вот будет опубликована)
Я написал прагматичное решение для реально существующего процесса.
Так что, спасибо за "детонатор"))
73. dsdred 3645 25.11.24 10:58 Сейчас в теме
(72) не за что. Почитаю как опубликуете. Тема статьи про что?
74. DemetrKlim 180 25.11.24 11:15 Сейчас в теме
(73) Это реально больная тема для многих. Как правило, этим сталкиваются при учете лизинговых операций, если с объектами лизинга приходится выполнять некоторые не очень часто возникающие операции. Если брать пример на уровне курсовой работы в ВУЗе, когда "по одному договору в лизинг взят один автомобиль", то расчеты в штатном варианте 1С корректны. А если организация по одному договору лизинга покупает 1000 автомобилей и со второго месяца действия договора начинает досрочный выкуп по 20-50 авто. Вот такого подвоха ни 1С ни Илон Маск не ожидали, как оказалось)
Я переписал эту часть расчётов в типовой конфигурации, а в статье подробно описал - где и как. Код открытый - приводится для примера.
75. dsdred 3645 25.11.24 12:08 Сейчас в теме
(74) с лизингом не сталкиваюсь, но по замыслу статья норм.
76. DemetrKlim 180 25.11.24 12:18 Сейчас в теме
(75) Я по бухучёту специализируюсь давно. Учёт, это моё - всё!)
77. dsdred 3645 25.11.24 12:21 Сейчас в теме