5

私はいくつかの起動時の問題のトラブルシューティングを試みています。いくつかのプロファイリングをした後、私は主な原因が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ミリ秒を実行します。

これは非常に(非常に)速いマシンです。実際の世界では、上記の数字よりも遅い可能性があります。

+1

あなたのタイプには、そうではないはずの数百/数千のメソッドがある(またはあなたが20円のマシンでコードを実行している)場合を除き、それはばかげています。孤立した複製を作成できますか? –

+0

私は知っています...それは20歳のマシンではありません...これは、このホールドアップを持つタイプの特定のセットであるようです(他のものは5-10msで生成します)...私はコードサンプルを分離して提供します。 – Jeff

+1

使用が延期される依存関係がある場合、仮想プロキシの背後に依存グラフのその部分を隠すことができます。このコンセプトの概要については、こちらを参照してください。http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –

答えて

1

プロキシの初期化を別のスレッドで実行できるため、プロキシが生成されている間にアプリケーション自体を初期化し続けることができます。これをスレッドプールにキューイングすることを検討してください。

プロキシを永続化されたアセンブリファイルにコンパイルし、それをディスクに保存することもできます。これを行うと、最初の実行後の起動時間が大幅に短縮されます。

なぜキャッスルのダイナミックプロキシが初期化に時間がかかるのかよく分かりません。私はそれらを使用しません、私は通常、(単純なメソッドのためのLCGとして、完全な実装のための完全なReflection.Emitを介して)直接コードを放出します。何百ものLCGメソッドを生成していても、このような長い遅延はありませんでした。たぶん別のアプローチ/ライブラリ(LinFuなど)を使用しても問題が解決する可能性があります。

関連する問題