Супер-пупер быстрая конкатенация(сложение) строк

Определение пересечения периодов (числовых множеств)
Разность дат, а как быстрее?

И снова сложно о простом. Что бы присоединить одну строку к другой, в платформу 1С заложена операция конкатенации ("+").

При выполнении конкатенации:
  • длина результирующей строки равна сумме длин соединяемых строк;
  • в случае несовпадения типа данных второго или последующих операндов со строковым типом, их значение преобразуется к строковому типу в соответствии с правилами преобразования типов.
Пример: ФИО = Фамилия + " " + Имя + " " + Отчество;

Выполним операцию конкатенации 100000 раз по алгоритму:
ИтоговаяСтрока = "";
Для Счетчик = 1 По Объект.КоличествоИтераций Цикл
ИтоговаяСтрока = ИтоговаяСтрока + Объект.РеквизитСтрока;
КонецЦикла;


Переменные содержат следующие значения:
  • Объект.КоличествоИтераций = 100000;
  • Объект.РеквизитСтрока = "ПроизвольнаяСтрока".
Произведем замер длительности выполнения алгоритма (см. рисунок 1).
Рисунок 1. Замер скорости операции конкатенации
Время выполнения алгоритма составило почти 52 секунды, что не очень быстро. Существует еще один способ конкатенации строк, который работает заметно быстрее, я бы сказал, значительно быстрее.

Язык программирования 1С имеет в своем арсенале объект ЗаписьXML, который предназначен для создания XML-файлов. Данный объект умеет писать данные не только в файл, но и в строку, что позволяет его использовать для конкатенации строк. Роль операции конкатенации выполняет метод ЗаписатьБезОбработки().

Выполним операцию конкатенации 100000 раз по алгоритму:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
Для Счетчик = 1 По Объект.КоличествоИтераций Цикл
ЗаписьXML.ЗаписатьБезОбработки(Объект.РеквизитСтрока);
КонецЦикла;
ИтоговаяСтрока = ЗаписьXML.Закрыть();


Значения переменных аналогичны, что и в первом способе. Произведем замер длительности выполнения алгоритма (см. рисунок 2).
Рисунок 2. Замер скорости операции конкатенации с помощью объекта ЗаписьXML
Время выполнения алгоритма менее 1 секунды, впечатляющий результат. К сожалению, пока не могу понять за счет каких ресурсов и механизмов достигается такой результат. Данный способ может отлично пригодиться в связке 1С <---> Web, когда передаются и генерируются большие объемы данных строкового типа (JSON, XML или свой формат), а так же в выгрузке больших объемов данных в текстовый файл.

Комментарии

  1. Спасибо за идею. Хороший способ оптимизировать "нестандартные" обмены:)

    ОтветитьУдалить
  2. Это наверное та же ситуация, что и в java с мутабельными/немутабельными объектами. Там также есть 2 типа - String немутабельный и StringBuffer. Дело в том, что String - это не совсем базовый тип - это объект - массив символов. При выполнении в цикле A = A + "некий текст" производится инициализация нового объекта А, а не использование уже старого. Таким образом в цикле создается 100 000 новых объектов типа массив символов, что занимает время. XML же является объектом построенным не на массивах, а на указателях, что существенно ускоряет добавление новых символов, но замедляет произвольный доступ к части строки (buffered read/write).

    ОтветитьУдалить

Отправить комментарий