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 :

pourquoi pas inline systematiquement ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 26
    Par défaut pourquoi pas inline systematiquement ?
    Je me demandais : pourquoi ne pas mettre toutes les methodes d'une classe systematiquement en "inline" (si elle peuvent l'etre)pour gagner en perfs? puisque si je comprends bien, le compilateur choisit lui meme de vraiment remplacer le contenu de la methode a chaque endroit ou celle ci est appelée, ou non.

    Bien evidemment il doit y avoir une raison (temps de compilation ? taille du code generé ?) mais je ne suis pas sur.

    Une idée?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Parce que, entre autres, l'inlining peut devenir couteux en perfs si la fonction qui utilise la fonction inlinée devient trop grosse pour tenir dans le cache : D'ou, l'effet inverse de celui espéré...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Effectivement ça peut allonger considérablement le temps de compilation.

    Mais surtout on n'a pas forcément envie de dévoiler le code source, ce qui serait le cas si on le mettait intégralement dans les en-têtes.

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Citation Envoyé par Médinoc
    Parce que, entre autres, l'inlining peut devenir couteux en perfs si la fonction qui utilise la fonction inlinée devient trop grosse pour tenir dans le cache : D'ou, l'effet inverse de celui espéré...
    Je n'ai personnellement encore jamais rencontrer ce phénomène et pourtant je force beaucoup d'inlines pour des fonctions vraiment grosses (parfois appelées qu'à un seul endroit dans le code, mais néanmoins appelées fréquemment dans un calcul). Et justement si je laisse faire le compilo à sa guise, il ne les inline pas et ça s'en ressent sérieusement sur les perfs de parties critiques.

    Perso, j'indique toujours explicitement comme inlinable les fonctions désirées (même quand quand la fonction est entièrement définie dans la classe, ce qui peut paraître à première vue inutile). Ca me permet de moduler la signification du mot clé avec des '#define'.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define inline __forceinline //pour ICL et VC
    Ceci dit, je suis toujours à la recherche du moyen pour forcer l'inline sur GCC qui n'en fait décidément qu'à sa tête (la version 3.4 en tout cas, je ne peux pas encore tester la version 4 sous Windows...), et refuse fréquemment de suivre mes consignes.
    '__inline' ou '__attribute__((__always_inline__))' n'y changent rien.
    Alors je profite de ce topic pour demander si quelqu'un connaît le moyen de forcer GCC à inliner les fonctions désirées. (je ne parle pas de fonctions récursives ou virtuelles ou que sais-je encore..)

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il ne faut pas non plus oublier que, dans le cadre d'un arbre d'héritage impliquant une classe abstraite, le compilateur va rechercher la premiere fonction virtuelle non inline de chaque classe lors de l'édition de liens...

    Si, d'une manière ou d'une autre, toutes les fonctions membres sont virtuelles et inline (car rien n'empeche d'inliner une fonction virtuelle ), tu va te retrouver avec une référence sur la vtable de la classe indéfinie à l'édition de liens

    Je vous livre donc cette réflexion pour ce qu'elle vaut mais, en prenant en compte que
    • Le gain de temps théorique d'une fonction inlinée est relativement faible ( largement > 0.0000001 sec/exécution sur les processeurs actuels)
    • certaines fonctions ne peuvent pas etre valablement inlinée ( les fonctions récursives, par exemple)
    • le compilateur reste libre d'effectivement inliner ou non une fonction qu'on a définie inline, et peut tres bien "selon l'humeur du moment" décider, pour une meme fonction, d'inliner certains de ses appels et pas d'autres
    • on peut, si on n'y prend pas garde, en arriver à avoir des références indéfinies sur la vtable

    j'aurais principalement plutot tendance à partir du principe qu'il est préférable, hormis pour les applications devant réellement fonctionner en temps réel, de partir d'une version de code dans lequel aucune fonction n'est inlinée et de ne décider d'inliner que celles pour lesquelles un benchmark correct et vérifié (plutot deux fois qu'une) prouve incontestablement qu'il y a gain de performances
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    J'ajouterai même que:

    Trop de inline implique plus de code, et donc plus de place prise dans le cache, et donc plus de chargement de cache. Si A est une grossse fonction, et qu'elle appelle 4x B (pas dans une boucle) et que B est suffisemment gros, alors A ne tient plus entierement dans le cache (d'instruction), alors que A+B (non inline) aurait pu l'être.

    De toute maniere, le compilo peut très bien ne pas tenir compte du "inline" (par exemple si la fonction est récursive, ou virtuelle), et donc le code généré identique à celui sans inline.
    Dans l'autre sens, avec les options d'optimisation ad-hoc, le compilo peut très bien "inliner" une function qui n'est pourtant pas déclarée inline.

    Personnellement, je n'ai jamais de fonction inline, à part les setters/getters, les fonctions de calcul direct (genre la surface d'une rectangle), ou les délégations. En bref, rien que ne tienne sur une ligne !

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Personnellement je n'utilise pas inline en dehors de templates spécifiques, je préfère laisser mon optimiseur s'en charger à l'édition de liens. (malheureusement, mon compilateur n'optimise pas à l'édition de liens)

Discussions similaires

  1. La binaire et pourquoi pas le ternaire
    Par Chromatic dans le forum Ordinateurs
    Réponses: 34
    Dernier message: 09/07/2012, 15h28
  2. Pourquoi pas WinDev 9 ?
    Par nyarla01 dans le forum WinDev
    Réponses: 35
    Dernier message: 25/07/2006, 19h41
  3. JTreeTable pourquoi pas en standard?
    Par Antoine_1977 dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 03/01/2006, 22h33
  4. [Language][DAO]Pourquoi pas des Singletons ?
    Par le Daoud dans le forum Langage
    Réponses: 11
    Dernier message: 04/05/2005, 09h16

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