2012-09-14 3 views
10

Ich arbeite an einer relativ großen ExtJS MVC-Anwendung mit rund> 40 Controller,> 100 Stores,> 100 Modelle und so weiter. Ich folge der möglichen MVC-Methode nicht strikt, also habe ich eine Lazy-Controller-Initialisierung implementiert, die den Controller zuerst initialisiert, wenn es benötigt wird und so die Speicher. Ich registriere auch keine Ansicht innerhalb eines Controllers, aber das muss ich einfach nicht tun.Wie Profil (Debug) ExtJS EventPipe/Ereignisse

Jetzt kommt es, dass Formulare (geöffnet in einem Ext.window.Window) etwa 1-2 Sekunden dauern, bis sie angezeigt werden, während die gleiche Form in einem eher kleinen Projekt sofort auftaucht. Also die Form (Layout) kann hier nicht das Problem sein, was mich zu den Ereignissen gebracht hat. Aber ich weiß nicht wirklich, wie das am besten wäre oder gibt es schon ein gutes Tutorial, wie man das macht. Ich denke, es wäre schön, dies zu profilieren, um zu sehen, wie lange die gesamte Pipe dauert (nicht nur die EventPipe selbst).

Ereignisstruktur:

Die meisten Veranstaltungen erhalten über control() der verantwortlichen Controller registriert. Alle anderen Ereignisse sind höchstens mit { single: true } registriert. Die Fenster werden geschlossen und bei erneuter Verwendung wiederhergestellt.

+1

Btw, reinigen Sie Ihre Controller korrekt? Wenn Sie einen Controller zerstören, werden die Listener auf dem EventBus nicht vom Framework bereinigt. Entschuldigung, keine Antwort auf deine Frage, aber verwandt. – mistaecko

+0

@mistaecko Vielen Dank für diese zusätzlichen Informationen! Das ist wirklich gut zu wissen! Aber momentan recycle ich die Controller nicht mehr, sobald sie initialisiert sind, also sollte das keinen Effekt haben. Soweit ich aus meinem Blick auf den Quellcode weiß, werden die Controller in einer internen Sammlung des ApplicationControllers gespeichert. Aber ich denke, es ist nicht mit einem einfachen Profiling von Event-Displacements gemacht. – sra

+1

Wenn Sie jemals entscheiden, Ihre Controller zu bereinigen, dann lesen Sie meine Antwort, wie man Controller hier zerstören: http://stackoverflow.com/questions/12330846/how- to-delete-controller-extjs/12344788 # 12344788 – mistaecko

Antwort

6

Ich habe Angst, aber ExtJS bietet keine Event Profiling. Es verwendet ein benutzerdefiniertes Ereignissystem.

Hier ist, wie ich die Lösung dieses Problems sehe.

Es gibt Ext.util.Event-Klasse, die im Rahmen und Ext.app.EventBus verwendet Funktionalität Dispatching und Umgang mit jeder Veranstaltung bietet die Single Point bieten alle Rahmenveranstaltungen versenden (fireevent ist nur für Ext.app.EventBus.dispatch Methode Wrapper).

Klassen sind privat, daher empfehle ich, den Quellcode zu sehen.

können Sie diese Klassen außer Kraft setzen, um zu sehen, wie viel es Ext.app.EventBus.dispatch Methode von Aufruf und ruft Ereignis-Listener innerhalb Ext.util.Event.fire Methode smth wie das (EventProfiler soll nimmt Ihr sein eigene Klasse)

Ext.app.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 */ 
} 

Ext.util.Event

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

    /* ... */  

} 
+0

Das war, was ich im Sinn hatte. Aber ich hatte nicht so detailliert in den Quellcode geschaut, nur einen kurzen Blick auf den EventBus. Ich werde das am Montag testen. Gute Antwort auf jeden Fall +1 – sra

+0

Ich bin sehr an Ihren Ergebnissen interessiert. Vielleicht könntest du deine Ergebnisse hier auf SO oder in den Sencha Foren posten! – mistaecko

+0

Ich machte erste schnelle Tests, um die verantwortlichen Funktionen zu prototypieren und es sieht soweit gut aus. Ich habe noch keine Zeit, weiter an einem Profiler zu arbeiten, aber ich werde auf dieses Thema zurückkommen, sobald ich etwas Zeit gefunden habe. Und ja @mistaecko Ich werde das Ergebnis hier posten. – sra