我正在用 C# 构建一个消息调度映射,并且主要是在使用一些不同的方法。我对我正在测量的性能差异感到好奇,但从 IL 来看,原因并不明显。
消息映射:
delegate void MessageHandler(Message message);
AddHandler(Type t, MessageHandler handler)
{
/* add 'handler' to messageMap invocation list */
}
delegate void GenericMessageHandler<T>(T message);
AddHandler<T>(GenericMessageHandler<T> handler) where T: Message
{
AddHandler(typeof(T), e => { handler((T)e); });
}
Dictionary<Type, MessageHandler> messageMap;
然后我有一个 Messages 的类层次结构,类似于 WPF 中的 EventArgs,例如:
public class Message {}
public class VelocityUpdateMessage : Message
和具有处理函数的观察者类:
void HandleVelocityUpdate(VelocityUpdateMessage message) { ... }
我正在测量 2 种添加和调用处理程序的方法。我正在包装委托调用,因此我可以获得一些概念类型安全性,这就是性能差异。
方法一:监听器调用
AddHandler(typeof(VelocityUpdateMessage),
e => { HandleVelocityUpdate((VelocityUpdateMessage)e); });
方法2:监听器调用
AddHandler<VelocityUpdateMessage>(HandleVelocityUpdate);
这两种方法都构建了一个 MessageHandler 委托,该委托进行强制转换和相同的方法调用,但是调用使用方法 #2 构建的委托有点慢,即使生成的 IL 看起来相同。转换为泛型类型是否有额外的运行时开销?是类型约束吗?一旦解决了泛型类型,我希望 JITted 代表是相同的。
感谢您提供任何信息。