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 性能比较中取得了优异的成绩,我很困惑为什么在这种情况下使用 O(log n) 二进制搜索算法优于使用 O(1) 字典?

有人可以在这里教育我吗?

4

1 回答 1

3

没用过,看了下源码

我的理论是,从 API 的角度或消费开发者的角度来看,可以根据需要使用重复的密钥。Search(TKey)处理检查它在树中找到的重复项,这就是导致我这样做的原因。

另一个也可能是为了性能 - 正如您在问题中提到的那样,它看起来非常快。他们在搜索中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);
}

他们的方式只搜索一次,并且不担心捕获异常来处理密钥不存在的事实。

同样,这是我收集的内容,只是快速浏览了源代码,不应被视为具体内容。

于 2014-07-01T21:35:27.733 回答