2012-11-02 42 views
16

Chi phí hiệu suất của việc sử dụng dynamic so với object bằng .NET là bao nhiêu? Ví dụ: tôi có phương thức chấp nhận tham số thuộc bất kỳ loại nào. VÍ DỤ.Chi phí hoạt động bằng cách sử dụng tính năng nhập động trong .NET

public void Foo(object obj) 
{ 
} 

hoặc

public void Foo(dynamic obj) 
{ 
} 

ILSpy nói với tôi rằng khi sử dụng mã năng động, trình biên dịch phải chèn một khối mã để xử lý năng động. Vì vậy, tôi muốn biết nếu sử dụng năng động ở vị trí của đối tượng được thông báo và mức độ sử dụng này đi kèm với chi phí hiệu suất?

Trả lời

45

Đ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).

+0

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

22

Vì vậy, tôi muốn biết liệu việc sử dụng năng động thay cho đối tượng có được thông báo hay không và mức sử dụng này là bao nhiêu ở chi phí hiệu suất?

Nếu bạn không cần nhập động, đừng sử dụng.

Nếu bạn cần gõ động - nếu nó tránh một số mã phản chiếu phức tạp, ví dụ - sau đó sử dụng nó và đo lường chi phí hiệu suất.

Chi phí sẽ nặng phụ thuộc vào chính xác những gì bạn đang làm. Nó sẽ khá nhiều luôn luôn chậm hơn so với mã đánh tĩnh, nơi tương đương thậm chí có thể, nhưng có của các yếu tố có thể ảnh hưởng đến chi phí chính xác. Với các vấn đề về hiệu suất, hãy viết mã sạch (không nhất thiết phải ngắn nhất) để bắt đầu, đo hiệu suất và nếu nó không đáp ứng mục tiêu hiệu suất của bạn, hãy tối ưu hóa cẩn thận (với các phép đo thường xuyên để kiểm tra đúng hướng).

Các vấn đề liên quan