Скорость сложения строк большой длины в 1С разными методами (конкатенация строк)

Как известно в 1С со строковыми переменными часто приходится работать в режиме добавления строк в одну переменную.

Когда строка небольшой длины, все происходит достаточно быстро и можно работать вот так:

Строка1 = "Привет";
Строка2 = "мир!";
Результат = Строка1 + Строка2;

И все замечательно ровно до того момента, когда эти строки не становятся большими... Тогда скорость работы значительно падает.
Мы провели небольшие замеры производительности и выносим их на суд общественности.

Итак, смоделируем сначала условие задачи.

Задача

Необходимо написать функцию, которая возвращает в строковую переменную текст вида:

Это тестовая строка 1
Это тестовая строка 2
Это тестовая строка 3
...
Это тестовая строка N

Где N - число строк.
Разобрать несколько способов получения такой переменной.
Так же сделать график скорости работы в зависимости от N и сравнить получившиеся функции по производительности.

Решение

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

Замеры производительности конкатенации строки

Где по оси Х у нас идет количество итераций, а по Y - время в миллисекундах.

Как видим, медленнее всего работает ТекстовыйДокумент:

	Результат = Новый ТекстовыйДокумент;
	Для Индекс = 1 По КоличествоИтераций Цикл
		Результат.ДобавитьСтроку("Это тестовая строка " + Строка(Индекс));
	КонецЦикла;	
	Строка = Результат.ПолучитьТекст();

Затем у нас идет обычная работа со строкой:

	Результат = "";
	Для Индекс = 1 По КоличествоИтераций Цикл
		Результат = Результат + "Это тестовая строка " + Строка(Индекс) + Символы.ПС;
	КонецЦикла;

Далее по скорости идет работа с ПотокВПамяти + ЗаписьДанных:

	Результат = Новый ПотокВПамяти;
	ЗаписьДанных = Новый ЗаписьДанных(Результат);
	Для Индекс = 1 По КоличествоИтераций Цикл
		ЗаписьДанных.ЗаписатьСтроку("Это тестовая строка " + Строка(Индекс));
	КонецЦикла;	
	ЗаписьДанных.Закрыть();
	Строка = ПолучитьСтрокуИзДвоичныхДанных(Результат.ЗакрытьИПолучитьДвоичныеДанные());

Ну, а все остальные способы выполняются по времени примерно в одном диапазоне.

ПотокВПамяти + ЗаписьТекста

Как оказалось, со строками этот способ работает быстрее, чем ПотокВПамяти + ЗаписьДанных, хотя по идее, корни у них общие, в плане механизмов работы:

	Результат = Новый ПотокВПамяти;
	ЗаписьТекста = Новый ЗаписьТекста(Результат);
	Для Индекс = 1 По КоличествоИтераций Цикл
		ЗаписьТекста.ЗаписатьСтроку("Это тестовая строка " + Строка(Индекс));
	КонецЦикла;
	ЗаписьТекста.Закрыть();
	Строка = ПолучитьСтрокуИзДвоичныхДанных(Результат.ЗакрытьИПолучитьДвоичныеДанные());	

ЗаписьXML

ЗаписьXML, тоже работает быстро. Выглядит как какая-то магия:

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

Массив

В массив можно складывать строки и в конце использовать функцию СтрСоединить:

	Результат = Новый Массив;
	Для Индекс = 1 По КоличествоИтераций Цикл
		Результат.Добавить("Это тестовая строка " + Строка(Индекс));
	КонецЦикла;	
	Строка = СтрСоединить(Результат, Символы.ПС);

Предварительные выводы

Если у вас строки не большой длины, то можно обойтись и простой суммой двух строковых переменных, вида: Строка1 + Строка2. Если строк достаточно, много то ни в коем случае не использовать работу с ТекстовымДокументом. Лучше выбрать что-то другое. Например, ПотокВПамяти + ЗаписьТекста. Это способ, который позволит работать с длинными строками как в памяти, так и из файла.

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

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

PS: Приготовьтесь, что ждать результата теста придется долго :)

Тестирование строк.zip 4.72 КБ
Скачать
Скриншоты
Фото автора записи

Основатель и директор по развитию Софтонит. Практикующий руководитель разработки. Эксперт в области автоматизации техподдержки

Системные решения для 1С
Скорость сложения строк большой длины в 1С разными методами (конкатенация строк)
SoftOnIT.RU
Как известно в 1С со строковыми переменными часто приходится работать в режиме добавления строк в одну пере... 2022-11-14T14:26:40+03:00
Скорость сложения строк большой длины в 1С разными методами (конкатенация строк)
Скорость сложения строк большой длины в 1С разными методами (конкатенация строк)
https://softonit.ru
Будь вкурсе!

Сообщим о новых материалах, важных событиях и предложениях

Email заполнен не корректно
Нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных.
Нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных.
Поделитесь статьей
Рекомендуем почитать
Статьи Как включить отладку на сервере 1С:Предприятия?

Все мы прекрасно знаем, что отладка это прекрасный механизм в платформе 1С, который позволяет быстро найти проблему и решить ее путем пошаговых операций и просмотра значений переменных. Но при использовании серверной базы 1С механизм отладки по умолчанию выключен. А как быть, если надо найти проблему? В этой статье давайте постараемся в этом вопросе разобраться.

Статьи Ошибка в конфигурации 1С "Регистрация программы в центре лицензирования не выполнена"

Достаточно часто при работе типовых (и не только) конфигураций 1С возникает ошибка:
Регистрация программы в центре лицензирования не выполнена
Появляется окно "Проверка правомерности использования конфигурации" и это окно жутко раздражает пользователей и мешает работе.
Почему так происходит?
Об этом мы расскажем вам в сегодняшней статье

Статьи Как из конфигурации 1С:Предприятия получить доступ к пользователям, элементам инфоблока и прочего с сайта Битрикс?

Не так давно столкнулся с необходимостью получать данные пользователей/инфоблоков и т.д. с сайта Битрикс в конфигурации 1С:Предприятие и... Ничего толкового не нашел... Есть возможность скачать и поставить монстра, целую подсистему для обмена 1С с сайтом Битрикс, а вот сделать какую-нибудь примитивную разовую загрузку данных с сайта в 1С такого нет...
Пришлось разбираться самостоятельно. Приведем код как скрипта на PHP, так и код обработки в 1С.

Статьи Лучшее облако для конфигураций 1С

Для малых компаний и ИП вопрос с лицензированием стоит особо остро.
Обороты не большие, позволить себе собственное компьютерное оборудование и лицензии на 1С, MS Office (Word, Excel) и т.д - слишком дорогое удовольствие.
Как быть маленьким фирмочкам? Нарушать закон и использовать пиратское ПО? Как бы не так! Эти времена давно прошли.
Выход, конечно есть. Используем прекрасный облачный сервис SCloud.ru

0 / 0