我正在用C#構建一個消息發佈圖,並且大多隻是圍繞一些不同的方法進行遊戲。我對我正在測量的性能差異感到好奇,但是爲什麼從IL看起來並不明顯。爲什麼在C#中投射到一個通用類型比顯式投射要慢?
消息映射:
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;
我然後有消息,類似於WPF的EventArgs的一個類層次結構,例如:
public class Message {}
public class VelocityUpdateMessage : Message
和觀察者類與處理函數:
void HandleVelocityUpdate(VelocityUpdateMessage message) { ... }
我正在測量添加&調用處理程序的兩種方法。我正在封裝委託調用,以便我可以獲得一些概念類型的安全性,其中存在性能差異。
方法1:監聽電話
AddHandler(typeof(VelocityUpdateMessage),
e => { HandleVelocityUpdate((VelocityUpdateMessage)e); });
方法2:偵聽器調用
AddHandler<VelocityUpdateMessage>(HandleVelocityUpdate);
兩種方法都建立了MessageHandler委託,使一個演員和相同的方法調用,但調用代表內置使用即使生成的IL看起來相同,方法#2稍慢一點。在轉換爲泛型類型時額外的運行時開銷是多少?它是類型約束嗎?我希望一旦泛型類型得到解決,JITted委託就是相同的。
感謝您的任何信息。
你是怎麼測量的?這對於這些微觀優化非常重要。 –