c# – 比Dictionary更快的替代?

我正在创建一个我进行性能测试的库.在其中我生成一个字典< Type,X>一旦.这些项目当前以随机顺序插入.字典在应用程序生命周期内保持不变.

然后经常用于查找项目.查找是库中较大的瓶颈之一.

是的,我是微型优化,但要学习.我想知道是否有更好的方法来获得查找性能?

更新

我已经使用dotTrace来衡量性能.报告dotTrace在我的家庭电脑,所以我没有这里的报告(可能已经上传到其他地方).

我使用这里发现的测试:
https://github.com/danielpalme/IocPerformance

字典定义见:https://github.com/jgauffin/Griffin.Container/blob/master/Source/Griffin.Container/ContainerBase.cs

(我星期五创建了容器,不要期待太多)

UPDATE2

如果我正确地解释了这个数字,Dictionary.TryGetValue需要101ms的Resolve(总计251ms),这是40.2%.

IoC容器的性能基准
Daniel Palme(但是其他人也是如此)有点误导,因为基准测试从容器中解析出非常浅的对象图(尽管它清楚地表明容器之间的性能差异很大).这是不切实际的,因为大多数应用程序(正确使用DI)将具有包含对象的对象图形.当这样做时,只需要解决根对象,并且当容器正确写入时,这意味着在大多数情况下(或者在大多数情况下,您将只会单独调用Dictionary< T,V> .TryGetValue /(web)请求最多只是几个).正因为如此,Dictionary< T,V>不是一个真正的问题.

我相信Dictionary< T,V>的性能成本的最大部分TKey是System.Type,与生成给定类型的哈希码的性能成本有关.每次调用TryGetValue时,必须调用Type.GetHashCode(). GetHashCode是虚拟(不能内联),该方法调用3个其他虚拟方法.最后,对RuntimeHelpers.GetHashCode(key)进行静态(外部)调用.

换句话说,您可以优化性能来编写使用Type作为键的特定(非通用)字典类,而不是调用Type.GetHashCode(),您应该调用RuntimeHelpers.GetHashCode(key).

更新(2013-04-05):

几个月后,我试图提高我维护的DI容器的性能,我用优化字典部分玩.我写了自己的字典,直接称为RuntimeHelpers.GetHashCode(key)(并跳过了虚拟调用),但最终性能提升如此之小(在Palme的基准测试中约为1%),我决定还原这些代码更改.所以我目前的理解是,Dictionary< Type,X>实际上是在RuntimeHelpers.GetHashCode(键)内发生的一切.

翻译自:https://stackoverflow.com/questions/10578844/faster-alternative-than-dictionarytype-x

转载注明原文:c# – 比Dictionary更快的替代?