Имя: Пароль:
1C
1С v8
Прибавление строки на сервере
,
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
Сделай
Текст = "";
ТекстСообщения  = "";
    Для тыщ = 1 по 10 Цикл
        НачДата = ТекущаяУниверсальнаяДатаВМиллисекундах();
        Для н = 1 по 1000 Цикл
            Текст = Текст + "aaaaaaaaaa";
        КонецЦикла;
        ТекстСообщения = ТекстСообщения+Символы.ПС+"" + Тыщ + "000: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - НачДата) + "мс";
    КонецЦикла;
Сообщить(ТекстСообщения);
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.ЗаписатьБезОбработки или стрСоединить
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.