Activator.CreateInstanceT vs Kompilierter Ausdruck. Inverse Leistung auf zwei verschiedenen Maschinen

8

Ein Freund und ich testeten kompilierte Ausdrücke für die Objekterstellung anstelle von Activator.CreateInstance<T> und stießen auf einige interessante Ergebnisse. Wir fanden heraus, dass, wenn wir den gleichen Code auf jeder unserer Maschinen liefen, wir völlig entgegengesetzte Ergebnisse sahen. Er hatte das erwartete Ergebnis, eine deutlich bessere Leistung aus dem kompilierten Ausdruck, während ich überrascht war, dass Activator.CreateInstance<T> out um den Faktor 2 lief.

Beide Computer wurden in .NET 4.0 kompiliert

Computer 1 hat .NET 4.5 installiert. Computer 2 nicht.

Computer 1 über 100000 Objekte:

%Vor%

Computer 2 über 100000 Objekte:

%Vor%

Und hier ist der Code:

%Vor%     
Mike Gwilt 06.09.2012, 20:02
quelle

1 Antwort

8

Dafür gibt es mindestens zwei Gründe:

  • Der Aufwand zum ersten Aufruf von Type<Test>.New() oder System.Activator.CreateInstance<Test>() ist relativ groß. Aus diesem Grund habe ich 100000 auf 10000000 geändert.
  • Erstellen Sie Ihre Anwendung im Veröffentlichungsmodus, führen Sie sie ohne einen Debugger aus.

Mit diesen beiden Änderungen sind die beiden Methoden ungefähr gleich lang. Auf meinem System bekomme ich für beide Methoden zwischen 1100 und 1200, manchmal ist eine etwas höher, manchmal die andere.

Beachten Sie, dass Activator.CreateInstance<T>() nur den Standardkonstruktor aufrufen kann, während New() eine Anzahl von Argumenten akzeptiert. Wenn Sie Ihre New() weniger mächtig machen und immer auch den Standardkonstruktor verwenden, ist es etwas schneller als Activator.CreateInstance<T>() auf meinem System.

Beachten Sie auch, dass Ihre Behandlung von Konstruktoren mit Parametern nicht funktioniert, wenn zwei verschiedene Konstruktoren des gleichen Typs verwendet werden sollen, abhängig von den übergebenen Argumenten. Sie wählen einmal, welcher Konstruktor für den Rest des gesamten Programms verwendet werden soll.

    
hvd 06.09.2012, 20:37
quelle

Tags und Links