作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 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 种方法。我正在包装委托(delegate)调用,这样我可以获得一些概念上的类型安全性,这就是性能差异。
方法一:监听调用
AddHandler(typeof(VelocityUpdateMessage),
e => { HandleVelocityUpdate((VelocityUpdateMessage)e); });
方法二:监听调用
AddHandler<VelocityUpdateMessage>(HandleVelocityUpdate);
这两种方法都构建了一个 MessageHandler 委托(delegate),该委托(delegate)进行强制转换和相同的方法调用,但是调用使用方法 #2 构建的委托(delegate)会稍微慢一点,即使生成的 IL 看起来相同。转换为通用类型是否会产生额外的运行时开销?是类型约束吗?一旦解析了泛型类型,我希望 JITted 委托(delegate)是相同的。
感谢您提供任何信息。
最佳答案
以下行在每次调用时都会创建一个匿名类型的新实例。这会是您表现差异的原因吗?
AddHandler(typeof(T), e => { handler((T)e); });
关于c# - 为什么转换为泛型类型比 C# 中的显式转换慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8951735/
我是一名优秀的程序员,十分优秀!