|   |   | 
| 
 | Прибавление строки на сервере | ☑ | ||
|---|---|---|---|---|
| 0
    
        Deon 26.03.20✎ 11:41 | 
        Есть у меня такой код, где я заполняю данными строку:
 Текст = ""; Для тыщ = 1 по 10 Цикл НачДата = ТекущаяУниверсальнаяДатаВМиллисекундах(); Для н = 1 по 1000 Цикл Текст = Текст + "aaaaaaaaaa"; КонецЦикла; Сообщить("" + Тыщ + "000: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - НачДата) + "мс"); КонецЦикла; Выполняю его на клиенте. Результат: 2000: 2мс 3000: 3мс 4000: 3мс 5000: 4мс 6000: 5мс 7000: 6мс 8000: 6мс 9000: 8мс 10000: 8мс Выполняю его на сервере. Результат: 1000: 62мс 2000: 1781мс 3000: 3453мс 4000: 4219мс 5000: 3204мс 6000: 3031мс 7000: 3297мс 8000: 3219мс 9000: 3468мс 10000: 4110мс 8.3.16.1148, но и на предыдущих вело себя так же. Подскажите, в какую сторону можно копать? Что искать на сервере? | |||
| 1
    
        PR 26.03.20✎ 11:44 | 
        (0) И че и че?     | |||
| 2
    
        Deon 26.03.20✎ 11:46 | 
        (1) И долговато на сервере выполняется как-то слишком. Это нездоровое поведение для 21 века     | |||
| 3
    
        PR 26.03.20✎ 11:47 | 
        (2) Так что выполняется-то? Ты написал "где я заполняю данными строку", а заполнения что-то и не видно
 А так-то пока все за то, что говнокод, че | |||
| 4
    
        Deon 26.03.20✎ 11:52 | 
        (3) Как это не видно? В переменной "Текст" добавляются буквы 10000 раз. На клиенте махом, на сервере долго.     | |||
| 5
    
        Xapac 26.03.20✎ 11:56 | 
        попробуй 
 Глобальный контекст (Global context) СтрСоединить (StrConcat) Синтаксис: СтрСоединить(<Строки>, <Разделитель>) | |||
| 6
    
        Deon 26.03.20✎ 12:04 | 
        (5) СтрСоединить работает быстро. Но, дело не в том, как я это напишу, а в том, что сервер почему-то долго обрабатывает именно сложение строк. А оно используется везде и постоянно.     | |||
| 7
    
        Bigbro 26.03.20✎ 12:07 | 
        cудя по (0) долго работает не сложение строк а "сообщить".     | |||
| 8
    
        lodger 26.03.20✎ 12:09 | 
        (0) убери сообщить.
 повтори замеры на сервере раз 10-20. убери первый замер. выведи среднее. | |||
| 9
    
        Bigbro 26.03.20✎ 12:09 | 
        а не, вру.     | |||
| 10
    
        Deon 26.03.20✎ 12:10 | 
        (7) (8) Без замеров оно также долго работает.     | |||
| 11
    
        arsik гуру 26.03.20✎ 12:15 | 
        Подтверждаю. Сообщить на сервере работает долго     | |||
| 12
    
        arsik гуру 26.03.20✎ 12:17 | 
        Сделай
 Текст = "";
 | |||
| 13
    
        Deon 26.03.20✎ 12:20 | 
        (11) Не, дело не в этом     | |||
| 14
    
        Deon 26.03.20✎ 12:22 | 
        Рестартанул службу на сервере, стало прибавляться и сообщаться моментом.     | |||
| 15
    
        Ненавижу 1С гуру 26.03.20✎ 12:22 | 
        потому что на клиента тяните все эти строки     | |||
| 16
    
        Deon 26.03.20✎ 12:23 | 
        (15) Кто тянет? Зачем тянет? Я точно не тяне )     | |||
| 17
    
        Ненавижу 1С гуру 26.03.20✎ 12:23 | 
        (166) твоё Сообщить тянет     | |||
| 18
    
        Deon 26.03.20✎ 12:24 | 
        (17) В моём сообщить нет переменной, к которой прибавляется текст. Поэтому, не тянет     | |||
| 19
    
        Ненавижу 1С гуру 26.03.20✎ 12:26 | 
        (18) на клиенте каким чудом появляется отображение строки?     | |||
| 20
    
        Deon 26.03.20✎ 12:28 | 
        (19) Магия. Но дело не в сообщить.
 Без всяких замеров и сообщить, на сервере код выполняется 30000 мс: Для н = 1 по 10000 Цикл Текст = Текст + "aaaaaaaaaa"; КонецЦикла; После рестарта сервера - 1мс Разница большая. Это какой-то кэш | |||
| 21
    
        acht 26.03.20✎ 12:28 | 
        (6) > А оно используется везде и постоянно.
 Дадада, 10000 добавлений к строке используется везде и постоянно. Чуви, ты в цикле освобождаешь и выделяешь возрастающией кусок памяти. Это нездоровое поведение для 21 века. | |||
| 22
    
        Deon 26.03.20✎ 12:35 | 
        (21) Ну так-то да, нигде так много сложений особо и не используется. Но все равно, сервак после перезапуска справляется с этой задачей довольно резво.     | |||
| 23
    
        acht 26.03.20✎ 12:37 | 
        (21) Дык пул памяти девственно чист и нефрагментирован становится. Почему бы ему и нет?     | |||
| 24
    
        acht 26.03.20✎ 12:38 | 
        (23) в (22)     | |||
| 25
    
        Deon 26.03.20✎ 12:39 | 
        (24) Да. А значит сервак у меня её со временем таки жрёт и не отпускает. Ибо чем дальше, тем всё медленнее
 Будем искать, спасибо ) | |||
| 26
    
        Deon 26.03.20✎ 12:43 | 
        (21) Интересно, вот чем по выделению памяти добавление в массив отличается от добавления к строке? Массив теми же данными заполняется влёт     | |||
| 27
    
        acht 26.03.20✎ 12:50 | 
        (26) К массиву память добавляется. А со строкой - сначала освобождается старая, а потом выделяется новая, большего размера. В результате в пуле памяти возникает дырка - в старое ж место оно уже не помещается, приходится забирать новую память. Здравствуй фрагментация, сваливание в своп и всетакое.
 А на клиенте одна сессия, один процесс, там с памятью проще. | |||
| 28
    
        Deon 26.03.20✎ 12:58 | 
        (27) Думаю, 1Ска всё же как-то должна сама уметь это чистить. Например в УТ11, функция ЗначениеРеквизитаОбъекта() используется постоянно.
 А внутри неё аналогичный моему код: ТекстЗапросаПолей = ""; Для каждого КлючИЗначение Из СтруктураПолей Цикл ТекстЗапросаПолей = ТекстЗапросаПолей + ?(ПустаяСтрока(ТекстЗапросаПолей), "", ",") + " | " + ИмяПоля + " КАК " + ПсевдонимПоля; КонецЦикла; Не 10000 раз, конечно, но суть та же | |||
| 29
    
        lodger 26.03.20✎ 15:41 | 
        (28) в пределах разумного это работает достаточно шустро. а твой пример вырожденный.     | |||
| 30
    
        Fragster гуру 26.03.20✎ 15:42 | 
        Баян же
 Надо использовать ЗаписьТекста изли ЗаписьXML.ЗаписатьБезОбработки или стрСоединить | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |