私はいくつかの起動時の問題のトラブルシューティングを試みています。いくつかのプロファイリングをした後、私は主な原因がClassProxyGenerator.GenerateCodeであることを発見しました。これは最初にタイプごとに400〜600msかかる。したがって、アプリケーションへのエントリポイントに、プロキシを生成する必要のある8つの依存関係(チェーン内)がある場合、アプリケーションの起動時間は4.8秒増加します。これはたくさんのようには見えないかもしれませんが、ユーザーにとっては年齢のようです。DynamicProxyの生成速度
これを改善するためのアドバイスはありますか?
更新:どこか550msと750msの間
var container = new WindsorContainer();
container.Register(Component.For<Interceptor>()); // dummy IInterceptor...does nothing
container.Register(Component.For<IMyRepository, MyAbstractRepository>().Interceptors<Interceptor>());
var t = DateTime.Now;
var instance = container.Resolve<IMyRepository>();
Debug.WriteLine("Resolved in " + (DateTime.Now - t).TotalMilliseconds);
出力:
私は、次のコンソールアプリケーションとの時間を再現することができます。
IMyRepositoryは、(T4テンプレートによって生成された)30個のエンティティタイプのリポジトリインタフェースです。 31個のIQueryables、31個のSave overload、31個のDelete overloadがあります。 MyAbstractRepositoryは部分抽象クラスです。同じ3 x 31メソッドを宣言します。
私はすべて保存し、削除方法を削除し、ちょうど31 IQueryablesを離れて抽象リポジトリ
container.Register(Component.For<IMyRepository>().Interceptors<Interceptor>());
を登録しない場合、私はまだ初期の世代のために周りに250ミリ秒を実行します。
これは非常に(非常に)速いマシンです。実際の世界では、上記の数字よりも遅い可能性があります。
あなたのタイプには、そうではないはずの数百/数千のメソッドがある(またはあなたが20円のマシンでコードを実行している)場合を除き、それはばかげています。孤立した複製を作成できますか? –
私は知っています...それは20歳のマシンではありません...これは、このホールドアップを持つタイプの特定のセットであるようです(他のものは5-10msで生成します)...私はコードサンプルを分離して提供します。 – Jeff
使用が延期される依存関係がある場合、仮想プロキシの背後に依存グラフのその部分を隠すことができます。このコンセプトの概要については、こちらを参照してください。http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –