为什么LightInject使用ImmutableHashTree来存储注册,而不是简单的Dictionary



我正在查看几个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(logn(二进制搜索算法比使用O(1(字典更可取?

有人能在这里教育我吗?

没有使用,只是偷看了源代码

我的理论是,从API的角度或消费开发人员的角度来看,重复的密钥可以根据需要使用。Search(TKey)负责检查它在树中发现的重复项,所以这就是我想到的。

另一个可能也是为了性能——正如你在问题中提到的,它看起来相当快。他们在ImmutableHashTree上的搜索很好地处理了找不到值的问题,因为它只返回default(TValue)

这似乎比下面的Dictionary<TKey, TValue>更快,后者已经在做很多相同的工作来根据给定的密钥找到你的价值。

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);
}

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

同样,这是我收集的只是对源代码的快速浏览,不应该被认为是具体的。

相关内容

  • 没有找到相关文章

最新更新