2012-09-14 7 views
10

(デバッグ)ExtJSのEventPipe /イベントをプロファイルに私の周りで比較的大きなExtJSのMVCアプリケーションに取り組んでいます> 40のコントローラ、> 100店舗、> 100のモデルのように。私は可能なMVCの方法に厳密に従っていないので、コントローラが必要なときにコントローラを初期化するための遅延コントローラの初期化を実装しています。私はまた、任意のコントローラ内に任意のビューを登録していないが、それは単に私がする必要はありません。どのよう

今ではかなり小さなプロジェクト内の同じフォームがすぐにポップアップ表示しながら、彼らが示されるまで(Ext.window.Window内で開か)フォームが周りに1-2秒かかるということです。 フォーム(レイアウト)はここで問題になることはできません。しかし、私は実際にどのように最善の方法が分かっているのか、またはこれを行う方法について既に良いチュートリアルがあります。私は、これをプロファイリングして、パイプ全体がどれくらいの期間(EventPipe自体だけでなく)かを知ることができればいいと思います。

イベント構造:

イベントのほとんどは責任コントローラのcontrol()を経て登録されます。他のすべてのイベントは最大で{ single: true }で登録されています。再利用すると、ウィンドウは閉じられ、再インスタンス化されます。

+1

Btw、コントローラを正しくクリーンアップしますか?コントローラーを破壊すると、EventBusのリスナーはフレームワークによってクリーンアップされません。申し訳ありませんが、あなたの質問に対する回答ではなく、関連しています。 – mistaecko

+0

@mistaeckoその追加情報ありがとう!これは本当に知って良いです!しかし、現在のところ、コントローラが初期化されたらコントローラをリサイクルしないので、これは効果がないはずです。私の外見から知っている限り、ソースコードはコントローラがApplicationControllerの内部コレクションに格納されます。しかし、私はあなたがあなたのコントローラをクリーンアップすることを決定した場合、それがここでコントローラを破壊する方法についての私の答えをチェックし、イベントdispatchings – sra

+1

の簡単なプロファイリングで行われていないと思います。http://stackoverflow.com/questions/12330846/how- to-delete-controller-extjs/12344788#12344788 – mistaecko

答えて

6

私は怖いが、ExtJSには、すべてのイベントのプロファイリングを提供していません。カスタムイベントシステムを使用します。ここで

は、私は、この問題の解決策を参照してください方法です。

フレームワークで使用されるイベントのディスパッチと処理に機能を提供するExt.util.Eventクラスと、すべてのフレームワークイベントをディスパッチする単一ポイントを提供するExt.app.EventBusクラスがあります(fireEventはExt.app.EventBus.dispatchメソッドの単なるラッパーです)。

クラスはプライベートですので、私は、そのソースコードを参照することをお勧めします。

あなたは(EventProfilerがあなたのことになっていることがExt.app.EventBus.dispatchメソッドを呼び出して、そのようなExt.util.Event.fire方法のなめらか内イベントリスナーを呼び出してから取るどのくらい見るためにこれらのクラスをオーバーライドすることができます独自のクラス)

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

これは私が気にしていたことでした。しかし、私はソースコードの詳細を見ていませんでしたが、EventBusをちょっと見れば分かります。私はこれを月曜日にテストします。とにかく良い答え+1 – sra

+0

私はあなたの発見に非常に興味があります。たぶんあなたはSOやSenchaのフォーラムであなたの結果を投稿することができます! – mistaecko

+0

私は責任ある機能のプロトタイプを最初にクイックテストしました。私はまだプロファイラで作業する時間がありませんが、しばらくしてすぐにこのトピックに戻ってきます。そしてはい@mistaecko私はここに結果を掲載します。 – sra