Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Optimiser Activator.CreateInstance : comment le rendre jusqu'a 350 fois plus rapide

Dans certains cas, nous devons créer une instance d'un objet sans connaitre le type à la compilation mais seulement à l'exécution. C'est le cas lorsque l'on utilise le pattern Abstract Factory, où l'on doit créer une instance d'un type généralement stocké dans le fichier de configuration.

Pour cela, on utilise la méthode Activator.CreateInstance. 

static void Main(string[] args) { String typeName = "ConsoleApplication28.Pouet"; // get typeName from Config Type t = Type.GetType(typeName); IPouet pouet = (IPouet)Activator.CreateInstance(t); }

Malheureusement cette méthode utilise de la Reflection ce qui rend son exécution très long, environ 105 ms pour 1 millions de Pouet alors qu'il faut 7 ms en faisant directement un new Pouet();

Avec .net 3.5 sont apparus les arbres d'expressions. Très brievement, un arbre d'expression est une représentation "physique" d'une méthode. Une fois l'arbre construit, il peut être compilé, c'est à dire que .net va générer de l'IL à partir de l'arbre grâce au namespace System.Reflection.Emit.

L'idée pour optimiser Activator.CreateInstance est donc de créer un arbre d'expression qui créera l'instance.

static void Main(string[] args) { String typeName = "ConsoleApplication28.Pouet"; // get typeName from Config Type t = Type.GetType(typeName); Expression<Func<IPouet>> getIPouetExpression = Expression.Lambda<Func<IPouet>>(Expression.New(t)); Func<IPouet> getIPouet = getIPouetExpression.Compile(); IPouet pouet = getIPouet(); }

En utilisant l'arbre d'expression, la création de 1 millions de Pouet tombe à environ 10ms, soit 10 fois moins que Activator.CreateInstance !

Comment faire si votre objet nécessite des arguments dans son constructeur ?

Avec Activator.CreateInstance, il faut utiliser une autre signature : Activator.CreateInstance(t, params object[] args).

Pour l'arbre d'expression, ca devient tout de suite un peu plus verbeux.

Expression<Func<IPouet>> getIPouetExpression = Expression.Lambda<Func<IPouet>>( Expression.New( t.GetConstructor(new Type[]{ typeof(int), typeof(int)}), Expression.Constant(1), Expression.Constant(2) ) ); Func<IPouet> getIPouet = getIPouetExpression.Compile();

Au niveau des performances, si l'on met 2 entiers dans le constructeur, Activator.CreateInstance prend environ 3,5 secondes pour créer 1 million d'instance alors que l'arbre d'expression prend 10ms c'est à dire le même temps que tout à l'heure.

Attention, ces résultats ne veulent pas dire qu'il ne faut plus utiliser Activator.CreateInstance dans tous les cas la création d'une seule instance est rapide, de plus la compilation de l'arbre d'expression est un peu longue : autour de 3ms.
Si vous devez créer de nombreuses instances dont le type est connus seulement à l'exécution alors la solution de l'arbre d'expression est à favoriser. 

En résumé :

image

Posted: dimanche 26 octobre 2008 18:37 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Fox a dit :

Mais tu ne fais plus de JavaScript ? ;)

# octobre 27, 2008 01:32
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01