Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Что можно придумать вместо СтрСоединить в 8.2. для сохранения быстродействия?

Что можно придумать вместо СтрСоединить в 8.2. для сохранения быстродействия?
Я
   1S_User
 
26.03.19 - 12:09
Дано. У клиента 8.2, поскольку соответствующего платформенного механизма в 8.2 еще нет, приходится самостоятельно формировать сообщения в формате JSON, достаточно большие. Приходится делать достаточно большое количество конкатенаций. При этом СтрСоединить, которая выдает единую строку из массива, в 8.2. нет. Рекурсивная конкатенация больших текстов много тысяч раз работает ну очень медленно. Кто-нибудь с подобным сталкивался? Что можно придумать вместо стандартной для 8.3 СтрСоединить так, чтобы сохранилась ее главная фишка - быстрое объединение большого количества строк в одну?  Вызывать какой-то виндовский механизм, скорее всего, тоже не лучший вариант, т.к. на эти вызовы тоже время понадобится.
 
 
   Вафель
 
1 - 26.03.19 - 12:10
записьxml
   Ёпрст
 
2 - 26.03.19 - 12:13
а чего просто платформу не обновить до 8.3 ?
   MM
 
3 - 26.03.19 - 12:22
Больше всего времени тратится на присоединение строки, часто небольшой, к основному тексту. Это время тратится на то, чтобы выделить место под новую расширенную строку, а потом скопировать в него строку слева (большУю), а потом докопировать правую строку. Способ оптимизации состоит в том, чтобы соединять маленькие строки друг с другом, а когда этот временный буфер вырастит, то присоединить его к основной строке большого размера. Размер временного буфера можно подобрать экспериментально, чтобы лишний раз не копировать большую строку без необходимости. Временные буферы могут быть вложены друг в друга, но и без этого вы заметите существенное ускорение.
   APXi
 
4 - 26.03.19 - 12:30
Пиши в файл
   1S_User
 
5 - 26.03.19 - 13:20
(3) Да, видимо, буду копать именно в эту сторону. (4) Думаешь, множественная файловая операция будет быстрее?
   1S_User
 
6 - 26.03.19 - 13:21
(1) Среда, с которой интеграция, принимает именно JSON. (2) Контора огромная, очень много работ будет перед тем, как перевести.
   Cyberhawk
 
7 - 26.03.19 - 13:25
Пиши строки в массив, потом по массиму бежишь и сбрасываешь в файл
   Провинциальный 1сник
 
8 - 26.03.19 - 13:26
По-моему, ЗаписьФайла лучше, чем соединять строки в мегастроку.
   1S_User
 
9 - 26.03.19 - 13:28
(7) (8) Спс, попробую и такой вариант. В принципе, да, запись в конец даже мегафайлов занимает мало времени. Надо проверить. Было интересно, как это эсники реализовали в СтрСоединить (в самой платформе).
   FIXXXL
 
10 - 26.03.19 - 13:29
(6) как вариант, сделай XDTO-пакет, а его потом преобразуй в джейсон
   1S_User
 
11 - 26.03.19 - 13:29
(10) Нету в 8.2. такой возможности - запись xdto в json. Отсюда и вся свистопляска.)
   rintik
 
12 - 26.03.19 - 13:32
Интересно посмотреть СтрШаблон("%1%2", Значение1,Значение2) разница в быстродействии есть?
   Провинциальный 1сник
 
13 - 26.03.19 - 13:35
(8) То есть ЗаписьТекста, поправлюсь
   FIXXXL
 
14 - 26.03.19 - 13:37
(11) ФабрикаXDTO.ЗаписатьJSON(ЗаписьJSON, ОбъектХДТО) не работает?
нету 8.2 в округе...
   1S_User
 
15 - 26.03.19 - 13:44
(14) Если бы работало, проблем бы не было.) (12) Если сравнивать с множеством СтрЗаменить(), то да, есть. Видимо, замену выполняет за 1 прогон, а не за много.
   Eiffil123
 
16 - 26.03.19 - 14:17
Используй модель последовательного доступа к тексту (запись в файл).
Текст.ЗаписатьСтроку("Добро пожаловать!");
Записываемая строка. После записи строки в файл помещается разделитель строк.
   APXi
 
17 - 26.03.19 - 14:57
(5) да, думаю быстрее будет в вашем случае
   MM
 
18 - 26.03.19 - 15:02
В (1) имеется ввиду использование метода ЗаписьXML (XMLWriter) ЗаписатьБезОбработки (WriteRaw), который не производит лишних перемещений строк в памяти. С его помощью можно формировать строку не только с XML.
   1S_User
 
19 - 26.03.19 - 15:18
Короче, вот так я сделал
   1S_User
 
20 - 26.03.19 - 15:20
Функция ОбъединитьМассивСтрок82(МасСтрок)
    ТекстДок = Новый ТекстовыйДокумент;
    Для Каждого Строка Из МасСтрок Цикл
        ТекстДок.ДобавитьСтроку(Строка);
    КонецЦикла;
    Возврат ТекстДок.ПолучитьТекст();  
КонецФункции
   Вафель
 
21 - 26.03.19 - 15:20
(18) причем этот метод работает БЫСТРЕЕ чем СтрСоединить
   1S_User
 
22 - 26.03.19 - 15:20
Минус в том, что лишние символы переноса строк (а некоторые нужны, так что через стрзаменить так просто не удалишь), но JSON ни нисколько не мешают. В принципе несколько мегабайт текста обрабатывает быстрее секунды (против нескольких минут). Наверное, можно и лучше сделатЬ, но мне это уже не так интересно.)
   1S_User
 
23 - 29.03.19 - 17:27
Но через ЗаписьXML на больших объемах работает многократно быстрее.
   Eiffil123
 
24 - 29.03.19 - 18:04
(23) используй ЗаписьТекста. Он должен быть шустрее, чем записьXML, т.к. не выполняет всяких xml-преобразований.
   Вафель
 
25 - 29.03.19 - 18:05
(24) так там же raw пишится, тоже без преобразований
   Garykom
 
26 - 29.03.19 - 18:14
А кто подскажет какой объект (содержащий несколько строк) дает минимальный мусор после "ЗначениеВСтрокуВнутр" ?
   Вафель
 
27 - 29.03.19 - 18:18
(26) соедини строки через спецсимвол
   Garykom
 
28 - 29.03.19 - 18:59
(27) Не понял.
Я то типа берем СЗ или некую Структура/Массив из строк и ЗначениеВСтрокуВнутр(Массив).
Далее правим результат операциями над строками через СтрЗаменить()


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.