Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4504 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

inline en C

n°304303
Kristoph
Posté le 07-02-2003 à 22:53:17  profilanswer
 

Reprise du message précédent :
Je sais que l'inline peut faire perdre des perfs quand ça cause des cache miss sur le code.

mood
Publicité
Posté le 07-02-2003 à 22:53:17  profilanswer
 

n°304304
joce
Architecte / Développeur principal
"BugHunter"
Posté le 07-02-2003 à 22:56:02  profilanswer
 

Kristoph a écrit :

Je sais que l'inline peut faire perdre des perfs quand ça cause des cache miss sur le code.

ouais mais des caches miss qui cause 10% de pertes :eek:
En plus les ultra sparc ca a bcp de cache non ?

n°304427
Kristoph
Posté le 08-02-2003 à 10:59:18  profilanswer
 

Les cache miss, ca peut aller très loin. Il suffit que la fonction soit assez grosse et appelée à assez d'endroits differents dans le code.
 
Par exemple, si avant inline un algo gourmand en itérations tenait entièrement dans le cache ( code plus données à traiter ), mais qu'après inline il n'y tiend plus => très grosse chute de perfs.

n°304773
bjone
Insert booze to continue
Posté le 09-02-2003 à 02:05:47  profilanswer
 

vi.
 
de toutes façon, part du principe qu'a partir du moment ou tu as un boucle de traitement, le inline est inutile et générateur de pertes de perf.
 
par exemple:
 
class truc
{
public:
  float machin;
 
  inline mets_au_carré()
  {
    machin*=machin;
  }
};
 
class vector_de_trucs : public vector<truc>
{
  public:
 
  mets_tout_au_carré()
  {
     for( int i=0 ; i < Size() ; i++ )
         operator [](i).mets_au_carré();
  }
};
 
bon c'est du code porc (rien à fout si ça compile po)
mais dans l'idée pour avoir qqchose de performant fo que truc::mets_au_carré() soit inliné, mais pas vector_de_trucs::mets_tout_au_carré SAUF si il est utilisé qu'une fois dans tout le prog (difficile).
 
dans le cas de mets_au_carré() le temps d'un CALL/RET sera bien trop important devant la méthode elle-même, par contre dans le cas de mets_tout_au_carré() il sera insignifiant si le vector contient pas mal d'éléments, et un inline abusif fera décoller l'utilisation mémoire (et donc le trash du cache code) si la méthode est utilisé à de nombreux endroits...
 
inliner une méthode qui utilsée dans une boucle est aussi utile dans le sens ou en plus de dégager le couple call/ret, le compilo intègre les instructions de la méthodes dans la boucle, est génère un flux d'instruction optimal pour le CPU .


Message édité par bjone le 09-02-2003 à 02:08:23
n°304774
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 09-02-2003 à 02:14:22  profilanswer
 

merci pour les précisions :)

n°304780
Musaran
Cerveaulté
Posté le 09-02-2003 à 08:26:21  profilanswer
 

++Taz a écrit a écrit :

ça marche tres bien, ça fait la vie dure aux macros de musaran


Mais euh ! J'étais obligé m'sieur, j'ai des circonstances atténuantes.
 

++Taz a écrit a écrit :

inline ne garantit rien, c'est just epour inciter le compilo: il peut tres bien inliner une fonctions pas inline et vice versa


inline permet de partager la fonction par header.
Une fonction standard ne peut être inlinée dans des sources qui n'ont que sa déclaration.
 
 

joce a écrit a écrit :

desole, je peux pas me permettre de passer en C++ sur un projet comme ca


Se permettre de rester en C a un coût.
 

joce a écrit a écrit :

je viens de regarder a quoi correspond dbIsIdEqual :

Code :
  1. #define dbIsIdEqual(id1, id2) (id1 == id2)




Se serait plus sûr comme ça:

Code :
  1. #define dbIsIdEqual(id1, id2) ((id1) == (id2))


 

joce a écrit a écrit :

tient d'ailleurs en parlant de ca, j'ai rencontré un cas trop bizarre en C++ avec le compilo sur solaris : en virant un inline j'ai gagné 10% de perf sur l'application.
Le nm montrait plein de WEAK sur la fonction en question (apparement parce que la fonction inlinée comportait des variables statiques - je précise que c'est pas moi qui ait inliné la fonction   - ).  
Une idée de la raison d'un tel comportement ?


Il est possible que le compilateur, ne sachant pas inliner une variable statique, aie compilé une copie de la fonction pour chaque source : encombrement du cache par copies multiples.
 
 

*Syl* a écrit a écrit :

Bah si ton compilo accepte pas le inline, tu peux remplacer ta fonction par une macro..


Malheureux ! Tu tiens vraiment à te faire tabasser [:matleflou] ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°304787
Kristoph
Posté le 09-02-2003 à 09:48:52  profilanswer
 

Je viens juste de lire une "doc" sur comment inliner dans "Efficient C++", et en gros, il n'y a que 2 types de fonctions qu'il faut faire inline d'office :
 
- Les fonctions tellement petites qu'une fois inliné, son utilisation prend moins de place mémoire que de faire un appel de   fonction. Mention spéciale pour toutes les fonctions accesseur classiques en C++ comme GetValeur().
- Les fonctions utilisées une seule fois dans tout le projet, quel que soit leur taille.
 
Après, pour les tailles intermédiares, il faut voir au cas par cas.  
 
Les 2 interet de inline sont :
- Économiser les instructions d'appel de fonction/retour d'appel.
- Faire des optimisations plus sioux que si il n'y avait pas inline. Le code de ce genre :

Code :
  1. a = 0;
  2. if (a == 0)
  3. { ... }
  4. else
  5. { ...}


Ça s'optimise très bien, et ça peut arriver plus souvent que l'on ne le pense quand on fait de l'inline.


Message édité par Kristoph le 09-02-2003 à 09:49:28
n°304839
*syl*
--&gt; []
Posté le 09-02-2003 à 13:35:41  profilanswer
 

Musaran a écrit :

Malheureux ! Tu tiens vraiment à te faire tabasser [:matleflou] ?

Bah alors, si son compilo supporte pas le inline, explique comment t'aurais procédé.. (à part changer de compilo bien sûr :D)

n°305210
Musaran
Cerveaulté
Posté le 10-02-2003 à 05:42:57  profilanswer
 

Kristoph a écrit :

- Faire des optimisations plus sioux que si il n'y avait pas inline.

Ce sont des optimisations dites 'à travers' l'appel.
À ce qu'il paraît c'est la principale source d'optimisation.
 

*Syl* a écrit a écrit :

Bah alors, si son compilo supporte pas le inline, explique comment t'aurais procédé.. (à part changer de compilo bien sûr :D)


-changer de compilo :D .
-renoncer à inline. :(
-macro. Mais j'ai pris la bonne résolution de les éviter. :o


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°305237
joce
Architecte / Développeur principal
&#034;BugHunter&#034;
Posté le 10-02-2003 à 09:01:52  profilanswer
 

Pkoi éviter les macros ?

mood
Publicité
Posté le 10-02-2003 à 09:01:52  profilanswer
 

n°305285
chrisbk
-
Posté le 10-02-2003 à 10:32:11  profilanswer
 

joce a écrit :

Pkoi éviter les macros ?


 
c'est quand meme pas franchement super propre :D (Y'a des fois ou ca sauve la vie, en particulier j'ai un fichier limite fait a la macro (mais j'ai honte))

n°306021
Musaran
Cerveaulté
Posté le 11-02-2003 à 03:37:21  profilanswer
 

BJOne a écrit :

de toutes façon, part du principe qu'a partir du moment ou tu as un boucle de traitement, le inline est inutile et générateur de pertes de perf.

D'un autre côté, la fonction inline permet des optimisations spéciales si les arguments sont constants. Le déroulage de boucle entre-autres.
 
En fait, en C++ inline n'est pas un ordre.
Un bon compilateur est capable de créer la fonction en vrai s'il l'estime préférable.
D'autant plus que c'est basé sur le même mécanisme que les templates : compilation dans chaque source (plus lente), et fusion à la liaison.
 
La fonction peut même être inlinées à certains endroits et pas à d'autres.
Une méthode virtuelle inline par exemple.
 
 
 

joce a écrit :

Pkoi éviter les macros ?

Pour ça:

Code :
  1. #define CARRE(a) a*a
  2. int i=2;
  3. CARRE(i+j); //oups: i+j*i+j -> i+(j*i)+j
  4. 2/CARRE(i); //oups: 2/i*i -> (2/i)*i
  5. CARRE(i++); //oups: i++*i++
  6. int (*pf)()= &CARRE; //oups: 'undefined symbol CARRE'


Les deux premiers s'évitent comme ça:

Code :
  1. #define CARRE(a) ((a)*(a))


Les deux suivants ne s'évitent pas, c'est pourquoi cette macros est en majuscules : signaler qu'elle est une macro dangereuse.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Plus de sujets relatifs à : inline en C


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)