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