2010-12-13 18 views
33

J'utilise RedGate pour évaluer les performances. Je remarque que la création dynamique d'une instance en utilisant Activator.CreateInstance (avec deux paramètres constructeurs) prend un temps décent ... existe-t-il une meilleure alternative qui utilise encore une approche réflexive (instanciation non explicite)?Activator.CreateInstance Performance Alternative

+0

J'ai fourni une réponse [ici] (http://stackoverflow.com/a/16162809/661933) pour l'instance par défaut. – nawfal

Répondre

35
+1

+1. Si ce n'est pas encore assez rapide, alors vous pouvez essayer d'émettre de la réflexion, mais il est peu probable que cela donne beaucoup d'amélioration sur un lambda compilé, et c'est beaucoup plus compliqué à coder. –

+1

L'opération Compile() est-elle plus lente ou plus rapide? Je suppose que la performance est comptabilisée sans inclure le temps de compilation? Dans les scénarios où plusieurs instances de types différents sont nécessaires et où le type d'objet est déterminé à l'exécution, Serait-il beaucoup plus lent d'avoir une opération de compilation à chaque fois que Activator.CreateInstance? –

+8

Ce lien est maintenant un 404 –

12

Ne pas oublier DynamicMethod

Voici par exemple comment créer une nouvelle instance à travers constructeur par défaut

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(); 

est ici plus sur performance comparison

mesure InvokeMember .. . 1000000 itérations dans 1.5643784 secondes.

Méthode de mesureInfo.Invoquer ... 1000000 itérations en 0.8150111 secondes.

Mesure de DynamicMethod ... 1000000 itérations en 0.0330202 secondes.

Mesure d'appel direct ... 1000000 itérations en 0.0136752 secondes.

+1

comparaison des performances [http://www.wintellect.com/blogs/krome/getting-to-know-dynamicmethod] montre 404 maintenant. – Lcng