Скорость сложения строк большой длины в 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 КБ
Скачать
Скриншоты
Изображение автора статьи

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

Будь вкурсе!

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

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

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

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

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

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

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

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

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

0 / 0