Tôi đang xây dựng bản đồ gửi thư trong C# và chủ yếu chỉ chơi xung quanh với một số cách tiếp cận khác nhau. Tôi tò mò về một sự khác biệt về hiệu suất mà tôi đang đo lường, nhưng không rõ tại sao lại nhìn vào IL.Tại sao truyền sang loại chung chậm hơn so với dàn diễn viên rõ ràng trong C#?
Bản đồ thông điệp:
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;
sau đó tôi có một hệ thống phân cấp lớp của tin nhắn, tương tự như EventArgs trong WPF, ví dụ:
public class Message {}
public class VelocityUpdateMessage : Message
và quan sát lớp học với chức năng xử lý:
void HandleVelocityUpdate(VelocityUpdateMessage message) { ... }
Tôi đang đo 2 cách để thêm & gọi trình xử lý. Tôi đang gói các cuộc gọi đại biểu để tôi có thể nhận được một chút về an toàn loại khái niệm và trong đó nằm sự khác biệt perf.
Tiếp cận 1: nghe gọi
AddHandler(typeof(VelocityUpdateMessage),
e => { HandleVelocityUpdate((VelocityUpdateMessage)e); });
Phương pháp 2: nghe gọi
AddHandler<VelocityUpdateMessage>(HandleVelocityUpdate);
Cả hai phương pháp xây dựng một đại biểu MessageHandler mà làm cho một dàn diễn viên và cuộc gọi cùng một phương pháp, nhưng kêu gọi các đại biểu được xây dựng sử dụng Cách tiếp cận # 2 là một chút chậm hơn mặc dù IL được tạo ra trông giống hệt nhau. Có thêm thời gian chạy trong quá trình truyền sang loại chung không? Nó có phải là loại ràng buộc không? Tôi hy vọng các đại biểu JITted sẽ giống nhau khi loại chung được giải quyết.
Cảm ơn mọi thông tin.
Bạn đo lường như thế nào? Điều đó cực kỳ quan trọng với những tối ưu hóa vi mô này. –