2010-02-12 8 views
8

Tôi đang làm việc để tạo khuôn khổ DI của riêng mình, tạo ra các nhà máy được ủy quyền như một bài tập học tập. Cách xây dựng các đại biểu được đánh máy của tôi là sử dụng các biểu thức để tạo ra một hàm gọi một phương thức tĩnh có tham chiếu đến vùng chứa của tôi và bất kỳ tham số hàm tạo nào.Điều gì thực hiện tồi tệ hơn: Phản ánh hoặc Quyền anh?

Điều này đưa ra một câu hỏi thú vị liên quan đến các loại giá trị. Đó là performant nhất:

a) Sử dụng phản chiếu để lựa chọn một phương pháp chung tĩnh với con số chính xác các thông số sau đó sử dụng MakeGenericMethod để loại bỏ các Generics

b) Về cho thời trang cũ params Object [] và mất hit trên boxing?

+6

Bất kỳ lý do nào khiến "bài tập học tập" này không liên quan đến việc lập cấu hình các thiết lập khác nhau để tìm giải pháp tối ưu? ;-) Tôi vẫn sẽ cung cấp cho một +1 mặc dù. –

+1

Điểm tốt, tôi nghĩ rằng tôi sẽ. –

+1

c) sử dụng quá tải với thông số chung? – herzmeister

Trả lời

16

IME, thời gian quyền anh là không có gì so với phản ánh.

3

Tôi đoán rằng sự phản chiếu sẽ chậm hơn rất nhiều, có lẽ là đơn đặt hàng của magintude như vậy.

Nó khá dễ dàng để băng ghế dự bị dù, cung cấp cho nó một đi và gửi kết quả của bạn :)

3

Trong trường hợp này, quyền anh sẽ tự độ lớn nhanh hơn so với phản ánh.

Tất nhiên, bạn luôn có thể lưu vào bộ nhớ cache kết quả phản chiếu.

+1

+1 cho dòng cuối cùng, cần được nhấn mạnh hơn. – supercat

1

Nếu một người phải xử lý một triệu đồ, thì mỗi món đồ sẽ kém hiệu quả hơn là xử lý chúng mà không có quyền anh, nhưng sẽ nhanh hơn nhiều so với sử dụng Reflection để xử lý loại của mỗi món đồ.

Mặt khác, trong nhiều tình huống nó sẽ có thể xử lý một triệu sản phẩm của một số generic loại T bằng cách sử dụng Reflection một lần, vào loại T, để xây dựng một đối tượng mà có thể xử lý một cái gì đó kiểu T mà không đấm bốc, và sau đó lưu vào bộ nhớ cache kết quả của điều đó cho cuộc đời của chương trình. Đây là cách mọi thứ như công việc EqualityComparer<T>.Default. Cách tiếp cận này có thể dễ dàng hơn một bậc độ lớn nhanh hơn đấm bốc từng vật phẩm.

+0

Hãy nhớ rằng, mặc dù, bạn vẫn sẽ cần phải truy cập bộ nhớ cache phản chiếu của bạn, rất có thể thông qua một từ điển. Tôi sẽ không ngạc nhiên nếu một chút quyền anh vẫn còn nhanh hơn so với những người tra cứu - đặc biệt là nếu các phím chuỗi có liên quan (có thể hoặc có thể không phải là trường hợp). – Timo

2

Nói chung, tôi sẽ nói ngay cả khi quyền anh đã chậm hơn (đến mức không đáng chú ý), đó là cách đi đúng đắn. Reflection là một công cụ để tạo điều kiện cho một số chương trình meta - khi bạn phải làm một số công việc trên chính mã đó, và không để tạo điều kiện cho logic ứng dụng của bạn, và do đó bạn không nên sử dụng nó mà không có lý do chính đáng. Một lập trình viên nên suy nghĩ từ lĩnh vực vật lý đầu tiên. Điều đó nói rằng, trong trường hợp của bạn nó có thể không quan trọng vì bạn đã đi theo cách meta Tôi nghĩ rằng. Sử dụng object vẫn cung cấp cho bạn biên dịch an toàn thời gian ở một mức độ nhất định và bảo trì tốt hơn.

Như những người khác đã nói, phản ánh là chậm hơn ở đây (trừ khi bạn không cache). Một thứ khác có lợi cho boxing là , bạn có lẽ hầu hết là đấm bốc khi đối phó với sự phản chiếu. API phản chiếu luôn giao dịch với object, vì vậy nếu bạn đang lấy lại một số giá trị mẫu bạn phải bỏ hộp. Tương tự, calling GetType on a value type instance first boxes it to object mà bạn có thể phải thực hiện nếu bạn không có đối số loại, nhưng chỉ có trường hợp.

Nhưng một lựa chọn tốt hơn là dựa vào generics.Một số mẫu đẹp được nêu chi tiết here.