Điều đó phụ thuộc rất nhiều vào kịch bản chính xác - nhưng có một lớp bộ nhớ đệm được tích hợp sẵn, vì vậy nó không khủng khiếp như bạn mong đợi (nó không phản ánh mọi lúc). Nó cũng có thể khác nhau trên các hoạt động (ví dụ, "nâng" nullable-T hoạt động chậm hơn đáng kể). Bạn sẽ cần phải đo lường, nhưng khi nó xảy ra tôi có một số timings đây để thành viên truy cập (tài sản), mà tôi đã thực hiện khi làm FastMember:
Static C#: 14ms
Dynamic C#: 268ms
PropertyInfo: 8879ms (aka reflection)
PropertyDescriptor: 12847ms (aka data-binding)
TypeAccessor.Create: 73ms (aka FastMember)
ObjectAccessor.Create: 92ms (aka FastMember)
caveat: đây là một thử nghiệm duy nhất mà có thể không đại diện cho kịch bản của bạn. Mã này là shown here
Vì vậy: dựa trên một thử nghiệm đơn giản, chậm hơn so với bình thường tĩnh C# về 20 lần, nhưng nhanh hơn so với phản ánh khoảng 30 lần.
UPDATE: thú vị, có vẻ như phản ánh nhận được nhanh hơn trong .NET 4.5:
Static C#: 13ms
Dynamic C#: 249ms
PropertyInfo: 2991ms
PropertyDescriptor: 6761ms
TypeAccessor.Create: 77ms
ObjectAccessor.Create: 94ms
Ở đây nó là nhanh hơn so với suy nghĩ chỉ khoảng 12 lần, bởi vì sự phản xạ có nhanh hơn (không phải vì động đã chậm hơn).
Nguồn
2012-11-02 10:56:56
Bạn có thể làm rõ bài kiểm tra 'Dynamic C#': bạn có đo thời gian cho cuộc gọi đầu tiên hay lần gọi tiếp theo (được lưu trong bộ nhớ cache) không? Tôi cho rằng trước đây và các cuộc gọi tiếp theo nhanh hơn rất nhiều, nhưng không chắc chắn. (Tôi biết tôi có thể tự mình thử nghiệm, nhưng tôi tin rằng độc giả trong tương lai cũng sẽ được hưởng lợi từ việc làm rõ;) – enzi