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

C# Discussion :

to linq or not to linq


Sujet :

C#

  1. #1
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut to linq or not to linq
    Salut,
    je me pose une question pas forcément fondamentale mais bon...
    Parmi les deux bouts de codes ci-dessous qui font la même chose, lequel est le plus performant selon vous.
    J'aime bien la syntaxe linq mais j'ai l'impression que le foreach est plus rapide car l'itération s'arrête dès que l'élement est trouvé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                string subjId = (from x in subjIdCollection
                                 where x.ToLower().Contains(pattern)
                                 select x).FirstOrDefault();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                string subjId = string.Empty;
                foreach (string s in subjIdCollection)
                {
                    if (s.ToLower().Contains(pattern))
                    {
                        subjId = s;
                        break;
                    }
                }
    Merci de vos conseils

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut
    Bonjour,

    Réécris ton code LINQ de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subjIdCollection.FirstOrDefault(x => x.ToLower().Contains(pattern));
    Ainsi, ton itération s'arrête dès que tu as trouvé l'élément cherché.

  3. #3
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Ce doit se valoir niveau performance (utilise un Stopwatch si tu veux voir le temps que ça prend), car la requête Linq va arrêter de parcourir les données au premier élément qui correspond.

    Il ne faut pas tomber dans le "piège" de la micro-optimisation, qui est une grosse perte de temps en général. On ne programme pas en assembleur après tout ^^

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    J'ai déjà fait des tests: foreach a toujours gagné.

    En gros linq c'est une couche qui te permet de sauver des lignes de codes, mais tu n'es jamais certain à 100% de ce que fera linq en arrière.

    Si les performances sont importantes dans ton développement fait des boucles foreach.

    Beaucoup de sites sur le net le démontre, si tu as plusieurs millions d'objets dans ta requête les millisecondes peuvent se transformer en secondes.

  5. #5
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    Merci pour vos réponses.

    Donc les deux bouts de code ci-dessous ne génère pas le même IL?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subjIdCollection.FirstOrDefault(x => x.ToLower().Contains(pattern));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string subjId = (from x in subjIdCollection
    where x.ToLower().Contains(pattern)
    select x).FirstOrDefault();

    Citation Envoyé par StormimOn Voir le message
    Il ne faut pas tomber dans le "piège" de la micro-optimisation
    ouais, je suis tout à fait d'accord. C'est plus par curiosité et pour mieux comprendre comment marche linq. J'ai bien conscience que ça va pas changer mon résultat final

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    Il ne faut pas tomber dans le "piège" de la micro-optimisation, qui est une grosse perte de temps en général. On ne programme pas en assembleur après tout ^^
    Ne le prends pas mal mais je ne t'engagerais pas dans mon entreprise.

    La micro-optimisation est ce qui compte le plus, je programme des logiciels pour des dessinateurs, je suis le meilleur programmeur pas parce que je programme rapidement, pas parce que je fais le plus beau code. Mais parce que l'intégrité des données et la rapidité d'exécution de mes applications surpasse toujours celles des autres programmeurs.

    Il m'arrive souvent de refaire 3 fois le même bout de code de 3 manières différentes juste pour comparer les performances. Le calcule est simple 60 dessinateurs qui sauvent 1 minutes dans la journée économise 1 heure en productivité dans l'entreprise par jour. C'est facile pour mon augmentation de salaire à la fin de l'année.

    J'ai déjà repris une génération d'un rapport dans du SQL qui prenait 15 minutes et je l'ai ramené à moins d'une minute et j'ai des exemples à la tonne de code bien beau comme ça. Des dataset typés en c# etc.

    Tout ce qui ressemble à la génération de code par un logiciel par exemple Linq ne pourra jamais être aussi performant qu'un bout de code bien pensé et bien testé.

    Donc, oui la micro-optimisation compte dans une application, sauf bien sûr si c'est pour une application chez toi que tu fais pour le plaisir.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    salut,
    Un sujet comme le tient avait été traité sur ce forum et je me souviens que le foreach été toujours gagnant !

  8. #8
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par girouxv Voir le message
    Donc, oui la micro-optimisation compte dans une application, sauf bien sûr si c'est pour une application chez toi que tu fais pour le plaisir.
    Je parlais en général bien évidemment. Gagner 1 seconde sur un traitement qui dure 1 minute, et qui ne sert que 2-3 fois par jour, n'a absolument aucun intérêt par exemple.
    Et je disais bien de ne pas tomber dans ce "piège", c'est à dire faire de la micro-optimisation qui n'apporte absolument rien. Cela ne veut pas dire qu'il ne faut pas en faire, il faut juste ne pas le faire pour rien.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    pourquoi c# et pas c++ pour un logiciel de dessinateur ? tu as de bonnes performances ?

  10. #10
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    je suis le meilleur programmeur
    Félicitations !


    Citation Envoyé par champomy62 Voir le message
    salut,
    Un sujet comme le tient avait été traité sur ce forum et je me souviens que le foreach été toujours gagnant !
    Oui, j'avoue ne pas avoir vraiment cherché avant...

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    ce n'était pas une critique juste que si tu cherches des informations en plus tu sais ou cherché

    un lien :

    http://blogs.msdn.com/b/mitsufu/arch...-e-ou-non.aspx

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 82
    Par défaut
    pourquoi c# et pas c++ pour un logiciel de dessinateur ? tu as de bonnes performances ?
    C'est de la gestion de données pour les dessinateurs dans des bd et fichiers. Non pas dans des images.

    Félicitations !
    Je ne suis pas vraiment ce qu'on pourrait appeler la personne la plus modeste sur terre

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Par défaut
    Ok

Discussions similaires

  1. [Linq to SQL] Row not found or changed
    Par Minoucha2006 dans le forum Accès aux données
    Réponses: 8
    Dernier message: 21/07/2011, 17h03
  2. Linq to SQL ou Linq to Entity
    Par anthride dans le forum Linq
    Réponses: 5
    Dernier message: 21/12/2010, 11h02
  3. LINQ to SQL et LINQ to Object
    Par ronki dans le forum C#
    Réponses: 1
    Dernier message: 26/03/2010, 20h05
  4. [LINQ] Object reference not set to an instance of an object.
    Par kedare dans le forum Accès aux données
    Réponses: 10
    Dernier message: 04/03/2010, 15h05
  5. Equivalent NOT IN avec LINQ
    Par Invité dans le forum Linq
    Réponses: 2
    Dernier message: 30/10/2009, 16h08

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