繁体   English   中英

比词典更快的替代品 <Type, X> ?

[英]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>的性能并不是真正的问题。

我认为, TKeySystem.TypeDictionary<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM