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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable 2D/3D/Jeux


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 054
    Billets dans le blog
    141
    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é ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    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.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    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 288
    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
    27 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 054
    Billets dans le blog
    141
    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 ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre Expert 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
    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
    Membre Expert
    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
    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
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 145
    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 145
    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.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

+ 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