|
Временное хранилище на сервере и безконтекстные серверные вызовы. Вопрос. | ☑ | ||
---|---|---|---|---|
0
trancer
07.12.12
✎
15:16
|
Всем привет.
Есть УФ. При создании её на сервере создаю ТЗ (100000 строк), кладу во временное хранилище (на сервере). Потом с клиента делаю безконтекстный вызов, достаю ТЗ из ВХ, меняю, кладу ТЗ обратно в ВХ. Замер производительности показывает то, чего я не понимаю. Почему на вызов он (замер) отнёс всё время? Почему на ПолучитьИзВременногоХранилища и ПоместитьВоВременноеХранилище замер отнес мало времени, а на ВызовСервераБезКонтекста замер фактически отнёс ВСЁ время? Как-то неинформативно. Куда время-то ушло? Вот код модуля формы: &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Колонка1", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка2", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка3", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка4", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка5", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка6", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка7", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка8", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка9", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); ТЗ.Колонки.Добавить("Колонка10", Новый ОписаниеТипов("Строка", ,Новый КвалификаторыСтроки(10, ДопустимаяДлина.Фиксированная))); Для Индекс = 1 По 100000 Цикл СтрокаТЗ = ТЗ.Добавить(); СтрокаТЗ.Колонка1 = "1234567890"; СтрокаТЗ.Колонка2 = "1234567890"; СтрокаТЗ.Колонка3 = "1234567890"; СтрокаТЗ.Колонка4 = "1234567890"; СтрокаТЗ.Колонка5 = "1234567890"; СтрокаТЗ.Колонка6 = "1234567890"; СтрокаТЗ.Колонка7 = "1234567890"; СтрокаТЗ.Колонка8 = "1234567890"; СтрокаТЗ.Колонка9 = "1234567890"; СтрокаТЗ.Колонка10 = "1234567890"; КонецЦикла; АдресВХ = ПоместитьВоВременноеХранилище(ТЗ, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура КомандаВызовСервераБезКонтекста(Команда) ВызовСервераБезКонтекста(АдресВХ); КонецПроцедуры &НаСервереБезКонтекста Процедура ВызовСервераБезКонтекста(АдресВХ) ТЗ = ПолучитьИзВременногоХранилища(АдресВХ); ТЗ[5000].Колонка5 = "9999999999"; ПоместитьВоВременноеХранилище(ТЗ, АдресВХ); КонецПроцедуры &НаКлиенте Процедура КомандаВызовСервераБезКонтекста1(Команда) ВызовСервераБезКонтекста1(); КонецПроцедуры &НаСервереБезКонтекста Процедура ВызовСервераБезКонтекста1() ффф = 1; КонецПроцедуры Вот скрин замера https://dl.dropbox.com/u/8057759/screens/2012-12-07%2015_03_27.png |
|||
1
acsent
07.12.12
✎
15:17
|
потому что так оно и есть
|
|||
2
trancer
07.12.12
✎
15:18
|
Блин криво отформатировалось. Вот скриншот еще раз Вот скрин замера https://dl.dropbox.com/u/8057759/screens/2012-12-07%2015_03_27.png
|
|||
3
trancer
07.12.12
✎
15:18
|
(1) Что так и есть конкретнее?
|
|||
4
acsent
07.12.12
✎
15:19
|
вызов сервера дороже чем получение из временного хранилища
|
|||
5
trancer
07.12.12
✎
15:24
|
(4) специально для этого сделал второй безконтекстный вызов, в котором НЕ провожу операции с ВХ. В указанном коде - это ВызовСервераБезКонтекста1. Его выполнение занимает 0,014733 с. В противовес 0,442244 с вызова, которые работает с ВХ.
|
|||
6
trancer
07.12.12
✎
15:25
|
то есть почти на два порядка меньше
|
|||
7
bzaugolnov
07.12.12
✎
15:30
|
(6) Есть предположение: При серверном вызове, временное хранилище тоже путешествует , если есть обращение к нему.
|
|||
8
trancer
07.12.12
✎
15:32
|
(7) насколько я понимаю есть ВХ на сервере и на клиенте. И они туда сюда не путешествуют и соответственно не пересекаются (они просто физически в разных местах). Но есть предположение, что 1с-ка как-то понимает, что в конкретном вызове есть обращение к ВХ и распаковывает это ВХ в самом начале вызова. Хотя как она это может понять непонятно.
|
|||
9
H A D G E H O G s
07.12.12
✎
15:33
|
(7) Вряд ли.
|
|||
10
H A D G E H O G s
07.12.12
✎
15:34
|
(8) Вряд ли.
|
|||
11
trancer
07.12.12
✎
15:35
|
(10) как тогда это объяснить? Я понимаю, что можно забить и использовать это, но хочу понять.
|
|||
12
H A D G E H O G s
07.12.12
✎
15:37
|
(7) Проверь это Окуенным по размеру данным массивом, получая его на клиенте из ВХ.
(8) Проверь это processmanager-ом. Под Толстым клиентов в файловом режиме - ВХ - это данные, записанные в файл 1Cv8tmp.1CD В клиен-сервервном - один из "v8_EAAD_1.tmp", записанных в tmp папку службой сервера 1С. |
|||
13
H A D G E H O G s
07.12.12
✎
15:37
|
Под Тонким - не проверял, но вот Вебклиент зарезал бы все при попытке писать чето неинтерактивно на диск.
|
|||
14
bzaugolnov
07.12.12
✎
15:41
|
(12) Что именно проверить? Если хранилище доступно и на сервере и на клиенте, значит оно перемещается. Вопрос как это оптимизировано?
|
|||
15
trancer
07.12.12
✎
15:41
|
(12) это понятно.
(13) это тоже понятно. Но, ИМХО, ответа это не даёт никак. |
|||
16
trancer
07.12.12
✎
15:44
|
(14) нет - это совершенно НЕ значит, что ВХ перемещается.
|
|||
17
H A D G E H O G s
07.12.12
✎
15:45
|
(14) Перемещается оно в момент Получить/Поместить во временное хранилище, ИМХО. Но это можно проверить, сделав
Массив=ПолучитьИзВременногоХранилища(АдресОкуенноБольшогоМассива): на клиенте. |
|||
18
trancer
07.12.12
✎
15:58
|
Хм. ВХ правда что ли путешествует?.. Я думал что нет.. Вот простая проверка: при создании на сервере
ааа = 2; АдресВХ1 = ПоместитьВоВременноеХранилище(ааа, УникальныйИдентификатор); На клиенте потом ааа = ПолучитьИзВременногоХранилища(АдресВХ1); Сообщить(Строка(ааа)); И выходит "2". То есть ВХ похоже путешествует. Тогда остается вопрос каким образом 1с-ка понимает, что в серверном вызове есть обращение к ВХ. Если такая операция вообще имеет место быть. |
|||
19
H A D G E H O G s
07.12.12
✎
16:00
|
(18) Ты меня сначало порадовал, а потом разочаровал.
|
|||
20
trancer
07.12.12
✎
16:04
|
(19) в смысле? Я сам запутался.
|
|||
21
trancer
07.12.12
✎
16:48
|
(19) я кажись понял, что ты сказал. ВХ хранится НА СЕРВЕРЕ. И при вызове ПоместитьВоВременноеХранилище на клиенте данные ГОНЯТСЯ НА СЕРВЕР. Или наоборот: поместили данные в ВХ на сервере, потом получаем их на клиенте, и ВОТ ТУТ данные из ВХ на сервере ГОНЯТСЯ НА КЛИЕНТ.
Так? |
|||
22
trancer
07.12.12
✎
16:50
|
(19) вернись, я всё прощу)
|
|||
23
bzaugolnov
07.12.12
✎
17:05
|
(21) Типа того. А какой клиент? Толстый/тонкий?
|
|||
24
trancer
07.12.12
✎
17:48
|
(23) тонкий
|
|||
25
H A D G E H O G s
07.12.12
✎
19:43
|
(21) Да, именно так.
|
|||
26
trancer
07.12.12
✎
19:50
|
(25) и всё-таки как объяснить (0) есть соображения?
|
|||
27
hhhh
07.12.12
✎
20:43
|
(26) а если вообще без хранилища сделать. Миллион команд по заполнению тз сколько времени займут? Тз - ведь очень тормозная вещь.
|
|||
28
H A D G E H O G s
07.12.12
✎
20:58
|
(27) Ничего не тормозная
|
|||
29
trancer
07.12.12
✎
21:07
|
(27) суть задачи - тема отдельной ветки. Здесь же у меня довольно конкретный вопрос. Не сочти за резкий ответ, просто не хочу в сторону дискуссию уводить.
|
|||
30
H A D G E H O G s
07.12.12
✎
21:08
|
(29) Ну может замер гонит.
Проверь большим массивом, получи его на клиенте, сравни время с получением на сервере. |
|||
31
trancer
07.12.12
✎
21:25
|
(30) походу действительно замер гонит. Сделал, как ты говоришь.
Вот код: &НаКлиенте Процедура КомандаСоздатьМассивНаСервере(Команда) АдресВХ2 = СоздатьМассивНаСервере(УникальныйИдентификатор); КонецПроцедуры &НаСервереБезКонтекста Функция СоздатьМассивНаСервере(УникальныйИдентификатор) Массив = Обработки.ТестТонкийКлиент.СоздатьМассив(); АдресВХ = ПоместитьВоВременноеХранилище(Массив, УникальныйИдентификатор); Возврат АдресВХ; КонецФункции &НаКлиенте Процедура КомандаИзменитьМассивНаКлиенте(Команда) Массив = ПолучитьИзВременногоХранилища(АдресВХ2); КонецПроцедуры &НаКлиенте Процедура КомандаИзменитьМассивНаСервере(Команда) ааа = ИзменитьМассивНаСервере(АдресВХ2); КонецПроцедуры &НаСервереБезКонтекста Функция ИзменитьМассивНаСервере(АдресВХ) Массив = ПолучитьИзВременногоХранилища(АдресВХ); Возврат Массив[5000]; КонецФункции При получении массива из ВХ на сервере картина ТАКАЯ же, как в (0). При получении массива из ВХ на клиенте замер показывается 2.6 с на выполнении функции ПолучитьИзВременногоХранилища, то есть правду говорит. Ну что, остановимся на "гонящем" замере? |
|||
32
H A D G E H O G s
07.12.12
✎
21:27
|
Да.
|
|||
33
trancer
07.12.12
✎
21:27
|
Обработки.ТестТонкийКлиент.СоздатьМассив() - это функция в модуле менеджера. Она создает массив из 100000 элементов строк вида "0123456789".
Кому интересно поиграться, вот обработка эта https://dl.dropbox.com/u/8057759/ТестТонкийКлиент.epf |
|||
34
H A D G E H O G s
07.12.12
✎
21:29
|
Никому не интересно :-)
|
|||
35
trancer
07.12.12
✎
21:29
|
Хотя кому это может быть интересно.. )
|
|||
36
H A D G E H O G s
07.12.12
✎
21:30
|
Я вот счаст поиграюсь с заполнением ТЗ.
Типизированное и нет. По времени и памяти. Вот это - интересно. |
|||
37
H A D G E H O G s
07.12.12
✎
21:46
|
Монопенисуально, как по времени, так и по памяти.
|
|||
38
trancer
07.12.12
✎
21:53
|
(37) та же картина, что и в (0) или в (31)?
|
|||
39
simol
07.12.12
✎
23:55
|
Поставь точку останова на получении из хранилища и замерь вызов до этой точки. Сохранится ли 0,44с?
А вообще замер в последних релизах часто ерунду стал показывать |
|||
40
vmv
08.12.12
✎
02:27
|
(0) по фрагменту кода в (0) понятно, что вы не туда попали - надо было учиться на повара
ну кто так иницициализирует колонки со стандартно иденексированным именем и идентичным типом, там же цикл в одну строку. |
|||
41
trancer
08.12.12
✎
14:23
|
(40) нормальный ход) Троль что ли?
Обращаюсь к модераторам, за (40) случайно не банят? Мне всё равно, может он другим насолит. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |