【问题标题】:Dictionary<Type,Object> vs Dictionary<RuntimeTypeHandle,Object> what's more performance wise?Dictionary<Type,Object> 与 Dictionary<RuntimeTypeHandle,Object> 什么是更明智的性能?
【发布时间】:2016-05-16 13:04:54
【问题描述】:

什么是更明智的考虑?散列RuntimeTypeHandle 还是散列Type?请尝试解释原因。

【问题讨论】:

  • 您是否尝试过两种方法并进行比较?是什么让您认为仍然会对性能产生重大影响?这是特定应用程序的瓶颈还是您只是好奇?
  • 只是好奇,我不久前上过 C# 课程,他告诉我们 RuntimeTypeHandle 对散列的性能更明智。我真的不知道如何检查它们,因为我需要很多类型,如果我要散列 10 种类型,它不会做太多工作。
  • 好吧,你可以在每个方向上搜索一百万次键,看看是否有区别。字典访问是O(1) ,因此字典的大小对性能没有太大影响(如果有的话)。散列算法的速度和分布决定了一切。
  • 好吧,我照你说的做了,显然它更快地散列 Type 而不是 RuntimeTypeHandle。所以我做了另一个基准测试,因为GetTypetypeof 每次都返回相同的Type 对象,我试图通过GetType().GetHashCode()GetType() 来查找价值。散列哈希码(int32)似乎比使用类型本身要快得多。

标签: c# c#-4.0 c#-3.0 c#-2.0


【解决方案1】:

对于“哪个更快”的任何问题,唯一确定的回答方法是尝试不同的方法并比较结果。这可能意味着要进行一百万次才能获得显着差异,但其他任何事情都是学术性的。

也就是说,字典性能的主要区别在于它们的键类型,特别是它们的哈希算法的性能和分布。

查看RuntimeTypeHandle.GetHashCode的源代码,可以看到它使用了底层RuntimeType实例的哈希码。

    private RuntimeType m_type;

    public override int GetHashCode()
    {
        return m_type != null ? m_type.GetHashCode() : 0;
    }

现在RuntimeType 不会覆盖GetHashCode,所以它很大程度上来自它的继承类型TypeInfoTypeInfo没有覆盖GetHashCode,所以它使用its继承的类型,即Type!

因此,由于 RuntimeTypeHandleGetHashCode 实现与 Type 相同,我预计不会有显着的性能差异。

【讨论】:

  • 谢谢,我做了一些基准测试,您可以在上面看到我的评论。它有一个微小的差异,但似乎你是对的。散列 Type 然后散列 RuntimeTypeHandle 更快。
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 2018-01-25
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 2012-03-01
  • 2015-04-12
相关资源
最近更新 更多