gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:51:35 25 4
gpt4 key购买 nike

我正在用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com