小编Chr*_*mer的帖子

为什么转换为泛型类型比C#中的显式转换慢?

我正在用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代理是相同的.

谢谢你的任何信息.

c# generics lambda closures anonymous-delegates

6
推荐指数
1
解决办法
272
查看次数

标签 统计

anonymous-delegates ×1

c# ×1

closures ×1

generics ×1

lambda ×1