2012-03-26 3 views
5

Nếu có n thuộc tính, thì là Big-O của .GetProperties O (n) hoặc có các quá trình liên quan đến phản chiếu làm tăng tính phức tạp?Big-O của .GetProperties()

Giả sử có lớp này định nghĩa:

public class Reflector 
{ 
public string name { get; set; } 
public int number { get; set; } 
public bool flag { get; set; } 
public List<string> etc { get; set; } 
} 

Và sau đó cuộc gọi này được đưa ra:

var reflect = new Reflector(); 
PropertyInfo[] properties = reflect.GetType().GetProperties(); 

mức độ phức tạp thời gian là gì, ví dụ: Big-O, trong .GetProperties()? Xem xét rằng có 4 thuộc tính, điều này sẽ chỉ mất 4 lần lặp lại hay nó phức tạp hơn thế? Hoặc, là nó O (1) với một số bộ tiêu chuẩn phức tạp để có được vào danh sách - mà dường như nó vẫn phải là O (n) chỉ để xây dựng các mảng tài sản?

+0

Để lặp lại những gì? .. Có thể không có sự lặp lại nào liên quan, nếu mảng được tạo sẵn cho bạn. – dasblinkenlight

+0

@dasblinkenlight - các lần lặp của quy trình nội bộ được sử dụng để tạo danh sách thuộc tính. Đối với phần câu hỏi đó, và từ các câu trả lời dưới đây, tôi nghĩ câu trả lời là phức tạp hơn. –

Trả lời

3

Big-O về độ phức tạp tiệm cận, nói cách khác O (n) chỉ phù hợp với các giá trị lớn của n.
Một lớp học sẽ không bao giờ có đủ thuộc tính để làm cho điều này có liên quan.

Vì mục đích thực tế, bạn cũng có thể xem xét nó O (1), nhưng với một hằng số rất lớn.

Loại sự cố này được biểu thị bằng nano giây, chứ không phải ký hiệu Big-O.

+0

Tôi nhận ra rằng tôi có thể đã diễn đạt điều này một cách không đúng, những gì tôi đang cố gắng đạt được là sự phức tạp về thuật toán nội bộ của sự phản chiếu. –

+0

Cảm ơn, tôi sẽ hỏi một câu hỏi khác dựa trên những giây phút phản chiếu - hoặc tìm kiếm xem có tồn tại hay không. –

+0

Thời gian sẽ có dạng 'T = A + B * n', tôi ước tính A >> B nhưng bạn sẽ phải đo lường. Và nó có lẽ sẽ phụ thuộc vào rất nhiều yếu tố, như các lớp cơ sở, các cuộc gọi Reflection trước, vv .. –

3

Phức tạp hơn thế. Thuật toán cũng phải bao gồm chuỗi kiểu cơ sở. Ngoài ra, việc triển khai có thể lưu vào bộ nhớ cache kết quả, do đó, chi phí được phân bổ có thể thực sự là O (1).

Nhưng trên thực tế, phản ánh luôn khá chậm, vì vậy bạn có thể nên lập hồ sơ ứng dụng của mình và thực hiện thay đổi cho đến khi bạn đạt được mục tiêu hiệu suất của mình.

+0

Điều gì làm cho nó 'luôn luôn khá chậm'? –

+1

@TravisJ thành thật mà nói, tôi không có lý do cụ thể. kinh nghiệm cá nhân của tôi phát triển framework ASP.NET MVC và chịu trách nhiệm về một số tối ưu hiệu năng trong đó là chúng ta thường có hiệu năng cao hơn nếu chúng ta có thể lưu trữ thông tin thu được từ sự phản chiếu bằng cách nào đó thay vì thực hiện cùng một sự phản chiếu. Trực giác của tôi là tại sao có thể là do khung công tác đơn giản là không được tối ưu hóa với ý nghĩ đó (sau khi tất cả, nó là một thời gian chạy được biên dịch tĩnh). – marcind