IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

Linq to xml avec plusieur where très lent comment optimisé


Sujet :

Linq

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Juin 2015
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Juin 2015
    Messages : 87
    Points : 61
    Points
    61
    Par défaut Linq to xml avec plusieur where très lent comment optimisé
    bonjour tout le monde,

    je trouve mon linq très lent mais je pense qu'il y a moyen de l'optimisé, pourriez vous me donnez un petit coup de main ou des pistes svp

    tout d'abord, j'ai comme base une liste complète de radiateur comprenant marque, modèle, gamme, type que je dois filtrer en fonction de marque, modele et gamme ensuite, j'ai 3 autres critères , puissance, hauteur min et longueur maxi,
    en gros si ma longueur ou hauteur ou puissance = 0, je prend la liste complète sinon j'applique des filtres en fonction des critères.

    en gros, j'enchaine les where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    public bool IsLongueurMaxi(double i) => LongueurMaxi >= i;
            public bool IsHauteurMin(double i) => HauteurMin <= i;
            public bool IsPuissance(double i) => Puissance <= i;
     
     
     ListeRadiateur.AddRange(ListCompleteRadiateur.AsParallel()
                           .Where(x => x.Marque == SelectedMarque && x.Modele == SelectedModele && x.Gamme == SelectedGamme)
                           .Where(x => LongueurMaxi == 0 || IsLongueurMaxi(double.Parse(x.Longueur, System.Globalization.CultureInfo.InvariantCulture)))
                           .Where(x => HauteurMin == 0 || IsHauteurMin(double.Parse(x.Hauteur, System.Globalization.CultureInfo.InvariantCulture)))
                           .Where(x => Puissance == 0 || IsPuissance(double.Parse(x.PElec, System.Globalization.CultureInfo.InvariantCulture)))
                           .OrderBy(x => double.Parse(x.Puissance, System.Globalization.CultureInfo.InvariantCulture))
                           .Select(x => x));
    Dans mon ObservableCollection, j'ai besoin de la référence, du type, de la hauteur, de la longueur, de la puissance

    du coup ma requête est lente ma liste compte près de 45 000 lignes du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="450" Type="10S" P50="185" Pente="1.297" Volume="0.99" Poids="3.51" Reference="10S40 0450" SS="false" Energie="Eau Chaude"/>
    	<Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="600" Type="10S" P50="246" Pente="1.297" Volume="1.32" Poids="4.68" Reference="10S40 0600" SS="false" Energie="Eau Chaude"/>
    	<Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="700" Type="10S" P50="287" Pente="1.297" Volume="1.54" Poids="5.46" Reference="10S40 0700" SS="false" Energie="Eau Chaude"/>
    	<Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="800" Type="10S" P50="328" Pente="1.297" Volume="1.76" Poids="6.24" Reference="10S40 0800" SS="false" Energie="Eau Chaude"/>
    	<Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="900" Type="10S" P50="369" Pente="1.297" Volume="1.98" Poids="7.02" Reference="10S40 0900" SS="false" Energie="Eau Chaude"/>
    	<Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Standard" Hauteur="400" Longueur="1000" Type="10S" P50="410" Pente="1.297" Volume="2.2" Poids="7.8" Reference="10S40 1000" SS="false" Energie="Eau Chaude"/>
    	<Radiateur Marque="FINIMETAL" Modele="Reggane 3000" Gamme="Compact" Hauteur="300" Longueur="450" Type="21H" P50="336" Pente="1.362" Volume="1.44" Poids="6.48" Reference="21H30 0450" SS="false" Energie="Eau Chaude"/>

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Deux pistes.

    La première, mettre les 5 clauses Where en une seule. En fonction de l'implémentation qui se cache derrière linq, cela pourrait booster un peu les choses.

    La deuxième, il semblerait que les propriétés de l'objet Radiateur soient toutes des strings, ce qui oblige à utiliser double.Parse dans les requêtes linq. De nombreux appels à parse sont couteux ! Il vaudrait mieux avoir un objet Radiateur avec les propriétés du bon type (par exemple, longueur en double). Ainsi, le chargement de la liste des radiateurs seraient un petit peu plus long (puisqu'il faudrait parser les string en double), mais cela permettrait ensuite de faire une requête linq sans appels à double.Parse.

    A noter également le dernier select est totalement inutile puisqu'il renvoie x tel quel...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. [SAX] Parser un XML avec plusieurs handlers
    Par guigui7986 dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 20/03/2009, 14h04
  2. Génération xml avec plusieurs attributs sur la même ligne
    Par Eva01 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 05/12/2008, 14h49
  3. [XSD] Valider un document XML avec plusieurs XSD
    Par Cbast dans le forum Valider
    Réponses: 1
    Dernier message: 11/02/2008, 08h57
  4. Réponses: 4
    Dernier message: 10/10/2007, 11h11
  5. Réponses: 1
    Dernier message: 30/05/2007, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo