Супер-пупер быстрая конкатенация(сложение) строк
Определение пересечения периодов (числовых множеств)
Разность дат, а как быстрее?
И снова сложно о простом. Что бы присоединить одну строку к другой, в платформу 1С заложена операция конкатенации ("+").
При выполнении конкатенации:
Выполним операцию конкатенации 100000 раз по алгоритму:
Переменные содержат следующие значения:
Время выполнения алгоритма составило почти 52 секунды, что не очень быстро. Существует еще один способ конкатенации строк, который работает заметно быстрее, я бы сказал, значительно быстрее.
Язык программирования 1С имеет в своем арсенале объект ЗаписьXML, который предназначен для создания XML-файлов. Данный объект умеет писать данные не только в файл, но и в строку, что позволяет его использовать для конкатенации строк. Роль операции конкатенации выполняет метод ЗаписатьБезОбработки().
Выполним операцию конкатенации 100000 раз по алгоритму:
Значения переменных аналогичны, что и в первом способе. Произведем замер длительности выполнения алгоритма (см. рисунок 2).
Время выполнения алгоритма менее 1 секунды, впечатляющий результат. К сожалению, пока не могу понять за счет каких ресурсов и механизмов достигается такой результат. Данный способ может отлично пригодиться в связке 1С <---> Web, когда передаются и генерируются большие объемы данных строкового типа (JSON, XML или свой формат), а так же в выгрузке больших объемов данных в текстовый файл.
Разность дат, а как быстрее?
И снова сложно о простом. Что бы присоединить одну строку к другой, в платформу 1С заложена операция конкатенации ("+").
При выполнении конкатенации:
- длина результирующей строки равна сумме длин соединяемых строк;
- в случае несовпадения типа данных второго или последующих операндов со строковым типом, их значение преобразуется к строковому типу в соответствии с правилами преобразования типов.
ФИО = Фамилия + " " + Имя + " " + Отчество;
Выполним операцию конкатенации 100000 раз по алгоритму:
ИтоговаяСтрока = "";
Для Счетчик = 1 По Объект.КоличествоИтераций Цикл
ИтоговаяСтрока = ИтоговаяСтрока + Объект.РеквизитСтрока;
КонецЦикла;
Переменные содержат следующие значения:
- Объект.КоличествоИтераций = 100000;
- Объект.РеквизитСтрока = "ПроизвольнаяСтрока".
Рисунок 1. Замер скорости операции конкатенации |
Язык программирования 1С имеет в своем арсенале объект ЗаписьXML, который предназначен для создания XML-файлов. Данный объект умеет писать данные не только в файл, но и в строку, что позволяет его использовать для конкатенации строк. Роль операции конкатенации выполняет метод ЗаписатьБезОбработки().
Выполним операцию конкатенации 100000 раз по алгоритму:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
Для Счетчик = 1 По Объект.КоличествоИтераций Цикл
ЗаписьXML.ЗаписатьБезОбработки(Объект.РеквизитСтрока);
КонецЦикла;
ИтоговаяСтрока = ЗаписьXML.Закрыть();
Значения переменных аналогичны, что и в первом способе. Произведем замер длительности выполнения алгоритма (см. рисунок 2).
Рисунок 2. Замер скорости операции конкатенации с помощью объекта ЗаписьXML |
Спасибо за идею. Хороший способ оптимизировать "нестандартные" обмены:)
ОтветитьУдалитьЭто наверное та же ситуация, что и в java с мутабельными/немутабельными объектами. Там также есть 2 типа - String немутабельный и StringBuffer. Дело в том, что String - это не совсем базовый тип - это объект - массив символов. При выполнении в цикле A = A + "некий текст" производится инициализация нового объекта А, а не использование уже старого. Таким образом в цикле создается 100 000 новых объектов типа массив символов, что занимает время. XML же является объектом построенным не на массивах, а на указателях, что существенно ускоряет добавление новых символов, но замедляет произвольный доступ к части строки (buffered read/write).
ОтветитьУдалитьСпасибо большое за разъяснение!
Удалить