Windows PhoneでのIoCコンテナーのパフォーマンス比較

親愛なるハラジテリ!



スマートフォンでは、アプリケーションアーキテクチャの最適化が特に重要であるため、Windows Phoneで利用可能な無料のコンテナライブラリとオープンコンテナライブラリのパフォーマンスを比較することにしました。

次のライブラリ(テスト時の最新バージョン)が記載されていました。



Autofac 2.5.2

Caliburn.Micro v1.3.1(コンポーネントSimpleContainer)

Funq 1.0

MicroIoc 1.0

Ninject 2.2.1

TinyIoC



TinyIoCがC#のソースコードの1つのファイルであることに注目してください(VBは準備中です)。 最新バージョンではWP7の小さな修正が必要です。そうしないと、コンパイルエラーがスローされます。

「System.Type」には「FindInterfaces」の定義が含まれておらず、タイプ「System.Type」の最初の引数を受け入れる拡張メソッド「FindInterfaces」が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)


単純な行置換によって解決されました

if (!registerImplementation.FindInterfaces((t, o) => t.Name == registerType.Name, null).Any())
      
      





ライン上

 if (registerImplementation.GetInterface(registerType.Name, false) == null)
      
      







すべてのテストは、デバッガーが接続されておらず、バッテリーが完全に充電されたリリース構成で、Windows Phone 7.5を実行している実際のHTC Titanデバイスで実行されました。



3つのインターフェースとそれぞれの実装が発表されました。 それらはテスト済みのコンテナに登録されました。最初はシングルトンとして(常に1つのインスタンス)、2番目と3番目は一時的に(コンテナにアクセスするたびに新しいインスタンスが作成されます)。 最初の2つの実装にはパラメーターのないコンストラクターがあり、3番目は最初の2つのインターフェースの注入を伴うコンストラクターです。

各インターフェイスは、コンテナから100万回要求されました。 時間はミリ秒単位でストップウォッチを使用して測定されました。



結果





テーブル内の時間はミリ秒単位で表示されます。



Ninjectをテストすると、その応答時間は呼び出し回数に指数関数的に依存することが判明しました。 彼が許容する一時オブジェクトの約1万件のアクセス許可と、約50万件が死に、アプリケーションがハングするだけです。 したがって、テストの反復回数を1万回に減らし、他のライブラリと比較するために100万件ごとに結果を再計算する必要がありました。 ただし、Ninjectの特別な動作のこの事実は、コンテナーを選択する際に留意する必要があります。



最後の列は、実際に最も頻繁に見られるように、最も示唆的なものです。 コンテナへの1回の呼び出しに基づいて、Ninjectは最悪の結果、ほぼ1ミリ秒を示しました。 Funqが最良の結果をもたらします。 new演算子を呼び出すのとほぼ同じです。

高速にもかかわらず、Funqには欠点があります。登録中、すべての依存関係を手動で登録する必要があります。これは非常に不便です。 オブジェクトのコンストラクタを更新するときに登録コードを書き換える必要があります。 ところで、Autofacはこの登録オプションも提供していますが、調査されていません。





バーが高いほど、コンテナの初期化に時間がかかるほど悪化します。



もちろん、パフォーマンスがプロジェクトのコンテナを選択するための唯一の基準ではないため、ここでは検討中のライブラリの特性を備えたプレートをいくつか示します。











結論



幅広い機能が必要な場合、選択は明確です-これはAutofacです。 優れたパフォーマンスが得られますが、価格は比較的大きなライブラリファイルサイズです。

オブジェクトを登録し、コンテナから取得するための簡単なメソッドの可用性に満足している場合は、TinyIoCに注意を払う必要があります。 これは、標準機能を備えた小さくて高速なコンテナです。

Caliburn.MicroのSimpleContainerも好調でした。 ただし、コンテナのためだけに使用するのではなく、配布キットのサイズで支払う必要があります。 ただし、他のライブラリコンポーネントを使用する予定の場合、その選択は明らかです。



All Articles