ildasm cho thấy một cuộc gọi trực tiếp của hàm được thực hiện với lệnh "gọi phương thức", trong khi gọi qua sự kiện được thực hiện với "callvirt delegatename :: Invoke()". Có vẻ như cuộc gọi trực tiếp sẽ nhanh hơn, nhưng hãy xem xét hàm Invoke() là gì. Gọi không phải là thành viên của các lớp Delegate hoặc MulticastDelegate. Đó là một phương pháp đặc biệt được tạo bởi trình biên dịch
.method public hidebysig virtual instance void
Invoke(string s) runtime managed
{
}
Phương pháp này không chứa bất kỳ triển khai nào, có vẻ lạ. Nhưng nếu chúng ta chú ý đến "cụ thể" thời gian chạy, ma thuật sẽ tiêu tan. "Thời gian chạy" có nghĩa là mã sẽ được tạo khi chạy, và như chúng ta biết, nó sẽ chỉ xảy ra một lần. Vì vậy về mặt lý thuyết cả hai nên giống nhau về năng suất.
Đối với thử nghiệm của Jon Skeet, tôi khởi chạy nó vài lần và trao đổi cuộc gọi trực tiếp với cuộc gọi với sự giúp đỡ của đại biểu và không nhận được xác nhận rằng đại biểu cải thiện hiệu suất. Đôi khi các đại biểu thắng, đôi khi cuộc gọi trực tiếp đã thắng. Tôi nghĩ rằng đó là vì GC hoặc cái gì khác bên trong. NET ảnh hưởng đến kiểm tra, hoặc chỉ chuyển đổi các quy trình của Windows.
Nguồn
2012-12-13 22:04:54
Tôi không thể nhận xét về hiệu suất, nhưng có vẻ như việc chuyển sang hệ thống theo hướng sự kiện sẽ cải thiện đáng kể khả năng bảo trì mã của bạn và chắc chắn là thiết kế tốt hơn. –
Ngoài ra, xử lý sự kiện thường chạy trên các chủ đề của riêng mình. Chức năng gọi chạy trên cùng một luồng. Kể từ khi bạn đang nói về bản vẽ, mà tôi giả định sẽ liên quan đến thao tác UI, bạn cần phải cẩn thận với điều này. – ryadavilli
@ryadavilli Tôi là người xử lý sự kiện nào đó KHÔNG kích hoạt chủ đề của riêng họ nếu bạn bắn chúng bình thường. Trình xử lý sự kiện được thực thi tuần tự trên luồng hiện tại. – Maarten