2

我目前有以下内容:

ConcurrentDictionary<ulong, MyEventHandler> eventHandlers;

和不定数量的类:

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

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

...ETC...

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

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

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

ConcurrentDictionary<Type, MyEventHandler> eventHandlers;

然后使用typeof运算符获取类型以索引到我的字典中?

这样我就不用担心钥匙了。

我确实非常关心速度,因为即使字典可能不会超过 100 个条目,typeof也会被调用并且字典每秒会被访问数千次。

4

3 回答 3

3

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

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

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

于 2013-05-22T20:16:14.343 回答
1

如果您的字典是单例/多例,您可以创建一个泛型类型以通过此模式加速索引:

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

代替

CurrentDictionary[typeof(Class1)]

你可以做

MyHandler<Class1>.Value
于 2014-12-31T07:37:20.527 回答
0

这取决于如何GetHashCode()实现。当 .Net 框架代码在字典中“找到”一个对象时,它会调用此方法来执行搜索。显然,在任何使用基于类型的键的字典中,其实现GetHashCode()所需的时间比简单地检索 along或 a的值要长得多uLong,该字典将表现出相应较差的性能。

于 2013-05-22T20:01:56.527 回答