[英]Faster alternative than Dictionary<Type, X>?
我正在创建一个我正在进行性能测试的库。 在其中我生成一个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%。
如果类型是编译时定义的,您可以尝试像这样实现它:
static class ValueFor<T>
{
// you get another field per type T
public static X X { get; private set; }
internal static SetUpValue(X value) { X = value; }
}
只需使用此访问权限。
var myIntX = ValueFor<int>.X;
Daniel Palme的IoC容器的性能基准(但也包括其他人)也有点误导,因为基准测试解决了容器中非常浅的对象图(虽然它确实清楚地表明容器之间的性能差异很大)。 这是不现实的,因为大多数应用程序(正确使用DI)将具有包含对象剂量的对象图。 执行此操作时,只需要解析根对象,并且在正确写入容器时,这意味着在大多数情况下(或者在以下情况下)您将只能单次调用Dictionary<T,V>.TryGetValue
per(web)请求大多数只是)。 因此, Dictionary<T, V>
的性能并不是真正的问题。
我认为, TKey
为System.Type
的Dictionary<T,V>
的性能成本的最大部分与为给定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(key)
中发生的所有事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.