|
Локальное кэширование переменных | ☑ | ||
---|---|---|---|---|
0
ВПоискахИстины
13.08.13
✎
19:20
|
Иногда получается код, содержащий повторение одинаковых обращений через точку, например в цикле. Схематично:
Для Каждого ТекСтрокаВыписка Из Выписка Цикл // регистр Управленчекий Движение = Движения.Управленчекий.Добавить(); Движение.СчетДт = ПланыСчетов.Основной.РасчетыСПоставщиками; Движение.СчетКт = ПланыСчетов.Основной.РасчетныеСчета; Движение.Период = Дата; Движение.Сумма = ТекСтрокаВыписка.Сумма; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = ТекСтрокаВыписка.Контрагент; Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.РасчетныеСчета] = ТекСтрокаВыписка.РасчетныйСчет; КонецЦикла; Есть ли смысл кэшировать переменные, чтобы было быстрее? лСчетДт = ПланыСчетов.Основной.РасчетыСПоставщиками; лСчетДт = ПланыСчетов.Основной.РасчетныеСчета; лКонтрагенты = ПланыВидовХарактеристик.ВидыСубконто.Контрагенты; лРасчетныеСчета = ПланыВидовХарактеристик.ВидыСубконто.РасчетныеСчета; Для Каждого ТекСтрокаВыписка Из Выписка Цикл // регистр Управленчекий Движение = Движения.Управленчекий.Добавить(); Движение.СчетДт = лСчетДт; Движение.СчетКт = лСчетКт; Движение.Период = Дата; Движение.Сумма = ТекСтрокаВыписка.Сумма; Движение.СубконтоДт[лКонтрагенты] = ТекСтрокаВыписка.Контрагент; Движение.СубконтоКт[лРасчетныеСчета]=ТекСтрокаВыписка.РасчетныйСчет; КонецЦикла; Спасибо. |
|||
1
Zamestas
13.08.13
✎
19:25
|
(0) Есть смысл.
|
|||
2
Fragster
модератор
13.08.13
✎
19:28
|
с предопределенными элементами не знаю, есть ли смысл, а вот если бы было через точку обращение к реквизиту - то тогда точно смысл был бы
|
|||
3
H A D G E H O G s
13.08.13
✎
19:32
|
Только в COM соединении с другой базой.
|
|||
4
ВПоискахИстины
13.08.13
✎
19:33
|
Написал ручками обработку, элемент справочника - предопределенный. Результат выдало в итоге: обычным путем 10сек, "оптимизированным" - 6:) Получается, есть смысл на больших дистанциях..
&НаКлиенте Процедура Гото(Команда) П1(); КонецПроцедуры &НаСервере Процедура П1() Дата1 = ТекущаяДата(); Для А = 1 по 1000000 Цикл Б = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента; КонецЦикла; Дата2 = ТекущаяДата(); лФак = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента; Для А = 1 По 1000000 Цикл Б = лФАК; КонецЦикла; Дата3 = ТекущаяДата(); Время1 = Дата2 - Дата1; Время2 = Дата3 - Дата2; Сообщить("" + Время1 + "//" + Время2); КонецПроцедуры |
|||
5
ВПоискахИстины
13.08.13
✎
19:34
|
(3) выигранная производительность слишком мала в остальных случаях?
|
|||
6
H A D G E H O G s
13.08.13
✎
19:35
|
(4) Круто.
Теперь туда же, в цикл,в оба случаю добавь безобидное Сообщить() либо МоЯСтрока=МояСтрока+"Всем строкам строка"; |
|||
7
ВПоискахИстины
13.08.13
✎
19:40
|
(6) на миллион итераций бодается пока. на 1000 - по 0 секунд заняло. думаешь одинаково выдаст?
|
|||
8
H A D G E H O G s
13.08.13
✎
19:43
|
(7) Я думаю, что у тебя 100500 мест, в которых можно излить себя в оптимизации.
|
|||
9
ВПоискахИстины
13.08.13
✎
19:51
|
(8) Тонко подметил:) Буду морочиться, когда действительно потребуется. Второе на треть быстрее первого, но на общую скорость пули не влияет..
|
|||
10
banco
13.08.13
✎
19:53
|
(0) и где тут кэширование?
|
|||
11
mistеr
13.08.13
✎
21:57
|
(0) Имеет смысл для повышения читабельности. В типовых используется, и я полагаю, именно для этого.
Компилятор не настолько глуп, чтобы не оптимизировать это. |
|||
12
Fragster
модератор
13.08.13
✎
22:03
|
(11) ты видел исходники 1с? о_О
|
|||
13
hhhh
13.08.13
✎
22:14
|
(12) то, что через точку, реально кешируется платформой. Проверял.
|
|||
14
Grobik
13.08.13
✎
22:17
|
(13) Спасибо. Очистили мою совесть на базах до 5 пользователей. Всегда брал через точку, если ничего не предвещало беды.
|
|||
15
hhhh
13.08.13
✎
22:33
|
(14) например, ввод на основании, если передать в процедуру ОбработкаЗаполнения параметр ДокументОснование типа ДокументСсылка и типа ДокументОбъект, они выполнятся примерно одинаково. То есть платформа один раз делает ПолучитьОбъект(), потом помещает его в кеш и использует.
|
|||
16
mistеr
13.08.13
✎
22:51
|
(12) Не видел. Но о разработчиках платформы хорошего мнения (в целом). В описании каждого релиза много оптимизаций. А это одна из наиболее очевидных.
|
|||
17
Fragster
модератор
13.08.13
✎
23:07
|
(15) смотрел профайлером?
|
|||
18
vde69
модератор
13.08.13
✎
23:29
|
(17) это только для клиент серверного варианта, это описано в документации сервера 1с (еще версии 8.0), только там этот кеш живет совсем не долго, несколько секунд, потом опять будет запрос.
|
|||
19
Fragster
модератор
13.08.13
✎
23:34
|
(18) кстати для ДокументОбъект - факт, что обращения повторного не будет, пока не попытаешься записать. А вот для ссылки - все равно ЕМНИП запрос на версию
|
|||
20
vde69
модератор
13.08.13
✎
23:42
|
(19) на память 1.8 секунды кеш серверный на такие вещи.
Хотя в последних версиях наверно и по другому, учитывая кластерную ориентацию и модули повторного использования.... |
|||
21
mistеr
13.08.13
✎
23:55
|
(15) Это другое кэширование. В примере ТС получение ссылок на предопределенные элементы. Они (ссылки) не могут поменяться в результате выполнения любого кода.
|
|||
22
mistеr
13.08.13
✎
23:56
|
(20) У меня в памяти почему-то сидит 20 секунд, из какой-то ЖКК.
|
|||
23
hhhh
14.08.13
✎
00:32
|
(18) не, ввод на основании я как раз на файловой наблюдал
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |