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 Entities] Performance du Sort


Sujet :

Linq

  1. #1
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut [Linq To Entities] Performance du Sort
    Bonjour tout le monde

    J'ai voulu faire qqs benchs sur le Sort d'une collection d'objets avec Linq.

    Ma class User
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    [Serializable]
        public class User
        {
            public long Id { get; private set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string EMail { get; set; }
            public string Login { get; set; }
     
            /// <summary>
            /// Initializes a new instance of the <see cref="T:System.Object"/> class.
            /// </summary>
            public User()
            {
            }
     
            /// <summary>
            /// Initializes a new instance of the <see cref="T:System.Object"/> class.
            /// </summary>
            public User(long id, string firstName, string lastName, string eMail, string login)
            {
                this.Id = id;
                this.FirstName = firstName;
                this.LastName = lastName;
                this.EMail = eMail;
                this.Login = login;
            }
        }
    J'ai une méthode qui va taper en base et qui me retourne une List<User>.
    La méthode prend en paramètres le nombre de User souhaité.

    La méthode pour trier ma liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            private IQueryable<T> Sort<T>(IEnumerable<T> list, string sortExpression)
            {
                return list.AsQueryable().OrderBy(sortExpression + " ASC");
            }
    Pour mon bench, j'ai exécuté 100 fois la méthode Sort à 3 reprises:
    1 fois sur une collection de 50 Users
    1 fois sur une collection de 500 Users
    1 fois sur une collection de 5000 Users

    Et à chaque fois, j'obtiens le même résultat (14 ms pour 100 itérations)

    Qq'un a une explication?

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Salut,

    as tu essayé de faire varier encore le nombre de User ?
    Le tri n'est pas forcément couteux avec ce nombre. J'ai essayé ton code, avec 50 000, j'ai vu des différences.
    Autre point, avec l'exécution différée des requêtes, as tu "consommé" le type en retour ou pas ?

  3. #3
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Citation Envoyé par cybermaxs Voir le message
    Salut,

    as tu essayé de faire varier encore le nombre de User ?
    Le tri n'est pas forcément couteux avec ce nombre. J'ai essayé ton code, avec 50 000, j'ai vu des différences.
    Autre point, avec l'exécution différée des requêtes, as tu "consommé" le type en retour ou pas ?
    J'ai que 6 000 users en base donc j'ai pas essayé plus
    Sinon, non je consomme pas le retour, j'appelle juste 100 fois ma méthode Sort

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sw.Start();
                for (int i = 0; i < iterations; i++)
                {
                    Sort(list, "LastName");
                }
                sw.Stop();
                elapsedDR = sw.ElapsedMilliseconds;
                sw.Reset();

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    Sinon, non je consomme pas le retour, j'appelle juste 100 fois ma méthode Sort
    Les requêtes LINQ sont à exécution différée, ce qui signifie que les requêtes ne sont réellement faites que lorsque le code en a besoin, donc en gros quand on utilise le retour de la requête. Le Sort n'est pas donc réellement réalisé dans ton cas : c'est juste l'arbre des expressions qui est construit.

    Une méthode simple et peu couteuse est de faire un Count ou un ToList()

  5. #5
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    En effet, une fois le Count appelé, la performance s'en ressent.
    Mais du coup je compte l'appel à .Count dans mon bench...

    J'ai aussi regardé du côté des requêtes compilées mais j'ai l'impression que ça existe que pour du LinqToSql

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    En effet, une fois le Count appelé, la performance s'en ressent.
    Mais du coup je compte l'appel à .Count dans mon bench...
    Je pense pas que le Count pèse cher dans la balance. Peut être un .First() est il plus léger.

    Citation Envoyé par lutecefalco Voir le message
    J'ai aussi regardé du côté des requêtes compilées mais j'ai l'impression que ça existe que pour du LinqToSql
    Oui c'est que pour LinqToSql, mais attention c'est pareil : l'arbre d'expression Linq est juste calculé un peu plus en amont.

Discussions similaires

  1. LINQ To Entity
    Par lutecefalco dans le forum Général Dotnet
    Réponses: 15
    Dernier message: 24/06/2008, 16h06
  2. Linq to Entities disponible dans C# Express ?
    Par rdh123 dans le forum Visual Studio
    Réponses: 1
    Dernier message: 15/06/2008, 12h43
  3. Linq to entities très bridé sur de gros projets !
    Par gillou.95 dans le forum Accès aux données
    Réponses: 7
    Dernier message: 15/05/2008, 16h02
  4. [Migration] linq to sql => linq to entities
    Par anthyme dans le forum Accès aux données
    Réponses: 1
    Dernier message: 25/04/2008, 18h48
  5. Orcas - Linq to Entities
    Par elnfrancois dans le forum Accès aux données
    Réponses: 2
    Dernier message: 31/08/2007, 10h21

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