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

Dotnet Discussion :

Performance d une classe


Sujet :

Dotnet

  1. #1
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut Performance d une classe
    Salut

    Quels sont les "parametres" qui vont jouer sur la performance d une classe ?

    Biensur, le nombre de membre et le type de donnee va jouer sur la performance et la quantite memoire.
    Mais est ce que le nombre de methode, evenement, propriete va t il beaucoup jouer ? ou meme le niveau de polymorphisme ?

    Merci d avance

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    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 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Il y a tant de paramètre qu'il est difficile de répondre. Quand tu parles de performance, tu vises quoi exactement ? Minimiser le temps processeur ? Minimiser la consommation en RAM ? Minimiser le temps de chargement ?

    Par exemple, la nature de la classe (class ou struct) va influencer la manière dont les variables sont allouées ainsi que la manière dont elles sont passées en paramètre :
    • Pour une class, le passage de paramètres est rapide car cela se fait par référence. Mais l'allocation se fait sur le tas ;
    • Pour une struct, le passage de paramètres va dépendre énormément de la taille de ta struct (et donc du nombre d'attribut) car cela se passe par copie. Par contre, l'allocation est rapide puisqu'elle se fait sur la pile (et n'influence donc pas le GC)


    La taille des méthodes va enfluencer la possibilité pour le JIT de les inliner ou non.

    Le polymorphisme induit une indirection lors de l'appel d'une méthode virtuelle. Cela a donc un petit surcoût. Mais cette indirection n'a lieu qu'une fois et ne dépend pas de la profondeur de la hiérarchie de l'héritage.

    Bien choisir ses données, et aussi comment on les manipules peut avoir une grande incidence, et ceci, même pour les types de base. Par exemple, pour un int, il faudra faire attention d'éviter le phénomène de boxing comme cela est possible. Par exemple, regarde ces deux codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = 5;
    string s = String.Format("Mon entier : {0}", i);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = 5;
    string s = String.Format("Mon entier : {0}", i.ToString());
    Le second sera plus rapide. Pourquoi ? Dans le premier cas, la méthode String.Format attend un premier paramètre de type string, et les paramètres suivants comme étant des Object. int, qui est un type de base, dérive de Object, donc c'est bon. Mais cela nécessite que la variable soit boxée dans une instance d'object qui sera elle, allouée sur le tas. Ensuite, la méthode ToString est virtuelle, cela a donc un coût supplémentaire de l'appeler.

    Dans le second cas, on appelle directement la méthode ToString sur i. Pas de surcout lié au polymorphisme ici. Et i n'a pas besoin non d'être boxée dans une variable allouée sur le tas.

    Ce ne sont que quelques détails. Il y aurait tellement à dire. Une bonne lecture pour en apprendre plus (mais attention, c'est un bon pavé !) : CRL via C#
    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

  3. #3
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut


    En fait, je me demandais, si un trop grand nombre de propriete (sans forcement de membre) ou de methodes va jouer sur la memoire necessaire ...
    la performance va forcement etre impacter en fonction des proprietes ou fonctions que l on va appeler.

    Merci d avance

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    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 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    En fait, je me demandais, si un trop grand nombre de propriete (sans forcement de membre) ou de methodes va jouer sur la memoire necessaire ...
    Oui, plus tu as d'attributs dans ta classe, plus chaque instance de cette classe va occuper de la mémoire.
    Si tu as des propriétés sans membre, alors automatiquement il y a un attribut de créé.

    Le nombre de méthodes ne va pas jouer sur la mémoire prise par chaque instance. Cela va jouer uniquement sur les métadonnées liées à la classe.
    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

  5. #5
    Membre averti Avatar de Seth77
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2005
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 448
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par dorinf Voir le message
    Oui, plus tu as d'attributs dans ta classe, plus chaque instance de cette classe va occuper de la mémoire.
    Si tu as des propriétés sans membre, alors automatiquement il y a un attribut de créé.

    Le nombre de méthodes ne va pas jouer sur la mémoire prise par chaque instance. Cela va jouer uniquement sur les métadonnées liées à la classe.
    Oki, c est bien ce que je pensais ...

    Mais si on a plusieurs proprietes qui "utilisent" le meme membre cela ne va rien changer a l occupation en memoire ?
    Par exemple une classe avec 3 membres mais ~50 proprietes (avec du code dans le get) qui utilisent seulement les 3 membres.

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    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 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Si le membre est calculé, alors non, cela n'aura pas d'impact sur l'utilisation de la mémoire.

    C'est juste qu'un code comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int MonEntier {get; set;}
    est traduit par le compilateur en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private int _monEntier
    public int MonEntier 
    {
       get {return _monEntier;}
       set { _monEntier = value;}
    }
    ce qui augmente automatiquement la mémoire nécessaire par instance.
    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. Réponses: 4
    Dernier message: 02/03/2007, 11h35
  2. Réponses: 2
    Dernier message: 30/05/2006, 15h26
  3. Conception d'une classe parente
    Par VincentB dans le forum Langage
    Réponses: 9
    Dernier message: 24/06/2003, 17h28
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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