Вход | Регистрация
    1  2   

v8: Сегодня только узнал что 1С82 умеет кэшировать вызовы функций, офигел

v8: Сегодня только узнал что 1С82 умеет кэшировать вызовы функций, офигел
Я
   Гений 1С
 
24.10.08 - 11:10
1. Я знал0% (0)
2. Я не знал, в 1С много гитек оказывается0% (0)
3. Другое0% (0)
Всего мнений: 0

Причем этим кэшированием можно управлять, кэшируемые функции нужно выносить в специальные модули.
Правда кэш она хранит пять минут только в случае бездействия, это плохо.
Но т.к. нет глобальных серверных переменных, такая хрень достаточно полезна...
Интересно, чего там еще такого есть, скрытого!
   ТелепатБот
 
1 - 24.10.08 - 11:10
   mikecool
 
2 - 24.10.08 - 11:12
(0)  ссылку на описание
   Гений 1С
 
3 - 24.10.08 - 11:16
(2) Нету ссылки. Мне сказали...
   Гений 1С
 
4 - 24.10.08 - 11:16
Т.е. типо если Ф(А,Б,В) то в следующий раз Ф(А,Б,В) не вычисляется, а возвращается ранее вычисленный результат. Без изменения кода можно увеличивать производительность.
   ДенисЧ
 
5 - 24.10.08 - 11:17
А если в этой Ф() считаются остатки по регистрам? Тоже кешируется?
   ДенисЧ
 
6 - 24.10.08 - 11:17
ЗЫ. "гитик" пишется через И :-)
   ОчкарикСлава
 
7 - 24.10.08 - 11:22
Много чего кэшируется, описано в практич. пособии разработчика, читал гдето когдато...
   Rovan
 
8 - 24.10.08 - 11:22
(+5) или ищется некий элемент(ы) справочника (по фильтру) или документ по номеру :-)
   Rovan
 
9 - 24.10.08 - 11:25
(7) недано обсуждали про кеширование объектов (документ, справочник)
   IamAlexy
 
10 - 24.10.08 - 11:26
а еще 8ка бизнеспроцессы умеет...
много бизнеспроцессов в типовых? :)
   nop
 
11 - 24.10.08 - 11:27
(0) Что значит "кэшировать функции" ?? Результат функции кэшировать очень сложно.
Кэшируется код? Вот это полезность, так полезность...
   IamAlexy
 
12 - 24.10.08 - 11:29
вопрос в том что есть кеширование функции.. если значение какоелибо то нафига его кешировать если можно в переменную записать.
если объект - то чем это отличается от кеширования объектов???

соответственно функция вызывается тогда когда нужно именно что то новое получить... все старье в переменных... накой фиг ее кешировать то? :)
   H A D G E H O G s
 
13 - 24.10.08 - 11:32
(3) Мне вчера сказали, что всех Гениев 1C, а также Гениев 1АБ, и также Гениев 18+ отправляют на Байкал омуля добывать.. Ссылку привести тоже не могу.
   Rovan
 
14 - 24.10.08 - 11:35
(11) как это Кэшируется код?
код в смысле 1С.exe ? - за это мс вынь отвечает
или код в конфа ? - дык она в пять грузится вся
   nop
 
15 - 24.10.08 - 11:36
Тема кэша не раскрыта ...
   Гений 1С
 
16 - 24.10.08 - 11:39
(2) к тому же где ты видел документацию по 1с в онлайне? только в книжках. гыгыгы
   Гений 1С
 
17 - 24.10.08 - 11:40
(5) А нефиг такую функцию вызывать для остатков по регистрам. Кешируется по параметрам, т.е. по сигнатуре параметров
   Jolly Roger
 
18 - 24.10.08 - 11:40
Чо за бред?
   Гений 1С
 
19 - 24.10.08 - 11:40
(7) Да, но теперь этим можно управлять.
   Гений 1С
 
20 - 24.10.08 - 11:41
(11) кури 4-й пост
   ДенисЧ
 
21 - 24.10.08 - 11:41
(17) Не 1су решать, что и когда мне вызывать.
   i-rek
 
22 - 24.10.08 - 11:41
не может быть.
Если б это было так, оборотка запускалась бы первый раз долго, второй раз мгновенно. Этого не происходит ))
   Господин ПЖ
 
23 - 24.10.08 - 11:45
эээ... нафига вызывать Ф(А,Б,В) несколько раз подряд...
   IamAlexy
 
24 - 24.10.08 - 11:46
(20) но ведь в(4) это же бред.
над вами прикололись а вы повелись?

если мне нужно результат Ф(а,б,с) использовать повторно то я сделаю так:

результат=ф(а,б,с);
ну и дальше буду играться с переменной "результат".
а когда мне потребуется обновить значение переменной я повторно вызову функцию
результатОбновленный=ф(а,б,с);
нафига мне КЕШИРОВАТЬ РЕЗУЛЬТАТ РАБОТЫ ФУНКЦИИ????
   Гений 1С
 
25 - 24.10.08 - 11:48
ну например если у тебя есть функция Ф(А,Б), ты ее вызываешь Ф(Пользователь Петров, ОсновнаяВалюта) = Доллары, то в следующий раз когда ты вызовешь Ф(Пользователь Петров, ОсновнаяВалюта), она вернет Доллары, не вычисляя.
А вот если ты спросишь Ф(Пользователь Иванов, ОсновнаяВалюта) или Ф(Пользователь Петров, ОсновнойСклад), она опять будет вычислять.
   Гений 1С
 
26 - 24.10.08 - 11:49
(24) дятел, это для автоматического разруливания таких случаев:


Функция Х()
результат=ф(а,б,с); 
Возврат Результат;
КонецФункции

Для Инд = 1 по 100000 Цикл
Сообщить(Х);
КонецЦикла;
   Гений 1С
 
27 - 24.10.08 - 11:49
(24) чтобы не хешировать ручками...
   Господин ПЖ
 
28 - 24.10.08 - 11:49
Фиксин, а ты скульный кэш с кэшом 1С не путаешь?
   Гений 1С
 
29 - 24.10.08 - 11:50
(22) так это надо еще прикручивать... к тому же для оборотки это юзать бессмысленно. ;-)

Не знаю, есть у них функция очистки кэша?
вообще как обычно в 1с бывает, первые версии кривые и "нязграбныя", как говорят в белоруси
   Гений 1С
 
30 - 24.10.08 - 11:50
(28) нет, батенька
 
 Рекламное место пустует
   IamAlexy
 
31 - 24.10.08 - 11:50
(26)
неудачный пример.

что мешает разрулить так:

результат=ф(а,б,с);
Для Инд = 1 по 100000 Цикл
Сообщить результат;
КонецЦикла;
   Гений 1С
 
32 - 24.10.08 - 11:50
на партнерском была ветка, я там прочитал
   Гений 1С
 
33 - 24.10.08 - 11:51
(31) ну ты тормоз... я тебе идиотский пример специально привел. Кэш используется, когда ты не знаешь, из каких мест кода будет вызываться функция, но знаешь, что можно захешировать результат на все время жизни сеанса, например
   Господин ПЖ
 
34 - 24.10.08 - 11:51
йопт... он сюды еще и хэш приплел...

(26) О_о
   Гений 1С
 
35 - 24.10.08 - 11:53
(34) извини, описался
   Гений 1С
 
36 - 24.10.08 - 11:54
так вот, для алексия еще пример.
Допустим ты считал настройку пользователя функцией НастройкаПользователя("ОсновнаяВалюта").
Чтобы в след раз не дергать регистр, функция хешируется.
Можно конечно все настройки занести в глоб переменную, но тогда мы тратим лишнее время на чтение тех настроек, которые не нужны.
Можно эмулировать кэш, но в данном случае все происходит на автомате.
   nop
 
37 - 24.10.08 - 11:55
(20) А если функция содержит чтение из БД?
   IamAlexy
 
38 - 24.10.08 - 11:55
(33) хоть один живой пример приведи.
параметры сеанса нельзя использовать ?
   H A D G E H O G s
 
39 - 24.10.08 - 11:56
(0) Счаст мы тебя проверим...
   Гений 1С
 
40 - 24.10.08 - 11:57
(37) иногда имеет смысл кэшировать, например те же настройки пользователя. А если БД поменялась, можно сбросить кэш. Правда 1сники сбрасывают кэш целиком, мазафакеры.
   Гений 1С
 
41 - 24.10.08 - 11:57
(38) 1с не рекомендует использовать много параметров сеанса. Это раз, во вторых тогда кэширование придется ручками прописывать
   SilentMan
 
42 - 24.10.08 - 11:58
(0) Я всегда знал, что читать ты не умеешь, лучше-бы ты писать не умел.
Кэшировать умеет 8.2 ...
   Гений 1С
 
43 - 24.10.08 - 11:58
Вот тебе живой пример.
Я использую конвертацию одних проводок в другие.
Для каждого счета я получаю список правил конвертацией функцией СписокПравилКонвертации(Сч).
Так вот, я могу конечно составить соответствие и проверять, вычислял я уже список правил или нет, а могу тупо закэшировать результат функции.
   Регистратор
 
44 - 24.10.08 - 11:59
похоже что в 1с занятья более нечем, лучшебы память у них на сервере не утекала
   Гений 1С
 
45 - 24.10.08 - 11:59
(42) Точно?
Дело как было? я подумал, что неплохо было бы кэшировать, выдвинул тему на партнерском, а мне ответили, что это уже работает. ;-)
   Гений 1С
 
46 - 24.10.08 - 11:59
(44) плохому танцору
   IamAlexy
 
47 - 24.10.08 - 12:00
хм.. честно говоря рациональное зерно есть но по сути это пушки по воробьям.. чо то мне сложно придумать что то более серьезное с кешем функции чем настройки пользователя которые можно во первых хранить в параметрах сеанса ибо их как правило немного...

а париться с кешем ради того чтобы лишний раз не прочитать основную валюту пользователя - имхо бессмысленно совершенно...
   SilentMan
 
48 - 24.10.08 - 12:00
(45) При этом ты настолько ослеп, что раздел форума (куда тебя послали) прочитать не смог ...
   H A D G E H O G s
 
49 - 24.10.08 - 12:02
Функция Тест(Параметр)
    Рез=0;
    Для i=1 По Параметр Цикл
        Рез=Рез+i;
    КонецЦикла;
    Возврат Рез;
КонецФункции

Процедура ОсновныеДействияФормыТест(Кнопка)
    Результат=Тест(100000);
    Результат=Тест(100000);
    Результат=Тест(100000);
    Результат=Тест(100000);
КонецПроцедуры
   ДенисЧ
 
50 - 24.10.08 - 12:02
А давайте гению на титан сбросимся... И лес целее будет, и строителям поможем...
   H A D G E H O G s
 
51 - 24.10.08 - 12:05
Проценты:
25,95
24,73
24,66
24,65
   Гений 1С
 
52 - 24.10.08 - 12:06
(47) Ты просто мало занимался ускорением... Тебе простительно.
   H A D G E H O G s
 
53 - 24.10.08 - 12:06
(51) Ну да, тренд идет вниз :-)
   Гений 1С
 
54 - 24.10.08 - 12:07
(49) Ты не включил кэширование, ежик
   Регистратор
 
55 - 24.10.08 - 12:09
Да достижение офигеть тормознутость своего интепретатора 1с пытается лечить кешированием результатов выполнения функций не обращающихся к данным :)))
   H A D G E H O G s
 
56 - 24.10.08 - 12:11
(54)
1) Дмитрий, Дмитрий Сергеевич, Дима, Димочка, Димон, Димыч и даже Hadgehogs, но не как не ежик. Сергей, постарайся это понять и запомнить. Это совет.
2) Как мне включить это чудо - кэширование?
   Jolly Roger
 
57 - 24.10.08 - 12:14
(56) Кэширование результатов функций доступно только Гениям...
   H A D G E H O G s
 
58 - 24.10.08 - 12:15
(57) Тоесть, я - не айс?
   Гений 1С
 
59 - 24.10.08 - 12:20
(58) Спили мушку, включи кэширование... Кэширование автоматом не происходит. Функция должна быть в общем модуле, допускающем кэширование
   H A D G E H O G s
 
60 - 24.10.08 - 12:21
(59) Айн момент..
 
 Рекламное место пустует
   MSensey
 
61 - 24.10.08 - 12:23
Гений, у тебя в последнее время какое-то обострение.
Отдохни чуток
ps (0) в 8.2 реализован
   Гений 1С
 
62 - 24.10.08 - 12:23
(60) в 8.2. тестируй, лана?
   Гений 1С
 
63 - 24.10.08 - 12:24
(61) тебя напрягает? если да, то чем? если нет, то фигли?
   H A D G E H O G s
 
64 - 24.10.08 - 12:27
(63) Гений, из тебя бы вышел показательный (знаковый) пользователь..
<<Сегодня только узнал что 1С81 умеет кэшировать>>
<<в 8.2. тестируй, лана?>>
Это нормально..
   Господин ПЖ
 
65 - 24.10.08 - 12:30
эээ... так речь про 8.1 или 8.2 все таки?
   trdm
 
66 - 24.10.08 - 12:31
Совершенно тупая, затратная и ненужная фигня.
Лучше бы ресурс тратили на более умные вещи..
   MSensey
 
67 - 24.10.08 - 12:32
(63) Я тебе говорю взгляд со стороны, бывает что человек не замечает своей "болезни"
   H A D G E H O G s
 
68 - 24.10.08 - 12:32
(0) А если в расчете участвуют глобальные переменные, которые передаются не через параметры функции. И между вызовами они изменились. 1С это учтет?.
   NULLL
 
69 - 24.10.08 - 12:33
(61) Где сохранается кеш? Если на сервере - то он может не обновлятся и неделями.
   Гений 1С
 
70 - 24.10.08 - 12:38
(66) Не, борис, ты не прав, надо уметь готовить. У меня документ грузился 30 минут, после кеширования (правда ручками написал) - 3 минуты... А тут можно чисто автоматизировать без ручек.
   Гений 1С
 
71 - 24.10.08 - 12:39
(67) Ты видел хоть одного психа, осознавшего, что он псих. Смысл твоих усилий?
   Гений 1С
 
72 - 24.10.08 - 12:39
(68) функции хэшируются не по ссылке, а по значению параметров, если ты этого еще не понял
   Дерево
 
73 - 24.10.08 - 12:40
(70)я вот зарегится не поленился из-за тебя...

делись!
   MSensey
 
74 - 24.10.08 - 12:40
(71) клятва гепократа
   Гений 1С
 
75 - 24.10.08 - 12:40
(68) А, я понял о чем ты. Ты кэшируемые функции пишешь сам, поэтому ответственность за их код на тебе. Не юзай глобальные (волитарные) переменные в коде кэшируемых функций. Для того чтобы юзать кеш, не любая функция годится
   Гений 1С
 
76 - 24.10.08 - 12:40
(73) чем делиться?
   MSensey
 
77 - 24.10.08 - 12:41
(72) "хэшируются" - Гений не наступай на теже грабли второй раз
   Дерево
 
78 - 24.10.08 - 12:45
(76) в (70) написано : "У меня документ грузился 30 минут, после кеширования (правда ручками написал) - 3 минуты... А тут можно чисто автоматизировать без ручек." вот как это сделать и делись
   Гений 1С
 
79 - 24.10.08 - 12:46
я проанализировал ход выполнения кода, обнаружил, где она больше всего жрет времени, вынес это в кэши, например:

Кэширование поиска значений по ключу:

КэшПоискЗначений = П.Кэши.ПоискЗначений[ВидСубконтоУУ];
Если КэшПоискЗначений = Неопределено Тогда
    КэшПоискЗначений = Новый Соответствие();
    П.Кэши.ПоискЗначений.Вставить(ВидСубконтоУУ, КэшПоискЗначений);
КонецЕсли;

...
КэшПоискЗначений.Вставить(РезКодПоиска, ?(Результат = Неопределено, NULL, Результат)); 

Запрос создаю только один раз, а не в цикле, т.е. не тратится время на его компиляцию:

З = П.Кэши.ЗапросПоСоздаваемымОбъектам;
З.УстановитьПараметр("ИдВнешний", РезКодПоиска);
Р = З.Выполнить().Выбрать();
Если Р.Следующий() Тогда
    Результат = Р.Объект;
    Перейти ~КонецАлг;
КонецЕсли;


Кэширование обращения к метаданным:
Если СокрЛП(ВидСубконтоУУ.ИмяРеквизитаПоиска)<>"" Тогда
    РеквизитПоиска = СокрЛП(ВидСубконтоУУ.ИмяРеквизитаПоиска);
Иначе
    Если НЕ П.Кэши.НаличиеРеквизита.Свойство(ВидСубконтоУУ.Имя+"_"+"ИдВнешний") Тогда
        П.Кэши.НаличиеРеквизита.Вставить(ВидСубконтоУУ.Имя+"_"+"ИдВнешний", Метаданные.Справочники[ВидСубконтоУУ.Имя].Реквизиты.Найти("ИдВнешний") <> Неопределено);
    КонецЕсли;        
    Если П.Кэши.НаличиеРеквизита[ВидСубконтоУУ.Имя+"_"+"ИдВнешний"] Тогда
        РеквизитПоиска = "ИдВнешний";
    Иначе
        Если НЕ П.Кэши.НаличиеРеквизита.Свойство(ВидСубконтоУУ.Имя+"_"+"Код6") Тогда
            П.Кэши.НаличиеРеквизита.Вставить(ВидСубконтоУУ.Имя+"_"+"Код6", Метаданные.Справочники[ВидСубконтоУУ.Имя].Реквизиты.Найти("Код6") <> Неопределено);
        КонецЕсли;
        Если  П.Кэши.НаличиеРеквизита[ВидСубконтоУУ.Имя+"_"+"Код6"] Тогда
            РеквизитПоиска = "Код6";
        Иначе
            П.Вставить("РезКодПоиска", "Не определен реквизит для поиска в справочнике");
            П.ОписаниеОшибкиПоиска = "Не определен реквизит для поиска в справочнике. ";
            Перейти ~КонецАлг;//Искать не по чем
 
        КонецЕсли;
    КонецЕсли;
КонецЕсли;



Ну и еще много других мест.

Все это дало прирост производительности в 10 раз. ;-) Но можно было бы юзать кэши 1с, если бы она это сделала нормально, а не как всегда.
   Дерево
 
80 - 24.10.08 - 12:46
что-то мне вспомнился один земляк пристававший со словами: "Хэша хапнуть хочешь?"
   Гений 1С
 
81 - 24.10.08 - 12:46
(78) Кури (79)
   H A D G E H O G s
 
82 - 24.10.08 - 12:47
(77) Не придерайтесь к словам.
А вообще приблуда бесполезная, имеющая смысл только для ленивых/забывчивых/студентов.
   Гений 1С
 
83 - 24.10.08 - 12:48
(82) имеющая смысл для оптимизаторов, чтобы не писать такие многоэтажки, как в (79), хотя конечно если бы в 1с была возможность статических переменных и серверных глобальных переменных, кэширование было бы менее востребовано.
   Дерево
 
84 - 24.10.08 - 12:48
пост (80) не к автору а вообще - осень как никак
   IamAlexy
 
85 - 24.10.08 - 12:49
да пофиг.. мы как писали ЭТО так и будем писать:

функция блаблабла(а)
запрос = "....";
возврат запрос.выполнить().выгрузить();
конецфунции;


Пока а<б цикл
контрагент = блаблабла(б);
конецЦикла;
   Гений 1С
 
86 - 24.10.08 - 12:49
(82) придираться к буквам (буквоедство) - это характерная черта программистов... Реально, замечаю часто только у программеров. Для остальных важнее смысл, а не форма. Видимо сказывается нервная дрожь при ошибке одной буквы в идентификаторе и ругательство синтакс чека.
   Дерево
 
87 - 24.10.08 - 12:50
(83) КэшПоискЗначений = П.Кэши.ПоискЗначений[ВидСубконтоУУ];
"П." это что за зверь?
   Гений 1С
 
88 - 24.10.08 - 12:50
(85) Вот запрос = "...."; можно было бы прохешировать и не тратить время на компиляцию запроса...
   Гений 1С
 
89 - 24.10.08 - 12:51
(87) Это сквозная структура, содержит контекст, путешествует по всем функциям блока
   0xFFFFFF
 
90 - 24.10.08 - 12:51
(59)
Я вот не понял - речь про 8.1?
   Живой Ископаемый
91 - 24.10.08 - 12:51
вы замучали! буквы "х" и "к" даже не рядом, следите за пальцами когда печатаете, а то меня в мозгу начинаются расходящиеся процессы...
   Дерево
 
92 - 24.10.08 - 12:52
{Форма.Форма(3,21)}: Переменная не определена (П)
    КэшПоискЗначений = <<?>>П.Кэши.ПоискЗначений[ВидСубконтоУУ]; 
{Форма.Форма(3,42)}: Переменная не определена (ВидСубконтоУУ)
    КэшПоискЗначений = П.Кэши.ПоискЗначений[<<?>>ВидСубконтоУУ];
   Дерево
 
93 - 24.10.08 - 12:54
(89)нифига не понял...
   Гений 1С
 
94 - 24.10.08 - 12:55
(92) ну ты даешь... это же фрагмент кода. а не готовый код.
   Гений 1С
 
95 - 24.10.08 - 12:56
(91) тренируй восприятие
   Гений 1С
 
96 - 24.10.08 - 12:56
(90) Уже сказали - 8.2, счас тему поменяю
   MSensey
 
97 - 24.10.08 - 12:56
(86) Гений, я не придераюсь, и не к буквам. А тому что ты не различаешь кэширование от хеширования.
   Дерево
 
98 - 24.10.08 - 12:57
(96)Супер!!!
   Живой Ископаемый
99 - 24.10.08 - 12:58
(97) Он различает, я помню ветку когда он про хэширование узнал...
   Гений 1С
 
100 - 24.10.08 - 13:00
Гы, кстати прикол хотите:

КэшПоискЗначений.Вставить(РезКодПоиска, ?(Результат = Неопределено, NULL, Результат)); 

 //Защита от переполнения памяти! 20081023
 
Если КэшПоискЗначений.Количество() > 20000 Тогда
    КэшПоискЗначений.Очистить(); 
КонецЕсли;
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Э. Йодан
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.