我正在用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;
Run Code Online (Sandbox Code Playgroud)
然后我有一个Messages类的层次结构,类似于WPF中的EventArgs,例如:
public class Message {}
public class VelocityUpdateMessage : Message
Run Code Online (Sandbox Code Playgroud)
和具有处理函数的observer类:
void HandleVelocityUpdate(VelocityUpdateMessage message) { ... }
Run Code Online (Sandbox Code Playgroud)
我正在测量2种添加和调用处理程序的方法.我正在包装委托调用,所以我可以获得一些概念类型的安全性,其中存在性能差异.
方法1:听众呼叫
AddHandler(typeof(VelocityUpdateMessage),
e => { HandleVelocityUpdate((VelocityUpdateMessage)e); });
Run Code Online (Sandbox Code Playgroud)
方法2:听众呼叫
AddHandler<VelocityUpdateMessage>(HandleVelocityUpdate);
Run Code Online (Sandbox Code Playgroud)
这两种方法都构建了一个MessageHandler委托,它可以进行强制转换和相同的方法调用,但是调用使用方法#2构建的委托,即使生成的IL看起来相同,也会慢一点.是否会在转换为泛型类型时产生额外的运行时开销?是类型约束吗?一旦解决了泛型类型,我希望JITted代理是相同的.
谢谢你的任何信息.