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 :

Mise au point => static, inline et consorts


Sujet :

C

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Mise au point => static, inline et consorts
    Bonjour à tous et toutes !
    Je suis en train d'essayer d'optimiser un programme qui calcule des fft, et je vois, dans un code, que les fonctions qui reviennent très souvent sont passées en macro pour certaines et en "static inline" pour d'autres.
    Je sais en gros ce que ça fait, mais j'aimerais avoir votre avis sur ce genre d'optimisation "basique". Est-ce efficace ?
    Est-ce qu'il faudrait tout passer comme ça, ou seulement les fonctions simples, les plus appelées ?
    Peut-on tout passer "les yeux fermés" ou y a-t-il des conditions à respecter ?

    Merci d'avance aux gourous
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Mise au point => static, inline et consorts
    Citation Envoyé par progman
    Je suis en train d'essayer d'optimiser un programme qui calcule des fft, et je vois, dans un code, que les fonctions qui reviennent très souvent sont passées en macro pour certaines et en "static inline" pour d'autres.
    classique...
    Je sais en gros ce que ça fait, mais j'aimerais avoir votre avis sur ce genre d'optimisation "basique". Est-ce efficace ?
    Ca peut... mais le choix, l'optimisation et le codage de l'algorithme sont aussi très déterminants.
    Est-ce qu'il faudrait tout passer comme ça, ou seulement les fonctions simples, les plus appelées ?
    #2
    Peut-on tout passer "les yeux fermés" ou y a-t-il des conditions à respecter ?
    • Passer son code au profiler pour déterminer les points de ralentissements.
    • Eviter les macros et préférer les inline (C99)
    • Attention, inline() n'est qu'une proposition. Si on utilise l'adresse de la fonction, l'inline ne se fera pas. Idem si elle n'est pas 'static'.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Re: Mise au point => static, inline et consorts
    Citation Envoyé par Emmanuel Delahaye
    • Passer son code au profiler pour déterminer les points de ralentissements.
    • Eviter les macros et préférer les inline (C99)
    • Attention, inline() n'est qu'une proposition. Si on utilise l'adresse de la fonction, l'inline ne se fera pas. Idem si elle n'est pas 'static'.
    Peux-tu m'expliquer les deux derniers points ?
    Je croyais que les macros c'était mieux :s.
    Si tu appelles la fonction directement (elle est supposée inline), pas en passant par son adresse, ça fonctionne, c'est ça ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Mise au point => static, inline et consorts
    Citation Envoyé par progman
    Citation Envoyé par Emmanuel Delahaye
    • Passer son code au profiler pour déterminer les points de ralentissements.
    • Eviter les macros et préférer les inline (C99)
    • Attention, inline() n'est qu'une proposition. Si on utilise l'adresse de la fonction, l'inline ne se fera pas. Idem si elle n'est pas 'static'.
    Peux-tu m'expliquer les deux derniers points ?
    Je croyais que les macros c'était mieux :s.
    "Les macros c'est mal" notamment à cause de l'absence de contrôle des paramètres, des risques de double évaluation des paramètres, de la difficulté d'avoir une valeur de retour claire... Bref, en C90, c'est un pis-aller...
    Si tu appelles la fonction directement (elle est supposée inline), pas en passant par son adresse, ça fonctionne, c'est ça ?
    Ca fonctionnne toujours. Simplement, si on a besoin explicitement de l'adresse, la fonction ne sera pas 'inlinée'.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    D'accord.
    Dans ce cas, as-tu un lien qui m'expliquerait en deux mots (mais deux bons ) ce que signifie "inliner" une fonction ?
    Plus précisément, que fait le compilateur ?

    J'ai un cas où il y a un if, et entre les deux conditions if et else, la seule différence est une boucle for assez conséquente (incrémentation de 1 à environ 20000) et ce, assez souvent.
    Si je fais une fonction static inline qui contient cete boucle, et que je sors le reste, vais-je gagner quelque chose ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Inliner une fonction veut dire que le compilo va remplacer les différents appels à la fonction par le code de la fonction ce qui évite les ralentissements dus aux passage de parametres notamment.

    Voir : http://www.developpez.com/c/megacours/x559.html#AEN667
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Si, dans ma boucle, j'ai des parmètres qui sont des pointeurs, ça ne pose pas de problème ??
    Je vais donner un exemple, ce sera nettement plus clair, surtout pour moi ^_^ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (count=1 ; count < SIZE ; count++) {
        psdval=(3072 - (*expbufptr << 7));
        expbufptr++;
        fftbuf[count]=psdval;
    }
    Le reste est inutile.
    Les noms ne sont pas importants, mais c'est le principe...
    Cette boucle est beaucoup appelée, et tourne sur SIZE qui peut être important.
    Je suis certain de pouvoir mieux faire, mais je ne sais pas si un inline est utilisable dans ce cas.
    Autre chose, peut-on appeler des macros dans des fonctions "inlinées" ?
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par progman
    Si, dans ma boucle, j'ai des parmètres qui sont des pointeurs, ça ne pose pas de problème ??
    Non.
    Je vais donner un exemple, ce sera nettement plus clair, surtout pour moi ^_^ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (count=1 ; count < SIZE ; count++) {
        psdval=(3072 - (*expbufptr << 7));
        expbufptr++;
        fftbuf[count]=psdval;
    }
    Le reste est inutile.
    Les noms ne sont pas importants, mais c'est le principe...
    Cette boucle est beaucoup appelée, et tourne sur SIZE qui peut être important.
    Je suis certain de pouvoir mieux faire, mais je ne sais pas si un inline est utilisable dans ce cas.
    pas de problème tant que tu es 'static', et que l'adresse de la fonction n'est pas utilisée explicitement (callback, pointeur de fonction...)
    Autre chose, peut-on appeler des macros dans des fonctions "inlinées" ?
    Les macros ne sont que des substitutions de texte, on fait ce qu'on veut, c'est traité avant la compilation... Moi, je m'en sers pour écrire du C répétitif...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Oki !
    Merci .
    Donc, cette boucle peut être passée dans une fonction "static inline".
    Cool
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  10. #10
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Si je prend cette boucle, précisément (je la redonne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (count=1 ; count < SIZE ; count++) {
        psdval=(3072 - (*expbufptr << 7));
        expbufptr++;
        fftbuf[count]=psdval;
    }
    Je peux accélérer le processus en sortant le pointeur, non ?
    Car là, j'ai l'impression que ça doit prendre du temps, il faut aller chercher la valeur à partir de l'adresse, la décaler de 7 bits vers la gauche, soustraire ce nombre à 3072, puis incrémenter l'adresse, et ce, SIZE fois...

    Ca me parait un peu barbare, non ?

    PS: le code n'est pas de moi, j'essaie de l'améliorer.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par progman
    Si je prend cette boucle, précisément (je la redonne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (count=1 ; count < SIZE ; count++) {
        psdval=(3072 - (*expbufptr << 7));
        expbufptr++;
        fftbuf[count]=psdval;
    }
    Je peux accélérer le processus en sortant le pointeur, non ?
    Je ne vois pas bien comment améliorer ça. Peut être avec un pointeur pour accéder à fftbuf si ce n'est pas fait par le compilateur. Tu as regardé l'assembleur ?

    si fftbuf est un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    T *p;
    for (p = fftbuf + 1 ; p < fftbuf + SIZE ; p++) 
    {
        psdval=(3072 - (*expbufptr << 7));
        expbufptr++;
        *p = psdval;
    }
    si fftbuf est un pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    T *p;
    T *const p_end = fftbuf + SIZE;
    for (p = fftbuf + 1 ; p < p_end ; p++) 
    {
        psdval=(3072 - (*expbufptr << 7));
        expbufptr++;
        *p = psdval;
    }
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Non je n'ai pas regardé l'assembleur, le code généré est directement un code objet. Et je n'ai pas possibilité de modifier le makefile, mais je crois que je peux quand même avoir une idée du code, directement depuis l'objet ?
    Quel outil (sous linux) permet de faire ça ?
    fftbuf est un tableau, donc ce serait la première solution.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par progman
    Non je n'ai pas regardé l'assembleur, <...>
    Quel outil (sous linux) permet de faire ça ?
    gdb ?
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Ouais, donc insight .
    Je ne maitrise pas du tout gdb, je préfère passer par une gui...
    J'ai jamais trouvé de site expliquant vraiment très bien comme s'en servir.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  15. #15
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par progman
    Non je n'ai pas regardé l'assembleur, le code généré est directement un code objet. Et je n'ai pas possibilité de modifier le makefile, mais je crois que je peux quand même avoir une idée du code, directement depuis l'objet ?
    Quel outil (sous linux) permet de faire ça ?
    fftbuf est un tableau, donc ce serait la première solution.
    tu copies la ligne de commande que ton makefile genere et tu remplaces -c par -S.

    objdump a si je ne m'abuse aussi une option pour dessassembler.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/08/2006, 12h20
  2. Mise au point d'un bon algo
    Par cryptorchild dans le forum Langage
    Réponses: 3
    Dernier message: 08/10/2005, 17h04
  3. Petite mise au point avec gluUnProject.
    Par fatpat94 dans le forum OpenGL
    Réponses: 1
    Dernier message: 27/07/2005, 15h40
  4. [Mise au point] dhcp
    Par Ernest dans le forum Développement
    Réponses: 5
    Dernier message: 07/10/2004, 17h56
  5. Questions de mise aux points
    Par nicoo dans le forum DirectX
    Réponses: 5
    Dernier message: 11/05/2004, 14h01

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