我目前有以下内容:
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
,并且每秒会访问字典数千次。
答案 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()
的实现所花费的时间比仅仅检索long
或uLong
的值要长得多,该词典将展示比例较差的表现。