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 Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le il y a 19 heures et 23 minutes

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le il y a 21 heures et 56 minutes

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59

- Perspective 3.0 pour Silverlight 5.0 par Perspective le 02-07-2012, 22:39