Как профилировать (отлаживать) ExtJS EventPipe / события
Я работаю над относительно большим приложением ExtJS MVC с примерно > 40 контроллерами, >100 магазинами, >100 моделями и так далее. Я не следую возможному пути MVC, поэтому я реализовал ленивую инициализацию контроллера, которая инициализирует контроллер сначала, когда это требуется, и поэтому магазины. Я также не регистрирую никакого представления в любом контроллере, но это просто потому, что мне это не нужно.
Теперь приходит, что формы (открытые в пределах Ext.окно.Окно) займет около 1-2 секунд, пока они появились, в то время как одна и та же форма в рамках довольно небольшого проекта появляется немедленно. Так что форма (макет) не может быть здесь проблемой, что привело меня к событиям. Но я действительно не знаю, как это будет лучше всего, или уже есть хороший учебник, как это сделать. Я думаю, было бы неплохо профильтровать это, чтобы увидеть, сколько времени занимает вся труба (а не только сама EventPipe).
Структура событий:
Большинство событий регистрируются через control()
ответственного контроллер. Все остальные события максимум регистрируются с помощью { single: true }
. Окна закрываются и восстанавливаются при повторном использовании.
1 ответ:
Боюсь, что ExtJS не обеспечивает профилирование событий. Он использует пользовательскую систему событий.
Вот как я вижу решение этого вопроса.Есть доб.утиль.Event класс, предоставляющий функциональные возможности для диспетчеризации и обработки любого события, используемого в рамках и Ext.апп.EventBus , которые обеспечивают единую точку для отправки всех событий фреймворка (fireEvent - это просто оболочка для Ext.апп.EventBus.метод отправки).
Классы являются частными, поэтому я рекомендую смотрите его исходный код.
Вы можете переопределить эти классы, чтобы увидеть, сколько требуется от вызова Ext.апп.EventBus.метод диспетчеризации и вызывающий прослушиватель событий в Ext.утиль.Событие.fire method smth like that (EventProfiler должен быть вашим собственным классом)
Доб.апп.EventBus
dispatch: function (/* event name or Ext.util.Event */event, /* Target class */ target, args) { //start timing var start = new Date(); /* ... */ for (i = 0, ln = events.length; i < ln; i++) { event = events[i]; // Fire the event! if (event.fire.apply(event, Array.prototype.slice.call(args, 1)) === false) { return false; } // start event profiling // here we are sure that event is dispatched and it's instance of Ext.util.Event EventProfiler.startProfile(event, /* time passed from dispath method started */new Date() - start); } /* rest of dispatch method call */ }
Доб.утиль.Событие
fire: function () { /* ... */ if (listener.o) { args.push(listener.o); } EventProfiler.endProfile(this); if (listener && listener.fireFn.apply(listener.scope || me.observable, args) === false) { return (me.firing = false); } /* ... */ }