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 :

mutable et impact sur les performances


Sujet :

C++

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 628
    Points
    219 628
    Billets dans le blog
    125
    Par défaut mutable et impact sur les performances
    Bonjour,

    J'ai implémenté une classe encapsulant un std::vector et un mutex, car je souhaitait pouvoir utiliser cette classe à partir de différent thread.
    Ayant besoin d'accéder à mon vector en lecture, j'ai fait les getters adéquat, à l'origine, une méthode constante. Mais à cause du mutex (un pthread_mutex_t), le compilateur me dispute de ne pas respecter mon "const".

    La solution est soit :
    • d'enlever le const, mais ça peut produire des effets néfastes dans le reste du code, utilisant mon encapsulation
    • utiliser le mot clé mutable

    Il m'a semblé judicieux d'utiliser mutable dans ce cas là, mais, toutefois ce mot clé me laisse un arrière gout amère. On indique que l'on a une méthode const, mais elle n'est pas totalement const car on utilise une variable que l'on modifie, mais c'est ok car c'est mutable

    Je sais aussi que les spécifications const permettent aux compilateurs de faire des optimisations. Du coup, qu'est ce qui se passe du coté du compilateur, si j'utilise le mot clé mutable ? Vais-je perdre toutes les optimisations ? Quel est l'impact de ce mot clé ?

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    L'impact est normalement le même que celui de const -> nul sur les performances (quand il s'agit de tagguer des variables comme immu(t)ables).
    Pour les performances, c'est le mutex qui m’inquiéterait plus.

    Sinon, c'est un cas classique d'application de mutable : les mutex.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Pour les performances, c'est le mutex qui m’inquiéterait plus.
    +1.
    Si les performances sont vraiment critiques, il ne faut rien utiliser de bloquant. Une méthode qui a fait ses preuves consiste à utiliser des callbacks (ou équivalent) via un observer (comme le principe de signal/slot de Qt par exemple).

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 628
    Points
    219 628
    Billets dans le blog
    125
    Par défaut
    Ok, cela me rassure pour ce petit mot clé dont je ne connaissais pas encore l'utilisation.
    Sinon, hors cas du mutex, le mot clé mutable a un effet sur les optimisations ?
    De plus, quels sont les autres cas où vous avez eu besoin de mutable ?

  5. #5
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Dans le cas où recréer des variables locales comme std::vector de multiples fois est coûteux, je l'avais mis en membre mutable pour éviter les coûts de construction (gros gain de temps en récompense). Après je n'aime pas trop car, à mon avis, une fonction membre marquée "const" devrait pouvoir être appelée dans plusieurs threads sans risques.

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Dans le cas où recréer des variables locales comme std::vector de multiples fois est coûteux, je l'avais mis en membre mutable pour éviter les coûts de construction (gros gain de temps en récompense). Après je n'aime pas trop car, à mon avis, une fonction membre marquée "const" devrait pouvoir être appelée dans plusieurs threads sans risques.
    Une meilleure solution pourrait être d'utiliser un allocateur qui réserve la mémoire au lancement de l'application pour ce vecteur.

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Ok, cela me rassure pour ce petit mot clé dont je ne connaissais pas encore l'utilisation.
    Sinon, hors cas du mutex, le mot clé mutable a un effet sur les optimisations ?
    A ma connaissance, le mot-clef mutable n'a pas d'effet sur les optimisations, sauf peut-être dans des cas très, très particuliers.

    Citation Envoyé par LittleWhite Voir le message
    De plus, quels sont les autres cas où vous avez eu besoin de mutable ?
    Le cas du mutex (ou d'une autre primitive de synchronisation) est de très loin le plus courant. Je m'en suis servi de nombreuses fois. Je ne me rappelle pas avoir utilisé mutable dans d'autres cas, même si ma mémoire peut ici me faire défaut. On peut peut-être imaginer le cas d'un pointeur intelligent qui verrait son nombre de références augmenter (pas exemple sur operator=(const smart_ptr& p) : il faut augmenter le nombre de référence, hors celui-ci appartient aussi à p qui est const). En fait, il faut être dans un cas où une fonction qui est sémentiquement const a besoin de modifier une partie de l'état de l'objet. C'est quand même un cas très rare.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 049
    Points
    33 049
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Dans le cas où recréer des variables locales comme std::vector de multiples fois est coûteux, je l'avais mis en membre mutable pour éviter les coûts de construction (gros gain de temps en récompense). Après je n'aime pas trop car, à mon avis, une fonction membre marquée "const" devrait pouvoir être appelée dans plusieurs threads sans risques.
    C'est un autre cas classique : le cache.
    La notion de const n'est pas lié à l'accès concurrentiel. (bien qu'il le parraisse à première vue)

    Je me trompe peut-être, mais const et mutable sont des notions qui interviennent lors de la compilation, donc l'impact sur les performances doit être quasi (totalement?) nul.

  9. #9
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 628
    Points
    219 628
    Billets dans le blog
    125
    Par défaut
    Merci à tous pour avoir apporté vos précisions sur ce mot clé

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Moi je m'en sert parfois, quand je dois faire vite ou que j'ai la flemme, pour implémenter l'idiome "get last error". C'est moche, mais ça marche plutôt bien, et c'est rapide à implémenter:

    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
    29
    30
    31
    32
    33
    34
    class MyLibInterface
    {
    public:
       bool DoSomething() const
       {
          /*ici, le code qui fait quelque chose*/
     
          if ( somehting_is_wrong )
          {
             last_error_ = "reason 1";
             return false;
          }
     
          if ( something_else_is_wrong )
          {
             last_error_ = "reason 2";
             return false;
          }
     
          return true;
       }
     
       const std::string & GetLastError() const { return last_error_; }
     
    private:
       mutable std::string last_error_;
    };
     
    main()
    {
       MyLibInterface my_lib;
       if ( !my_lib.DoSomething() )
          std::cout << ma_lib.GetLastError();
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/04/2012, 10h54
  2. Impact sur les performances avec un grand nombre de tables
    Par enila dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 04/08/2011, 15h40
  3. Impact sur les performance d'un choix d'implémentation
    Par EmacLi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/11/2010, 15h27
  4. [2008] Impact sur les performance de l'ODBC ?
    Par Sergejack dans le forum Développement
    Réponses: 1
    Dernier message: 10/08/2010, 23h00
  5. Impact sur les performances d'un grand nombre de tables
    Par thechief dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/07/2010, 16h47

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