10

最近、Microsoft の Composite UI Application ブロックで構築されたアプリケーションのパフォーマンスの問題、特に読み込みに時間がかかりすぎる問題のトラブルシューティングを依頼されました。

これは、リフレクション/属性を使用してクラスを登録する Microsoft の ObjectBuilder 依存性注入フレームワークを中心に構築されています。プロファイリングは、ObjectBuilder が登録するものを検索する際に読み込まれたすべてのアセンブリのすべての型をスキャンするため、起動時にアプリがリフレクションにかなりの時間を費やしていることを示しました。

代替の DI フレームワークはすべて、属性、XML 構成、または純粋なコードも使用しているようです。
他の属性ベースのフレームワークがこれ以上優れているとは思えません。また、大量の XML を解析する必要がある起動時間などについても懐疑的です。
純粋なコードベースのフレームワークは、はるかに高速であるように見えますが、柔軟性もはるかに低いため、明確な良い選択があるようには見えません...

これにより、DI コンテナーのベンチマークを検索するようになりましたが、見つけることができたのはhttp://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.htmlだけです。
これは優れたベンチマークですが、コンテナーを使用して 100 万個のオブジェクトをどれだけ速く作成できるかを測定するだけです。私は 100 万個のオブジェクトを作成することに興味はありません。アプリをできるだけ早く起動したいだけなので、探しているのは DI コンテナーの起動コストに関する情報です。ブログの投稿、逸話、または「ObjectBuilder を高速化する方法は次のとおりです」と簡単です。

前もって感謝します

4

3 に答える 3

3

すべてのアセンブリが NGEN されたときの起動時間を測定してみましたか? 私は(少なくともIronSchemeで)、リフレクションシナリオで(私の場合は1.5秒から0.1秒まで)大いに役立つことを発見しました。

于 2009-01-22T03:01:11.420 に答える
0

ObjectBuilderについてはわかりませんが、最近の依存性注入フレームワークは通常、起動パフォーマンスを向上させるために遅延読み込みをサポートしています。たとえば、Autofac2を使用したレイズアラウンドを参照してください。

または、PloehのLazyOrderShipperの例のように手動で行うこともできます。

于 2010-12-22T17:56:10.667 に答える
0

高速化について・・・

おそらく、起動の結果をキャッシュする方法があると思います。おそらく、アプリケーションはリフレクションを実行して結果をキャッシュするためにもう少し時間を費やしますが、2 回目の起動時に何も変更されていない場合は、キャッシュからロードできます (より高速になる可能性があります)。

このキャッシュの性質に関しては、オブジェクトがディスクにシリアル化される可能性があります。「何も変わっていない」という質問のように、スタートアップはチェックサムを見ることができます。

于 2010-12-22T15:45:25.710 に答える