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
Répondre
Utilisez un lambda compilé si vous le pouvez, c'est BEAUCOUP plus rapide.
+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. –
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? –
Ce lien est maintenant un 404 –
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.
comparaison des performances [http://www.wintellect.com/blogs/krome/getting-to-know-dynamicmethod] montre 404 maintenant. – Lcng
J'ai fourni une réponse [ici] (http://stackoverflow.com/a/16162809/661933) pour l'instance par défaut. – nawfal