2012-03-26 11 views
5

Wenn es n Eigenschaften gibt, dann ist das Big-O von .GetProperties O (n) oder gibt es Prozesse in der Reflexion, die Komplexität hinzufügen?Big-O von .GetProperties()

sagen, es gibt diese definierte Klasse:

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

Und dann dieser Anruf gemacht wird:

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

Was ist die Zeit, Komplexität, das heißt Big-O, von .GetProperties()? Wenn man bedenkt, dass es 4 Eigenschaften gibt, würde dies nur 4 Iterationen erfordern oder ist es komplexer als das? Oder ist es O (1) mit einer Standardmenge von Komplexität, um zu der Liste zu gelangen - was scheint, dass es immer noch O (n) sein muss, nur um das Eigenschaften-Array zu erstellen?

+0

Für Iterationen von was? .. Es sind möglicherweise 0 Iterationen beteiligt, wenn das Array für Sie vorgefertigt ist. – dasblinkenlight

+0

@dasblinkenlight - Iterationen des internen Prozesses, der zum Generieren der Eigenschaftsliste verwendet wird. Für diesen Teil der Frage und die nachstehenden Antworten war die Antwort "komplexer". –

Antwort

3

Bei Big-O handelt es sich um asymptotische Komplexität, dh O (n) ist nur für große Werte von n relevant.
Eine Klasse wird nie genug Eigenschaften haben, um dies relevant zu machen.

Für praktische Zwecke können Sie es auch als O (1) betrachten, aber mit einer sehr großen Konstante.

Diese Art von Problem wird in Nanosekunden ausgedrückt, nicht Big-O-Notationen.

+0

Mir ist klar, dass ich dies falsch formuliert habe, was ich versuchte herauszufinden, war die interne algorithmische Komplexität der Reflexion. –

+0

Danke, ich werde eine andere Frage stellen, basierend auf den Nanosekunden der Reflexion - oder suchen, ob es eine gibt. –

+0

Die Zeit hat die Form 'T = A + B * n', ich schätze A >> B, aber Sie müssen messen. Und es wird wahrscheinlich von einer Menge Faktoren abhängen, wie Basisklassen, vorherige Reflection-Aufrufe usw. –

3

Komplizierter als das. Der Algorithmus muss auch die Basistypkette enthalten. Darüber hinaus kann die Implementierung das Ergebnis zwischenspeichern, sodass die amortisierten Kosten tatsächlich O (1) sind.

In der Praxis ist die Reflektion jedoch immer ziemlich langsam. Sie sollten daher Ihre Anwendung profilieren und Änderungen vornehmen, bis Sie Ihre Leistungsziele erreicht haben.

+0

Was macht es "immer ziemlich langsam"? –

+1

@TravisJ ehrlich gesagt, ich habe keinen bestimmten Grund. Meine persönliche Erfahrung bei der Entwicklung des ASP.NET MVC-Frameworks und der Verantwortung für einige der Leistungsoptimierungen darin ist, dass wir normalerweise eine höhere Leistung erzielen, wenn wir die aus der Reflektion abgeleiteten Informationen irgendwie zwischenspeichern können, anstatt dieselbe Reflektion die ganze Zeit durchzuführen. Meine Intuition, warum das so sein könnte, liegt daran, dass das Framework einfach nicht dafür optimiert ist (schließlich ist es eine statisch kompilierte Runtime). – marcind

Verwandte Themen