繁体   English   中英

在C#中,其键的类型类型的字典是否比其键的类型为ulong的字典慢?

[英]In C#, is a dictionary whose keys are of type Type slower than a dictionary whose keys are of type ulong?

我目前有以下内容:

ConcurrentDictionary<ulong, MyEventHandler> eventHandlers;

以及无限个类:

class MyClass1
{
    public const ulong MyKey = 0;
    ... 
}

class MyClass2
{
    public const ulong MyKey = 1;
    ... 
}

...等等...

我的字典是保存一个与类类型相对应的事件处理程序。 现在,我使用MyKey成员作为字典的键,可以正常工作。

但是,当现在和将来开发其他类时,我不想让开发人员担心必须拥有密钥。

执行以下操作的速度要慢多少(如果有的话):

ConcurrentDictionary<Type, MyEventHandler> eventHandlers;

然后使用typeof运算符将Type索引到我的字典中?

这样,我就不必担心钥匙。

我确实非常在意速度,因为即使字典可能不会有超过100个条目,也会调用typeof并每秒对字典进行数千次访问。

类型由元数据令牌表示和标识,我猜这是32位整数。 typeof运算符在元数据表中进行查找,以找到由元数据令牌表示的Type。

我相信JIT编译器会很好地优化元数据表访问,因此,我认为您不应该注意到现实中的任何性能差异。 如果使用Type作为键甚至会证明速度稍快,我实际上不会感到惊讶。

因为使用Type作为键会使代码更易于维护,所以我建议您采用这种方法,除非您可以证明另一种方法显然更有效。

如果您的字典是单例/多例,则可以通过以下模式创建通用类型以加快索引编制速度:

static class MyHandler<T>
{
    static public MyEventHandler Value;
}

代替

CurrentDictionary[typeof(Class1)]

你可以做

MyHandler<Class1>.Value

这取决于如何实现GetHashCode() 当.Net框架代码“查找”字典中的对象时,它将调用此方法来执行搜索。 显然,在任何使用基于类型的键的字典中,与仅检索longuLong的值相比, GetHashCode()的实现所花费的时间要长得多,该字典的性能将成比例地uLong

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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