Имя: Пароль:
1C
1С v8
Временное хранилище на сервере и безконтекстные серверные вызовы. Вопрос.
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) случайно не банят? Мне всё равно, может он другим насолит.