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

时间:2013-05-22 19:54:44

标签: c# data-structures dictionary

我目前有以下内容:

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,并且每秒会访问字典数千次。

3 个答案:

答案 0 :(得分:3)

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

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

由于使用Type作为键会使代码更容易维护,我会推荐这种方法,除非你能证明另一种方法显然更高效。

答案 1 :(得分:1)

如果你的字典是单例/多字符,你可以创建一个泛型类型来加速这种模式的索引:

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

而不是

CurrentDictionary[typeof(Class1)]

你可以做到

MyHandler<Class1>.Value

答案 2 :(得分:0)

这取决于GetHashCode()的实施方式。当.Net框架代码“找到”字典中的对象时,它会调用此方法来执行搜索。显然,在任何使用基于类型的字典的词典中,GetHashCode()的实现所花费的时间比仅仅检索longuLong的值要长得多,该词典将展示比例较差的表现。