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

- Silverlight 3 : Communication et multicast par Kévin Gosse le il y a 8 heures et 31 minutes

- [Perso] Découvertes estivales : Linux (Part I) par Le blog de FremyCompany le il y a 11 heures et 12 minutes

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le 07-04-2009, 00:50

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le 07-03-2009, 23:36

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le 07-03-2009, 09:56

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le 07-03-2009, 09:00

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 07-03-2009, 08:45

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15