Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Pierrick's Blog

.Net "full power"

Parser une ligne de commande avec LINQ (suite)

A la suite de mon précédent post, Fabrice Marguerie (auteur de livre "Linq in Action") m' a envoyé un petit message pour m' indiquer que ma requête :

var NameValues = from arg in args.Where(s => s.StartsWith("/")).Select(s => s.Substring(1))
                 select new
                 {
                     ArgumentName = arg.Substring(0, arg.IndexOf(":")),
                     ArgumentValue = arg.Substring(arg.IndexOf(":") + 1)
                 };

pouvait être améliorée. Je voulais donc vous faire part de ses remarques. En effet cette requête utilise les deux modes d' écritures (Query Syntax, Method Syntax). Transformons la, en utilisant uniquement la forme "Query Syntax" :

var NameValues = from arg in args
                 where arg.StartsWith("/")
                 select new
                 {
                     ArgumentName = arg.Substring(1, arg.IndexOf(":")),
                     ArgumentValue = arg.Substring(arg.IndexOf(":") + 1)
                 };

et effectivement c' est plus lisible. Mais il reste encore une amélioration. En effet il y a 2 appels à Substring et IndexOf, pour remplir les propriétés "ArgumentName" et "ArgumentValue". On peut réduire le nombre d' appels and utilisant ce petit mot clé 'let'.

var NameValues = from arg in args
                  where arg.StartsWith("/")
                  let parts = arg.Substring(1).Split(new char []{':'},2)
                  select new
                  {
                      ArgumentName = parts[0],
                      ArgumentValue = parts[1]
                  };

Très bien mais en termes de "perfs" ???

J' ai donc pris quelques minutes pour comparer ces 3 requêtes LINQ. Pour cela j' ai fait une boucle qui me remplit mon tableau d' arguments

const int nb = 10;
string[] args = new string[nb];
for (int i = 0; i < nb; i++)
    argsIdea = string.Format("/swichname{0}:switchvalue{0}", i);

image 

et pour 10 000...
image 
Vous me direz que dans ce genre de situation, il est effectivement très rare voire impensable de passer 10 000 paramètres en ligne de commande....

10 ou 10 000, le résultat reste sans appel,  la première solution est donc à bannir :-).

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 :
Posted: jeudi 3 janvier 2008 20:38 par pierrick
Classé sous : ,

Commentaires

MuiBienCarlota a dit :

Bonjour,

Effectivement, parser une ligne de commande n'est pas une opération que l'on fait 10 000 fois mais on peut être amené à découper des strings en utilisant LINQ dans bien d'autres situations.

Pour une importation de fichiers, par exemple, l'optimisation prend tout son sens.

De toute façon, tenter d'optimiser une version permet de mieux comprendre les mécanismes sous jacents. C'est toujours une bonne chose.

Je ne suis pas surpris que la version 3 soit plus rapide mais qu'il y ait une différence entre la 1 et la 2 me surprend. J'avais cru comprendre que "Query Syntax" était transformée à la compilation en "Method Syntax". Il ne devrait alors y avoir aucune différence à l'exécution.

Ai-je manqué quelque chose?

# janvier 5, 2008 13:13

Fabrice a dit :

La différence est que la première version fait un Select supplémentaire, ce qui peut suffire à expliquer la différence de temps.

Fabrice

# janvier 5, 2008 14:03
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- TechDays 2010 Genève : Retrouvez-moi pour une session sur la Haute disponibilité et le ScaleOut avec SQL Server par SQL Server vu par Christian Robert le il y a 16 heures et 8 minutes

- [MIX10] Keynote deuxième journée – Internet Explorer 9, Html5, Visual Studio 2010, OData par Atteint de JavaScriptite Aiguë [Cyril Durand] le 03-17-2010, 19:40

- Certifications beta .NET 4 par Kévin Gosse le 03-17-2010, 19:33

- [Mix 2010] – Microsoft Translator Technology Preview V2 par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 18:53

- Lancement en Preview de Cyclone lors des TechDays 2010! par Blog de Frédéric Queudret le 03-17-2010, 16:30

- [WP7] Je ne veux pas d’un nouvel iPhone par Le blog de FremyCompany le 03-17-2010, 13:11

- [WF4] Pourquoi utiliser le ContentPresenter dans l’ActivityDesigner? par Blog de Jérémy Jeanson le 03-17-2010, 07:54

- [Mix 2010] – Telechargez Internet Explorer 9 en Preview ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:58

- [MIX 2010] – Keynote Day 2 online : Windows Internet Explorer 9, jQuery, OData et Dallas CTP2 ! par RedoBlog - The .NET Gentleman !!! le 03-17-2010, 00:18

- [Mix 2010] – Retour d’expérience développement Seesmic sur Windows Phone 7 par RedoBlog - The .NET Gentleman !!! le 03-16-2010, 23:44