Имя: Пароль:
1C
 
Как "уронить" ДО или как оптимизировать такой код?
0 RomaH
 
naïve
11.10.22
16:00
Функция ЗаменитьСпецСимволыHTML(Строка, СпецСимволыСоотв = Неопределено) Экспорт
    
    СоответствиеСпецСимволов = РаботаС_HTMLПовтИсп.ПолучитьСоответствиеСпецСимволов();
    
    ЗаменитьСпецСимволHTML(Строка, 38, "amp");
    
    НоваяСтрока = "";
    
    Для Поз = 1 По СтрДлина(Строка) Цикл
        
        Код = КодСимвола(Строка, Поз);
        ИмяСимвола = СоответствиеСпецСимволов.Получить(Код);
        
        Если ИмяСимвола = Неопределено Тогда
            НоваяСтрока = НоваяСтрока + Символ(Код);
        Иначе
            НоваяСтрока = НоваяСтрока + "&" + ИмяСимвола + ";";
        КонецЕсли;
        
    КонецЦикла;
    
    Строка = НоваяСтрока;
    
    Возврат Строка;
    
КонецФункции



В описание БП пользователь в конец сообщения вставил 6 000 000 пробелов
Код = КодСимвола(Строка, Поз); 1000 раз выполняется за 3 секунды

как можно "оптимизировать"?
1 Garykom
 
гуру
11.10.22
16:02
XMLСтрока()
2 Ryzeman
 
11.10.22
16:04
>>В описание БП пользователь в конец сообщения вставил 6 000 000 пробелов

Бить пробовали?

СокрЛП()
3 mikecool
 
11.10.22
16:12
"вставил 6 000 000 пробелов " - уснул лицом на клаве?
4 PLUT
 
11.10.22
16:20
(0) добавь в расширение или в код сокрлп() перед записью объекта, чтобы больше такой херни не было

> В описание БП пользователь в конец сообщения вставил 6 000 000 пробелов
5 dmt
 
11.10.22
17:44
(0) > В описание БП пользователь в конец сообщения вставил 6 000 000 пробелов
а зачем объяснил?
6 Fragster
 
гуру
11.10.22
18:00
Вместо НоваяСтрока = НоваяСтрока + ХХХ; используй объект ЗаписьXML.ЗаписатьБезОбработки(ХХХ)
7 lodger
 
11.10.22
18:03
(5) мечтает стать тестировщиком, наверное.
8 lodger
 
11.10.22
18:04
(0) сожрать регулярками незначащие последовательности символов и заменить первым символом такой последовательности, а потом уже твой код.
9 Krendel
 
11.10.22
19:32
Интересно, а если пользователь на какает тебе на клаву, какой код тогда надо писать?
10 ДедМорроз
 
11.10.22
19:38
Я такие функции оптимизировал тем,что запоминал место первого обычного символа и добавлял потом перед спец-символом строку обычных,а не по каждому символу.
Прирост скорости достаточно большой,так как операция КодСимвола практически мгновенная,в отличие от сложения строк.

Ну и если замен очень много,то суммировать в маленькую строку до 256 символов,а когда превысит,то в другую - крличество каскадов подбирается опытным путем,т.к.нужно минимальную строку под размер буфера,выделяемого под строку,если у нее минимальный размер.
11 Курцвейл
 
11.10.22
19:40
Вместо сложения строк делаем массив символов и потом СтрСоеденить
Это быстрее всего
12 mistеr
 
11.10.22
19:42
(9) Г-код, конечно же!
13 RomaH
 
naïve
12.10.22
08:56
(10) я наверное искал где зависло через замер производительности? - так 99% именно на КодСимвола(Строка, НомерСимвола)
14 RomaH
 
naïve
12.10.22
08:58
XMLСтрока сама умеет?

ИмяСимвола = СоответствиеСпецСимволов.Получить(Код);

Функция ПолучитьСоответствиеСпецСимволов() Экспорт
    
    Результат = Новый Соответствие;
    
    Результат.Вставить(193, "Aacute");
    Результат.Вставить(225, "aacute");
    Результат.Вставить(226, "acirc");
    Результат.Вставить(194, "Acirc");
15 Alexor
 
12.10.22
09:10
Если спецсоответствие не большое
То может стрзаменить быстоее будет
16 RomaH
 
naïve
12.10.22
09:15
(15) блин, все время ВСЁ!!! уходит на КодСимвола - если от цикла не избавиться - смысла нет
17 RomaH
 
naïve
12.10.22
09:16
иэто еще повезло, что пробелы, что мешает в описание Войну и мир Л.Н. Толстова вставить ?
18 Alexor
 
12.10.22
09:16
(16) перебрать из соотвествия. Поткоду вытащить символ и замену
19 RomaH
 
naïve
12.10.22
09:18
(18) ДО есть рабочий? вставь в описание 100 000 смволов текста и разошли всем пользователям для ознаомления
20 RomaH
 
naïve
12.10.22
09:18
(18) надо попробовать
21 Alexor
 
12.10.22
09:20
Для каждого стр из соответсвиеспкцсимволов цикл
Символкода=символ(стр.индекс)
Стрзаменить(строка, символкод, &+стр)
Конеццикла.

Пишу с телефона но смысл надеюсь понятен
22 RomaH
 
naïve
12.10.22
09:23
(21) да понятен
возможно надо будет от длины строки тот или иной алгоритм применять

250 символов из соответствия менять, или КодСимвола получать
23 Zapal
 
12.10.22
09:31
(16) я думаю основная задержка связана именно с поиском Поз в большой строке
и если задействовать последовательное чтение через потоки данных то всё наладится
24 ДедМорроз
 
12.10.22
10:39
Возможно,что большая строка в памяти хранится чанками,из-за этого поиск позиции для получения кода идет долго.
Тогда можно строку в поток,а потом читать этот поток и писать в другой.

Я,просто,с этой задачей сталкивался и в других языках,но нигде торможения на получении кода символа не встречал.
25 Tatitutu
 
12.10.22
11:25
1. Восстановить из бэкапа
2. Зачем удалять ЛИШНЕЕ - пусть напишет НУЖНОЕ
CTRL+A -> DEL
и пусть пользователь проснётся
и заново напишет описание