|
Прибавление строки на сервере | ☑ | ||
---|---|---|---|---|
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.ЗаписатьБезОбработки или стрСоединить |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |