誰もその質問に答えることはできません。パフォーマンスへの影響は、ハードウェア、アプリケーション、そのプロパティが呼び出される頻度など、多くの変数によって異なります。
したがって、本当の問題は、状況に応じて十分に高速かどうかです。これをベンチマークすることでわかるのはあなただけです。
このフレームワークは、次の点で高度に最適化されています。
GetInstance<T>
フレームワークのハッピー パスでのメソッド呼び出しの数を最小限に抑えます (これは、および を呼び出すときのメソッド呼び出しの最小数を意味しますGetInstance(Type)
)。
- アプリケーションのハッピー パスでのロックの数を最小限に抑えます (ハッピー パスは現在ロックフリーです)。
- オブジェクト グラフを解決するときにコンテナーへのコールバックの数を最小限に抑えます (つまり、コンテナー自体はオブジェクトの依存関係を解決するために呼び出すのではなく、登録の内部で構築されたデリゲート
GetInstance<T>
でそれらの依存関係の作成をインライン化します)。Func<object>
ただし、Simple Injector は高度に最適化されていますが、呼び出しには一定のコストがかかりGetInstance<T>
ます。各呼び出しで、コンテナーは常に次のことを行う必要があります。
Dictionary<Type, InstanceProducer>
指定された に対して (現在の実装ではa を使用して) 辞書検索を行いtypeof(T)
ます。
- 見つかったインスタンス
GetInstance()
でメソッドを呼び出します。InstanceProducer
Func<object>
指定されたインスタンス (InstanceProducer.GetInstance
メソッド内)を作成するためにデリゲートを呼び出します。
- from から戻る前に
object
toにキャストします。T
GetInstance<T>
この一定のコストから、辞書検索の実行には約 80% の時間がかかります。ただし、特に大きなオブジェクト グラフを解決する場合は、シングルトン以外のものを解決し始めると、一定のオーバーヘッドの割合が急速に低下します。
それでも、Cache
アプリケーションのパフォーマンス クリティカル パスでプロパティを多数呼び出す場合は、それを最適化することをお勧めします (ただし、遅すぎるかどうかを判断する必要があります。時期尚早の最適化は行わないでください)。これを行う簡単な方法の 1 つはICacheClient
、コンシューマーのコンストラクターに を注入することです。これにより、インスタンスがコンテナーから何度も解決されることがなくなり、コンシューマーはローカルにキャッシュされたICacheClient
インスタンスを問題なく使用できるようになります。
実際のところ、これはコンストラクター インジェクションと呼ばれる一般的なパターンであり、推奨される実践です。GetInstance<T>
リクエスト中にコンテナに絶えずコールバックするのではなく、「リクエスト」の開始時にを 1 回呼び出すことで、コンテナに完全なオブジェクト グラフを構築させる(コンストラクタ インジェクションを使用)ことをお勧めします。