Имя: Пароль:
1C
1С v8
Локальное кэширование переменных
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) не, ввод на основании я как раз на файловой наблюдал
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший