2010-12-13 15 views
33

Używam RedGate do przeprowadzenia oceny wydajności. Zauważam, dynamiczne tworzenie instancji przy użyciu Activator.CreateInstance (z dwoma parametrami konstruktora) zajmuje przyzwoitą ilość czasu ... czy istnieje lepsza alternatywa, która nadal wykorzystuje podejście refleksyjne (nie jawne tworzenie instancji)?Activator.CreateInstance Performance Alternative

+0

Podałem odpowiedź [tutaj] (http://stackoverflow.com/a/16162809/661933) dla domyślnej instancji. – nawfal

Odpowiedz

35
+1

+1. Jeśli to nadal nie jest wystarczająco szybkie, możesz spróbować emitować odbicie, ale jest mało prawdopodobne, że przyniesie znacznie lepsze efekty niż skompilowana lambda, a to jest dużo bardziej skomplikowane dla kodu. –

+1

Czy operacja kompilacji() działa wolniej lub szybciej? Zakładam, że wydajność jest rozliczana bez uwzględnienia czasu kompilacji? W scenariuszach, w których wiele instancji różnych typów jest koniecznych i gdzie typ obiektu jest określany w czasie wykonywania, czy byłoby go dużo wolniej podczas operacji kompilacji za każdym razem niż Activator.CreateInstance? –

+8

Ten link jest teraz 404 –

12

Nie zapomnij o DynamicMethod

Oto przykład, jak utworzyć nową instancję thru domyślnego konstruktora

public static ObjectActivator CreateCtor(Type type) 
{ 
    if (type == null) 
    { 
     throw new NullReferenceException("type"); 
    } 
    ConstructorInfo emptyConstructor = type.GetConstructor(Type.EmptyTypes); 
    var dynamicMethod = new DynamicMethod("CreateInstance", type, Type.EmptyTypes, true); 
    ILGenerator ilGenerator = dynamicMethod.GetILGenerator(); 
    ilGenerator.Emit(OpCodes.Nop); 
    ilGenerator.Emit(OpCodes.Newobj, emptyConstructor); 
    ilGenerator.Emit(OpCodes.Ret); 
    return (ObjectActivator)dynamicMethod.CreateDelegate(typeof(ObjectActivator)); 
} 

public delegate object ObjectActivator(); 

tutaj bardziej o performance comparison

InvokeMember pomiarowe .. 1000000 iteracji w 1,5643784 sekundy.

Metoda pomiarowaInfo.Invoke ... 1000000 iteracji w 0,8150111 sekund.

Pomiar DynamicMethod ... 1000000 iteracji w 0,0330202 sekund.

Pomiar połączenia bezpośredniego ... 1000000 iteracji w 0,0136752 sekundy.

+1

Porównanie wydajności [http://www.wintellect.com/blogs/krome/getting-to-know-dynamicmethod] pokazuje teraz 404. – Lcng