2

仕事で使用するものを選択するために、いくつかの IoC コンテンツを調べています。LightInject のコードベースを調べていると、理解できないものに出会いました...

ServiceContainer のGetInstance(Type serviceType, string serviceName)メソッドでは、パラメーターからキーを形成し、「namedDelegates」で「Search」を呼び出します。

var key = Tuple.Create(serviceType, serviceName);
var instanceDelegate = namedDelegates.Search(key);

namedDelegates は、ImmutableHashTree<TKey, TValue>(独自のコメントから) を実装する内部クラスです。

/// A balanced binary search tree implemented as an AVL tree.

私が LightInject を見ている理由は、Daniel Palme の IoC Performance Comparisonでの優れたスコアのためであり、この場合、O(1) 辞書を使用するよりも O(log n) バイナリ検索アルゴリズムが望ましい理由について困惑しています。 ?

ここで教えてくれる人はいますか?

4

1 に答える 1

3

ソースコードをのぞいただけで、使用していません

私の理論は、API の観点または消費する開発者のいずれかから、必要に応じて重複キーを使用できるようにすることです。Search(TKey)ツリーで見つかった重複のチェックを処理するので、それが私をそれに導きます。

もう1つはおそらくパフォーマンスのためです-質問で述べたように、かなり高速に見えます。での検索ImmutableHashTreeは、値が返されるだけで見つからないという問題を丁寧に処理しますdefault(TValue)

Dictionary<TKey, TValue>これは、指定された Key に基づいて値を見つけるために既に多くの同じ作業を行っている次のものよりも高速であるように思われます。

if (myDictionary.ContainsKey(myKey))
    return myDictionary[myKey]; // Practically double the work has been done
else
    return default(TValue);


try
{
    return myDictionary[myKey];
}
catch(Exception ex)
{
    // Exceptions can be expensive.
    return default(TValue);
}

彼らのやり方は検索を 1 回だけ行い、キーが存在しないという事実を処理するために例外をキャッチすることを心配しません。

繰り返しますが、これはソース コードをざっと見て収集したものであり、具体的なものと見なすべきではありません。

于 2014-07-01T21:35:27.733 に答える