Как профилировать (отлаживать) ExtJS EventPipe / события


Я работаю над относительно большим приложением ExtJS MVC с примерно > 40 контроллерами, >100 магазинами, >100 моделями и так далее. Я не следую возможному пути MVC, поэтому я реализовал ленивую инициализацию контроллера, которая инициализирует контроллер сначала, когда это требуется, и поэтому магазины. Я также не регистрирую никакого представления в любом контроллере, но это просто потому, что мне это не нужно.

Теперь приходит, что формы (открытые в пределах Ext.окно.Окно) займет около 1-2 секунд, пока они появились, в то время как одна и та же форма в рамках довольно небольшого проекта появляется немедленно. Так что форма (макет) не может быть здесь проблемой, что привело меня к событиям. Но я действительно не знаю, как это будет лучше всего, или уже есть хороший учебник, как это сделать. Я думаю, было бы неплохо профильтровать это, чтобы увидеть, сколько времени занимает вся труба (а не только сама EventPipe).

Структура событий:

Большинство событий регистрируются через control() ответственного контроллер. Все остальные события максимум регистрируются с помощью { single: true }. Окна закрываются и восстанавливаются при повторном использовании.

1 10

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);
    }

    /* ... */       

}