2012-04-16 26 views
12

Xét đoạn mã sau ...Tại sao sử dụng một Func <> để nhanh hơn nhiều so với sử dụng() ràng buộc mới về một tác giả chuỗi generic

Trong các thử nghiệm của tôi cho một CÁO BÁO CHÍ (không gỡ lỗi!) X86 xây dựng trên Windows 7 x64 PC (Intel i7 3GHz) tôi thu được kết quả như sau:

CreateSequence() with new() took 00:00:00.9158071 
CreateSequence() with creator() took 00:00:00.1383482 

CreateSequence() with new() took 00:00:00.9198317 
CreateSequence() with creator() took 00:00:00.1372920 

CreateSequence() with new() took 00:00:00.9340462 
CreateSequence() with creator() took 00:00:00.1447375 

CreateSequence() with new() took 00:00:00.9344077 
CreateSequence() with creator() took 00:00:00.1365162 

có vẻ như rằng việc sử dụng một Func <> để xác định một đại biểu để tạo ra các đối tượng mới là nhanh hơn so với gọi "mới T hơn 6 lần() "trực tiếp.

Tôi thấy điều này hơi bất ngờ ... Tôi đoán đó là do một số nội tuyến được thực hiện bởi Jitter, nhưng tôi đã nghĩ rằng nó sẽ có thể tối ưu hóa "T mới"() cũng giống như vậy.

Có ai có giải thích về điều này không?

Có thể tôi đang phạm một số sai lầm. (Tôi đã xem xét hiệu ứng của bộ thu gom rác có thể có, nhưng sắp xếp lại mã và thêm GC.Collect() và như vậy không thay đổi kết quả đáng kể).

Dù sao, đây là các mã:

+10

Xem https://msmvps.com/blogs/jon_skeet/archive/2011/08/22/optimization-and-generics-part-1-the-new-constraint.aspx –

+0

liên quan: http: // stackoverflow. com/questions/367577/why-does-the-c-sharp-compiler-emit-activator-createinstance-khi-gọi-new-in – nawfal

Trả lời

13

Các new() hạn chế chỉ đảm bảo rằng loại thông qua năm có một constructor parameterless. Nếu bạn thực sự gọi new T() (hoặc bất kỳ tên đối số kiểu của bạn là), nó thực hiện điều này:

Activator.CreateInstance<T>(); 

Trong đó, cốt lõi của nó, sử dụng phản ánh.

+1

Cảm ơn (và Jon cũng vậy, cho bài viết thú vị). Dường như ràng buộc mới() nên tránh khi bạn cần mã rất nhanh và bạn có thể sử dụng phương pháp "Func <> creator" để thay thế! –

+1

@MatthewWatson: Đó là những gì tôi muốn đề xuất –

+1

Về lý do tại sao, hãy xem http://stackoverflow.com/questions/367577/why-does-the-c-sharp-compiler-emit-activator-createinstance-when- gọi điện thoại mới – nawfal

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