Переключение на Главную Страницу Страницы: [1] 2 3 ... 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) Подписка на события vs Перехватчик в каждом классе (число прочтений - 24529 )
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Подписка на события vs Перехватчик в каждом классе
13. Августа 2008 :: 11:35
Печать  
Вам, на рассмотрение, предлагаю две конфигурации: !TestHooker c классом-перехватчиком (в двух вариантах: сам по себе и базовый-наследник), который сам управляет передачей событий другим классам-перехватчикам и !TestHookerПодписка с подпиской на события.
Предупреждаю сразу: классы с подпиской даны не в полном объеме и не со всеми возможностями, а только как пример, для понимания процесса подписки.
Сравниваем классы (варианты перехвата):
1) класс-перехватчик, который сам передает события другим перехватчикам (далее Одиночка: почему так назвал - не знаю) посредством Перехватчик.ВыполнитьСобытиеГК(ПредПерехватчик, ГрупповойКонтекст, ИмяСобытия, <параметры>) и на его плечи ложиться забота о всех событиях, которые могут возникнуть на форме;
2) базовый класс (далее БазовыйПерехватчик), который работает аналогично Одиночке, но от него плодим Наследников (далее НаследникПерехватчик), которые не заботятся о передаче событий другим классам-перехватчикам, т.е. упрощается реализация класса;
3) вариант подписки: создаем глобальный класс перехвата ГМ (далее ПерехватчикГМ), который создает один класс-перехватчик на форму (далее ПодпискаБазовый) или наследника от него (далее ПодпискаНаследник), а другие классы, создаваемые в этой форме подписываются на события формы с помощью глобальной процедуры (для примера класса-подписчика использовал КлассПодписчикБезПрехватчика).
По, мной проведенным тестам, привожу на ваш суд статистику с комментариями. Тест проводился на релизах 1срр: 2.5.0.5, 2.5.0.6, 3.0.1.12; 1С 27-й релиз; создавалось 300 классов (т.к. классы пустые и выполняются быстро, и оценивается их работа, а не содержание, то пришлось давить количеством).НЕ УТВЕРЖДАЮ, что абсолютно прав (в написанном коде), но, с моими познаниями программирования Улыбка, могу объективно сказать следующее.

Скорость (пункт - это, соответственно, место; первое - самый быстрый вариант):
1) Одиночка: 6-7 мс
2) ПодпискаНаследник: 8-9 мс (странно, но ПодпискаБазовый: 11-12 мс! это вопрос тебе, Артур)
3) НаследникПерехватчик: 15-18 мс
Инициализация (создание классов, желающих получать события формы):
точного замера не делал, но визуально видно
1) КлассПодписчикБезПрехватчика с последующей подпиской - доля секунды
2) Одиночка и НаследникПерехватчик - около секунды
Память (в смысле первое место - меньше памяти):
1) КлассПодписчикБезПрехватчика
2) Одиночка и НаследникПерехватчик
Использование (в смысле, читабельность и, соответственно, повторяемость кода):
1) КлассПодписчикБезПрехватчика (с подпиской): не заботимся об описании всех событий формы, не вызываем базовый класс или пред.перехватчик - только код реализации. И еще быстрый выход из цепочки обработки события, т.е., например, если класс обрабатывает определенный реквизит формы, то после того, как он сделал свое дело, возвращает 0 и вся цепочка события завершает свою работу, а не идет по стеку через все перехватчики формы (я понятно изложил?).
2) НаследникПерехватчик: не заботимся об описании всех событий формы, но не забываем о вызове базового класса (если необходимо)
3) Одиночка: заботимся об описании всех событий формы, вызываем пред.перехватчик
Обратная совместимость: (Артур, не кричи Очень довольный - ну помешан я на обратной совместимости (о чем аргументированно ответил раньше)!)
1) Подписка: работает на всех релизах 1срр, где есть Перехватчик, и со всеми классами, т.е. сам класс перехватывает форму (релизы где-то после 05.06.08) или подписывается на них
2) НаследникПерехватчик и Одиночка: только на релизах, где-то после 05.06.08

Из всего вышесказанного могу, для себя, сделать вывод, что Подписка рулит практически по всем пунктам (кроме скорости Подмигивание)!
Одно из главных преимуществ - читабельность кода. Мои классы, после переделки на подписку, "усохли" в 3-10 раз, а понимание кода, особенно давно сделанного и уже забытого, стало выше, чем когда писал раньше (нашел кучу тараканов Улыбка). Лично я, буду пользоваться только подпиской, чего и вам желаю.
На втором месте НаследникПерехватчик, но не работает на ранних релизах.
Ну и в конце паровоза: Одиночка - лёгенький гемор.

Выводов (для тех, кто считает не в пользу подписки) делать не буду, дабы не обидеть программеров и не наступить на больной мозоль Подмигивание
Решайте сами, тесты прилагаются, думайте. Может найдете в моем коде о-о-очень большую ошибку - критика приветствуется, и даже очень!
Еще раз повторюсь: классы с подпиской даны не в полном объеме и не со всеми возможностями, а только как пример, для понимания процесса подписки.

Прав некто (не буду говорить кто), когда кричит: "Тест давай!" (ленивый, наверное, сам писать Улыбка), но благодаря написанию этих кратких конфигураций нашел еще несколько подводных камней, в плане скорости и использования памяти.
Поэтому полный код подписки выкладывать сейчас не хочу, пока не найду всех тараканов и не проверю в боевых условиях.

Всем удачи, жду вопросов/критики/отзывов (только не плеваться, а аргументированно)
  

TestHooker_001.rar ( 43 KB | Загрузки )

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #1 - 13. Августа 2008 :: 11:57
Печать  
AndreyM писал(а) 13. Августа 2008 :: 11:35:
Обратная совместимость: (Артур, не кричи Очень довольный - ну помешан я на обратной совместимости (о чем аргументированно ответил раньше)!)
1) Подписка: работает на всех релизах 1срр, где есть Перехватчик, и со всеми классами, т.е. сам класс перехватывает форму (релизы где-то после 05.06.08) или подписывается на них
2) НаследникПерехватчик и Одиночка: только на релизах, где-то после 05.06.08

Твой код пока не изучал, но сразу скажу, что принципиальной разницы между примененными тобой методами быть не должно 100% Улыбка
Наверняка так получается из-за твоей реализации.

Но в ранних версиях есть различные баги Перехватчика (их немало) (см.багзиллу), поэтому эти ранние версии и не рекомендуются к использованию.
2.5.0.5 сразу отметаю - там работа Перехватчика в полном объеме не гарантируется и рассмотрение багов для этой версии по Перехватчику я не принимаю!
В еще более ранних версиях, чем 2.5.0.5, тем более!

2.5.0.7 можно использовать, но в 3.0 исправлена тройка довольно критичных багов (см. описание в http://www.1cpp.ru/index.php/Image:Icpp-latest.rar ) ->
Цитата:
[-] 3791 Перехватчик: не работала установка повторного перехвата на уже перехваченную форму
[-] 3893 Если в модуле формы документа нет обработчика ВводНаОсновании(), в Перехватчике не работал глобальный перехват СобытиеГМ_ВводНаОсновании
[-] 4040 Исправление - у событий перехватчика глобального модуля СобытиеГМ_ (ПриОткрытии, ВводНового, ВводНаОсновании) количество параметров задано по максимуму.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #2 - 13. Августа 2008 :: 12:09
Печать  
След.момент - нафига в случае без подписки грузишь ФормЕкс ?
ФормЕкс ведь также выполняет некоторые собственные перехваты и действия, которые влияют на скорость Печаль
Т.е. чистота эксперимента нарушена!
Проверь свои цифры без ФормЕкс.

См.ниже
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #3 - 13. Августа 2008 :: 12:13
Печать  
artbear писал(а) 13. Августа 2008 :: 12:09:
След.момент - нафига в случае без подписки грузишь ФормЕкс ?
ФормЕкс ведь также выполняет некоторые собственные перехваты и действия, которые влияют на скорость Печаль
Т.е. чистота эксперимента нарушена!
Проверь свои цифры без ФормЕкс.

Разобрался, это было ошибочно Улыбка
ФормЕкс грузится в обеих базах, но в варианте с подпиской ФормЕкс грузится правильно, после включения Перехвата, а в другом варианте загружается до включения Перехвата, что также влияет на скорость.
Проверь вариант без подписки с загрузкой ФормЕкс после установки Перехвата
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #4 - 13. Августа 2008 :: 12:20
Печать  
artbear писал(а) 13. Августа 2008 :: 11:57:
Наверняка так получается из-за твоей реализации.

Возможно. Жду предложений, как реализовать по-другому, чтобы подписку уронить в моих глазах и глазах форумчан, и сместить хотя-бы на второе место Улыбка
artbear писал(а) 13. Августа 2008 :: 11:57:
Но в ранних версиях есть различные баги Перехватчика (их немало) (см.багзиллу), поэтому эти ранние версии и не рекомендуются к использованию.
2.5.0.5 сразу отметаю - там работа Перехватчика в полном объеме не гарантируется и рассмотрение багов для этой версии по Перехватчику я не принимаю!
В еще более ранних версиях, чем 2.5.0.5, тем более!

Это я знаю, и перед тем как сейчас ответить еще раз проверил подписку: на релизе 2.5.0.5 работает! Единственное (действительно был баг Перехватчика): я там закомментировал вызов событий классов через ВыполняемыйМодуль - нужно запускать через него. Т.е. поставить проверку релиза 1срр, но это не входило в рамки данного теста
А закомментировал, потому что через Перехватчик.ВыполнитьСобытиеГК быстрее.

artbear писал(а) 13. Августа 2008 :: 11:57:
[-] 3791 Перехватчик: не работала установка повторного перехвата на уже перехваченную форм

Для подписки это не требуется - там один перехват на форму.

За два остальных исправление бага - спасибо!  Улыбка
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #5 - 13. Августа 2008 :: 12:26
Печать  
artbear писал(а) 13. Августа 2008 :: 12:13:
Проверь вариант без подписки с загрузкой ФормЕкс после установки Перехвата

Недопонял  Озадачен А разве FormEx можно выгрузить?
Если, к примеру, откроем первую форму, установим в классе перехват и затем загрузим FormEx, то вторая открываемая форма уже будет с FormEx'ом, поэтому перехват будем делать после загруженного FormEx'а.
Я правильно понял, что ты хотел сказать?
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #6 - 13. Августа 2008 :: 12:30
Печать  
в продолжении к предыдущему ответу:
В подписке FormEx грузится после перехвата ГМ, а вот на открываемые формы устанавливается перехват с уже загруженным FormEx, поэтому в обоих случаях классы-перехватчики формы находятся в одинаковом положении, т.е. чистота эксперимента в этом случае не нарушена
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #7 - 13. Августа 2008 :: 12:39
Печать  
Нет, по ФормЕкс ты понял неверно.
ФормЕкс сразу же при своей загрузке перехватывает некоторые системные процедуры и может мешать перехватчику, правда, в основном это относится к старым версиям ФормЕкс.
Поэтому и желательно включать перехват до загрузки ФормЕкс - т.е. УправлениеНастройками.Включить.

ЗЫ кстати, надеюсь, что у тебя последний ФормЕкс.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #8 - 13. Августа 2008 :: 12:40
Печать  
artbear писал(а) 13. Августа 2008 :: 11:57:
Наверняка так получается из-за твоей реализации.

Подумалось... А какая еще может быть реализация базовый-наследник в ООП?
Там ведь всего кода-то в базовом:
Код
Выбрать все
Функция Событие_ПриНажатииПравойКнопки(Сост, Гор, Верт, ФСО) Экспорт
	Возврат ОбъектПерехватчик.ВыполнитьСобытиеГК(ПредПерехватчик, Сам().КонтФормы, "ПриНажатииПравойКнопки", Сост, Гор, Верт, ФСО);
КонецФункции
 


А в наследнике:
Код
Выбрать все
Функция Событие_ПриНажатииПравойКнопки(Сост, Гор, Верт, ФСО) Экспорт
	Рез = База().Событие_ПриНажатииПравойКнопки(Сост, Гор, Верт, ФСО);
	Возврат Рез;
КонецФункции 


Т.е., чтобы не потерять обработку базового класса, можно сделать как-то иначе?  Ужас
Тогда просветите, плиз...  Круглые глаза
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #9 - 13. Августа 2008 :: 12:42
Печать  
artbear писал(а) 13. Августа 2008 :: 12:39:
Нет, по ФормЕкс ты понял неверно.
ФормЕкс сразу же при своей загрузке перехватывает некоторые системные процедуры и может мешать перехватчику, правда, в основном это относится к старым версиям ФормЕкс.
Поэтому и желательно включать перехват до загрузки ФормЕкс - т.е. УправлениеНастройками.Включить.

ЗЫ кстати, надеюсь, что у тебя последний ФормЕкс.

Теперь понял, что речь идет об УправлениеНастройками. Щас проверю.
ФормЕкс 91
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #10 - 13. Августа 2008 :: 12:47
Печать  
artbear писал(а) 13. Августа 2008 :: 12:39:
Поэтому и желательно включать перехват до загрузки ФормЕкс - т.е. УправлениеНастройками.Включить.

Сделал так (теперь правильно понял?), но никакой разницы!
Код
Выбрать все
ЗагрузитьВнешнююКомпоненту("1cpp.dll");

УН = СоздатьОбъект("УправлениеНастройками");	// делаем необходимые настройки
УН.Сбросить("EnabledCheckType");
УН.Сбросить("EnableDebugging");
УН.Включить("EnableOptimizate");
УН.Включить("EnableHookEventsGroupContext");
УН.Включить("EnableTurboBL");
УН = "";

ЗагрузитьВнешнююКомпоненту("FormEx.dll"); 


Время выполнения не изменилось  Печаль
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #11 - 13. Августа 2008 :: 12:55
Печать  
Думаю Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
AndreyM
Full Member
***
Отсутствует



Сообщений: 166
Местоположение: Харьков
Зарегистрирован: 13. Февраля 2008
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #12 - 13. Августа 2008 :: 13:03
Печать  
Отвлеку. Ты же разбираешь 1С по кубикам, поэтому вопрос не в тему.
1) что лучше присваивать переменной, содержащей ссылку на объект, для уничтожения его: 0 или "". Т.е. уточню: возможно ли присвоение переменной NULL, чтобы не выделялась память (даже пустая), т.е. самый быстрый способ обнуления переменной. (я ясно выражаюсь?)
2) нужно или помагает объявление локальных переменных в теле процедуры/функции (в смысле быстродействия).
  

Правильно поставленный вопрос, уже содержит половину ответа.
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #13 - 13. Августа 2008 :: 13:06
Печать  
AndreyM писал(а) 13. Августа 2008 :: 13:03:
Отвлеку. Ты же разбираешь 1С по кубикам, поэтому вопрос не в тему.
1) что лучше присваивать переменной, содержащей ссылку на объект, для уничтожения его: 0 или "". Т.е. уточню: возможно ли присвоение переменной NULL, чтобы не выделялась память (даже пустая), т.е. самый быстрый способ обнуления переменной. (я ясно выражаюсь?)


Точно не скажу, нужно замерять, но это все величины очень маленькие, все равно главные потери будут в другом Улыбка

AndreyM писал(а) 13. Августа 2008 :: 13:03:
2) нужно или помагает объявление локальных переменных в теле процедуры/функции (в смысле быстродействия).
Не знаю, ИМХО без разницы.

  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подписка на события vs Перехватчик в каждом кл
Ответ #14 - 13. Августа 2008 :: 13:24
Печать  
Что-то как-то запутанно у тебя в подписке реализовано.
Опиши, как ты выполняешь подписку - классы и методы последовательно.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 5
ОтправитьПечать