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

Contribuez C++ Discussion :

De la rapidité du code [Trucs & Astuces]


Sujet :

Contribuez C++

Vue hybride

jfloviou De la rapidité du code 23/03/2002, 15h51
loic.radio Bonjour, Les astuces de... 25/03/2002, 17h32
exxos pour ce qui est des float, je... 29/03/2002, 14h17
Musaran Je suis tombé sur ce vieux... 30/08/2002, 03h14
gl Penser dans les options de... 30/08/2002, 08h22
shef Et surtout bencher... 30/08/2002, 08h41
fd asm 30/08/2002, 16h56
olivic Et faire des vrais algo. J'ai... 30/08/2002, 17h18
Pazz > olivic : pas d'accord avec... 30/08/2002, 18h30
Musaran Choisir comme option d'appel... 31/08/2002, 01h41
LeGreg Vous pouvez utilisez les... 31/08/2002, 04h07
Pazz à noter que sur les Pentium... 31/08/2002, 10h44
haypo Je suis p'têtre HS, mais je... 01/09/2002, 03h57
LeGreg Oui le meilleur moyen de... 01/09/2002, 11h33
Pazz bien d'accord avec vous, ce... 01/09/2002, 13h23
Musaran Moi aussi. Mais cela... 02/09/2002, 02h56
Musaran En C, on ne peut pas... 02/09/2002, 03h01
Musaran Plutôt que de faire... 02/09/2002, 03h03
LeGreg Bien sur que non! on parle de... 02/09/2002, 11h00
spidermario Attention, il ne faut surtout... 28/05/2007, 15h25
izguit Salut tout le monde, J'ai vu... 27/06/2007, 19h47
Bakura J'aurais une petite question... 27/06/2007, 19h55
gl Non, Musaran a raison, vous... 02/09/2002, 11h10
LeGreg il ne faut pas etre... 02/09/2002, 11h58
gl Je sais tres bien que ca ne... 02/09/2002, 13h02
Musaran Je ne sais pas trop quoi dire... 03/09/2002, 03h14
gl Ca s'apelle le binaire... 03/09/2002, 08h05
RegBas là , je viens de relire tout... 03/09/2002, 22h01
Musaran Quand, pour optimiser, on... 04/09/2002, 03h31
Musaran -utiliser des tables plûtot... 04/09/2002, 03h33
gl Mais toutes ces... 04/09/2002, 07h55
RegBas non , mais j'veux dire que ,... 04/09/2002, 14h38
gl Non l'operateur <<1 ou >>1... 04/09/2002, 15h08
RegBas oui , c'est vrai pour les... 04/09/2002, 15h26
gl Je suis desole, je suis bien... 04/09/2002, 15h34
Musaran Le standard ISO/ANSI définit... 05/09/2002, 03h24
Blustuff Caclculer tout ce qui peut... 06/12/2002, 08h46
goethe Temps de calcul (en u.a.) des... 06/12/2002, 09h44
HRS Pour un développeur, la... 06/12/2002, 10h33
gl Si >> et << marche tres bien... 06/12/2002, 13h17
Gandalf La premiere regle devrait... 06/12/2002, 14h06
nyal En résumé : Laisser faire le... 06/12/2002, 14h36
Blustuff M'ettonerai bien moi que le... 06/12/2002, 18h52
Blustuff Va demander a ceux qui creent... 06/12/2002, 19h00
Blustuff Ca m'intriguait alors j'ai... 06/12/2002, 23h26
Musaran Malheureusement non. Une... 07/12/2002, 03h29
Blustuff oui, mais c'est de la... 07/12/2002, 04h37
antony_esi Un petit conseil pour ceux... 17/12/2002, 00h28
Musaran Il y a des conventions de... 17/12/2002, 06h14
LeGreg le compilateur de VC++ 7 fait... 17/12/2002, 10h36
ludovic.fernandez Et pour celui qui en veux,... 17/12/2002, 18h03
LeGreg Question posee en entretien... 27/04/2003, 21h42
Blustuff moi pour répondre a cette... 27/04/2003, 23h52
LeGreg ah bon tu en as besoin? ... 28/04/2003, 00h04
Blustuff déja moi si MAX est inferieur... 28/04/2003, 00h16
LeGreg peu importe MAX, ce code peut... 28/04/2003, 00h33
Blustuff oki, je me trompe peut etre... 28/04/2003, 01h43
LeGreg tab&#91;0&#93; = c + d; ... 28/04/2003, 08h53
Blustuff c'est parce que en ecrivant ... 28/04/2003, 11h51
LeGreg J'ai un peu de temps a perdre... 28/04/2003, 13h36
Blustuff houlà, tu pourrais tout... 28/04/2003, 23h25
LeGreg je n'ai pas mis tout le code... 29/04/2003, 03h08
Blustuff Une multiplication cachée... 30/04/2003, 23h43
LeGreg Je ne sais pas si tu as... 01/05/2003, 00h25
Blustuff Les multiplications ne sont... 02/05/2003, 20h22
LeGreg Tu parles de cache est c'est... 02/05/2003, 20h51
LeGreg lorsque tu fais tab[i], le... 02/05/2003, 20h54
Blustuff Non pas quand la taille de... 02/05/2003, 21h21
LeGreg oui je ne connaissais pas le... 02/05/2003, 21h48
Blustuff désolé pour deux trois... 02/05/2003, 23h19
Christophe Brun Je vois qu'aucun de vous deux... 12/05/2003, 13h05
Blustuff houlà, a cette heure là il... 12/05/2003, 13h25
Blustuff ayé j'ai compris en lisant le... 12/05/2003, 13h41
Christophe Brun C'était bien ma question, en... 12/05/2003, 14h37
Argh! dans le meme domaine, jai une... 22/05/2003, 11h28
Elrond Apres avoir regarde... 22/05/2003, 16h19
Yabo Edite du message suite à une... 16/06/2003, 03h34
LeGreg Oui mais en fait ce n'est pas... 16/06/2003, 04h15
Elrond C'est absolument n'importe... 16/06/2003, 10h52
LeGreg A mon avis c'est un troll ca... 16/06/2003, 11h13
Xiao-An Et le conseil le plus utile :... 24/07/2003, 11h26
rolkA J'ai quand même une petite... 26/07/2003, 13h42
LeGreg malheureusement non un ... 26/07/2003, 23h24
Blustuff Quand j'ai commencé l'asm, je... 27/07/2003, 00h29
LeGreg je ne parlais pas... 27/07/2003, 01h13
LeGreg Il existe des methodes... 27/07/2003, 01h16
Xiao-An Bonne analyse -> Bonne... 27/07/2003, 18h15
Blustuff Je n'ai d'une part jamais dit... 28/07/2003, 00h22
Blustuff enfin si, je l'ai dit :))... 28/07/2003, 00h35
Xiao-An A propos meme du codage en... 03/08/2003, 16h39
Metal Tom En parlant de carrence... 03/08/2003, 20h27
Argh! euh juste pour les copie par... 26/08/2003, 05h22
Metal Tom T'inquiète pas le compilateur... 26/08/2003, 12h20
Blustuff Pour copier un tableau de 550... 27/08/2003, 00h18
Argh! blustuff, je suis tout a fait... 30/08/2003, 03h08
Blustuff Non, non, il y a des... 30/08/2003, 03h33
Metal Tom C'est testable. T'en fais... 30/08/2003, 10h31
Elrond Un tel changement est sans... 03/09/2003, 10h57
Causa Sui Voici un petit résumé de ce... 22/11/2003, 23h47
ShootDX Entièrement d'accord avec le... 23/11/2003, 17h54
hegros Optimiser pour gagner 1sec je... 25/11/2003, 07h11
Blustuff Lire tout c'est bien, mais il... 28/11/2003, 13h28
LeGreg Oui il est surtout plein de... 30/11/2003, 09h01
LeGreg C'est à moi qu'on a demandé... 30/11/2003, 09h22
LeGreg Le Memcpy générique n'est pas... 30/11/2003, 09h34
ShootDX Pour parcourir tous les... 19/12/2003, 20h43
amiro je veux savoir comment le... 01/01/2004, 22h36
ShootDX Ca revient au même... 01/01/2004, 23h26
el muchacho Honnêtement, je ne vois pas... 05/03/2004, 12h09
fabien.raynaud En terme de rapidité de code,... 29/05/2004, 12h38
maxlef théoriquement on peux... 24/07/2004, 16h45
ShootDX d'ailleurs je ne sais pas... 26/07/2004, 12h02
salseropom Bonjour, j'avoue ne pas avoir... 15/03/2005, 16h39
Caine Des exemples: Implémenter... 27/05/2005, 12h59
Matthieu Brucher L'explication est donnée un... 12/07/2005, 16h57
lepoutho ++ i est plus rapide que i++... 01/08/2005, 15h33
lepoutho parcours d'une chaine char *... 01/08/2005, 15h35
lepoutho utiliser l'operateur * plutot... 01/08/2005, 15h45
moldavi Je pense que les compilateurs... 01/08/2005, 19h51
lepoutho j'ai fait des tests... 02/08/2005, 16h51
Rafy Le mieux pour optimiser du... 04/10/2005, 19h47
Rafy La methode béton qui marche à... 04/10/2005, 19h51
Rafy Ceci dit pour optimiser les... 04/10/2005, 19h57
Luc Hermitte Pour les matrices et... 05/10/2005, 00h26
Coelacanthe Ce sujet confirme que je suis... 05/01/2006, 01h31
Amokrane juste un truc , Al khawarizmi... 05/01/2006, 12h30
Rafy Hum j'avais dis ça car je... 02/02/2006, 21h36
Charlemagne La discussion est vieille,... 06/05/2006, 01h55
Rafy tu as écris += 4, je suppose... 11/05/2006, 22h14
Charlemagne T'as pas dû comprendre grand... 11/05/2006, 22h50
_vince_ de la rapidite de lecture du... 28/11/2007, 09h24
FloMo Je confirme : un code clair... 28/11/2007, 09h29
yan accelerer le trie 30/11/2007, 13h58
zenux J'ai une petite question,... 08/06/2008, 15h47
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Mars 2002
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1
    Par défaut De la rapidité du code
    Bonjour à tous, je suis nouveau sur ce forum et suis à la recherche de tous les trucs et astuces du plus bateau au plus compliqué pour un code plus efficace en vitesse de calcul: ex mieux vaut une boucle FOR ou l'usage du WHILE ? La pile est elle vraiment plus rapide que le tas?
    l'usage de inline c'est mieux pour la vitesse?

    et tous les autres...

    Donc si vous connaissez des sites, ou des astuces, merci!

    jaja

  2. #2
    Invité de passage
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1
    Par défaut
    Bonjour,

    Les astuces de bases les plus utiles :

    - ne jamais utiliser de double ni de float si on peut faire autrement,
    - utiliser les fonctions inline si possible,
    - si tu as des calculs utilisant fréquement des sinus, cosinus.. calcul les une fois et mets les dans un tableau indexé ( ex au lieu de cos(12), calcul tout les cos jusqu'à 360 et mets-les dans un tableau double MonCos : cos(12) devient MonCos[12]).
    - sauter dans les fichiers (utiliser ftell et fseek) au lieu de lire octet par octet.
    - essayer d'avoir le moins de division et de multiplication possible.
    - utiliser les décalages plutot que les multiplication ou division si multiple de 2 : ex : x<<2 au lieu de x=x*2
    - etc, etc,etc

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 84
    Par défaut
    pour ce qui est des float, je crois que maintenant avec les new processeurs c aussi bien gere que des int. mais bon a voir ....

    pour ce qui est des parcours des tab, il vaut mieux des pointeurs mobile:
    de meme, il vaut mieux comparer qqch avec qqch du registre (ici le 0), voir meme 2 choses du registre entre eux:

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int tab[50000];
    for(int i(0);i<50000;i++){
    //qqch a faire
    }
    remplacer par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int tab[50000];
    int * ptr=tab;
    register int i=50000;
    while (i--){
    //qqch a faire
    }

  4. #4
    Membre expérimenté

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Par défaut
    Je suis tombé sur ce vieux topic au hasard d'une recherche...
    Et je le remonte sans honte !


    Commentaires:
    Ne pas remplacer une division (par une puissance de 2) par un décalage !
    Le compilateur sait très bien le faire.
    Et puis ça ne marche pas sur les nombres négatifs.

    register est un voeu pieu... Là aussi, le compilateur sait très bien décider tout seul.

    inline est pareil...
    Attention à ne pas forcer, l'augmentation de taille du code pourrait annuler le gain des appels de fonctions évités.


    Conseils:
    Attention, tout ceci est à comprendre 'dans la mesure du raisonnable'.

    -prendre un bon compilateur ! Lui faire confiance pour les optimisations de base.

    -utiliser des librairies efficaces !

    -simplifier les expressions.

    -avoir une structure de programme efficace.

    -mesurer les performances, se concentrer sur les 20% de codes consommant 80% du temps. Typiquement les boucles imbriquées.

    -préférer les entiers aux flottants.

    -préférer le type int, c'est quasiment par définition le plus rapidement manipulé par le processeur.

    -spécifier const tout ce qui peut l'être. Si ça bouge pas, pas besoin d'aller y voir..

    -éviter les opérations d'écriture.

    -mettre des assert dans le code. En plus de capturer des bogues, certains compilateurs savent s'en servir comme indices d'optimisation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    signed int i= ...;
    assert(i>0);
    ...=i/4; //bien que signé, i est positif, et /4 est remplacé par >>2.
    -éviter les appels systèmes. Ils engendrent un changement d'état du processeur qui consomme une centaine de cycles d'horloge...

    -éviter les E/S, surtout les accès disques.

    -gérer un tampon avec les E/S lentes. fopen au lieu de open par exemple.

    -éviter les branchements, ils impliquent un "jump" au niveau processeur, ce qui nuit aux enchaînements de traitements.
    Les boucles(for et (do)while) impliquent une condition à chaque itération. do...while fait un branchement de moins à la fin.
    Une condition (if/else et ?:) implique un branchement. if sans else n'a de branchement que si faux.
    Le branchement goto nuit à la compréhension qu'à le complilateur de votre code.
    Si vous l'utilisez quand même, sachez que les accolades traversées engendrent des libérations/allocations/initialisations sur la pile, donc c'est plus qu'un simple "jump" processeur.

    -mettre la moité la plus fréquente du if-else côté... je sais plus !

    -dérouler les boucles. Euh... non! Le compilateur s'en charge.

    -éviter les appels de fonctions. En plus du double saut aller-retour, il y a des sauvegardes de registres.

    -manier les compteurs de max vers 0. Car les comparaisons avec 0 sont plus rapides.

    -utiliser des pointeurs mobiles plutot que des indices.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    p++ ; //1 addition
    *p  ; //1 déréférencement
     
    i++ ; //1 incrémentation
    t[i]; //*(t+i) 1 multiplication, 1 addition, 1 déréférencement
    -ne pas copier inutilement les données. Traitements sur les chaînes par exemple...

    -pré-calculer ce qui peut l'être.

    -éviter les allocations dynamiques.

    -ne pas confondre nombre de lignes de source et taille du code compilé.

    -ne pas faire de choses inutiles. C'est évident...

    -cherchez la localité de référence.
    Ça veut dire faire des accès sur les mêmes données (ou adjacentes) à peu d'intervalle.
    Pour bénéficier à plein des caches processeur, carte mère, mémoire, système, disque, ect...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int tab[X][Y];
    for(y=0;y<Y;y++)
    	for(x=0;x<X;x++)
    		tab[x][y]; //mauvais, x varies le plus vite
    for(x=0;x<X;x++)
    	for(y=0;y<Y;y++)
    		tab[x][y]; //bon, c'est la dernière dimension dont les cellules sont adjacentes en mémoire
    -faire des accès linéaires. Car les caches pré-chargent les données adjacentes.


    C'est tout pour cette fois, mais il y en aura sûrement d'autres...

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Penser dans les options de compilation a parametrer le compilateur en 'optimisation de temps d'execution'

  6. #6
    Membre éclairé

    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Par défaut
    Et surtout bencher régulièrement son appli au fur et à mesure des potimisations, pour se rendre compte de leur effet (ou de la dégradation)

  7. #7
    fd
    fd est déconnecté
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Par défaut asm
    ...et generer le code assembleur pour l'optimiser eventuellement (je parle de l'optimiser en C/C++ et pas taper ds l'asm directement bien entendu)

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 108
    Par défaut
    Et faire des vrais algo. J'ai vu un prog avec un trie bulle pour trié un tableau avec à coté des décallage binaire partout.

    Quand je vois des personnes qui créés des class existante (liste chainé par ex) je suis persuadé qu'elles sont moins efficace que la STL.

  9. #9
    Membre éclairé
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Par défaut
    > olivic : pas d'accord avec toi. Tu peux faire une liste bien chainée bien plus efficace que celle de la STL, par contre elle n'aura pas la même robustesse.

    Avantages de la STL : efficacité connue mais pas forcément optimale (mais toujours correcte), et surtout utilisable dans toutes conditions, tous les cas ont été pensés.

    Mais si c pour un cas particulier tu peux faire bien plus rapide.

  10. #10
    Membre expérimenté

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Par défaut
    Choisir comme option d'appel par défaut des fonctions "fastcall".

    Le standard est "stdcall" il me semble, c'est l'appelant de la fonction qui nettoie les arguments passés.

    Ça doit bien faire... oh... 3 octets de perdus par appel de fonction, c'est intolérable !

  11. #11
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    - ne jamais utiliser de double ni de float si on peut faire autrement,
    Vous pouvez utilisez les float tant que vous voulez surtout que le besoin s'en fait sentir avec l'informatique moderne.
    Par contre, vous devriez limiter les conversions float -> int -> float.
    Limitez l'utilisation du fmod a ce qui est necessaire.
    Sinon les multiplications, additions, soustractions de float sont assez rapides sur les processeurs > pentium. ce ne sera pas le facteur limitant si tu es obligé de faire du code compliqué pour compenser l'absence du float.

    - si tu as des calculs utilisant fréquement des sinus, cosinus.. calcul les une fois et mets les dans un tableau indexé ( ex au lieu de cos(12), calcul tout les cos jusqu'à 360 et mets-les dans un tableau double MonCos : cos(12) devient MonCos[12]).
    Gain non garanti pour des raisons d'etranglement sur l'acces à la lookup table alors que les processeurs incluent une instruction de calcul du cosinus. A n'utiliser que pour des processeurs limités en virgule flottante (proc embarqués) et meme la ca peut etre parfois plus rapide et aussi efficace de faire le calcul par approximation.

    - essayer d'avoir le moins de division et de multiplication possible.
    Beaucoup plus vrai pour les divisions que pour les multiplications qui sont assez rapides. Notez que diviser par X revient a multiplier par 1/X mais c'est un truc de base, il paraitrait meme que des compilateurs l'optimisent (quand il s'agit de constantes).

    Ne pas remplacer une division (par une puissance de 2) par un décalage !Le compilateur sait très bien le faire.
    Et puis ça ne marche pas sur les nombres négatifs.
    moi j'aime bien generer des puissances de deux par un 2^n = 1 << n;
    Sinon la puissance de deux en binaire a une propriete interessante
    on peut calculer son modulo par un & (2^n-1)
    et on peut l'arrondir a la puissance de deux voulue par l'opération complementaire & ~(2^n-1).
    Ca ne sert presque a rien. Enfin de toute facon ce genre d'optimisation vous le ferez après la touche finale si jamais ca a une importance quelconque.

    inline est pareil...
    Attention à ne pas forcer, l'augmentation de taille du code pourrait annuler le gain des appels de fonctions évités.
    Si vous pensez qu'une methode peut-etre inline, pensez a la mettre
    dans le fichier header de votre classe, sinon le compilo ne saura pas ou trouver le corps de la fonction pour l'inliner. (certains ont un fichier header qu'ils appellent machin.inl pour spécifier qu'il contient les définitions des fonctions inlinables)

    -prendre un bon compilateur ! Lui faire confiance pour les optimisations de base.
    C'est lesquels les mauvais compilateurs?
    perso j'utilise MSVC++, c'est bien suffisant
    pour ce que je fais.

    -avoir une structure de programme efficace.
    Oui avant de chercher a gagner des cycles sur une boucle
    voir si l'algo qui prend une heure ne peut pas etre ramené
    a un algo qui prend une minute par analyse du probleme.

    -préférer les entiers aux flottants.
    cf ma remarque ci dessus

    -préférer le type int, c'est quasiment par définition le plus rapidement manipulé par le processeur.
    Ca veut dire que bool ne peut pas etre manipulé rapidement par le proc?
    L'important c'est tout de meme la proprete des types manipulés par le programme, le compilateur fait sa sauce derriere pour arranger ca au mieux.

    -spécifier const tout ce qui peut l'être. Si ça bouge pas, pas besoin d'aller y voir..
    Je ne crois pas que le compilateur optimisera tres souvent sur const.
    Par contre un code peut-etre optimisé pour du const-specific
    exemple: surcharge d'une methode const sur une string qui renvoie un char plutot qu'une reference vers un char.

    -éviter les opérations d'écriture.
    ??

    -ne pas faire de choses inutiles. C'est évident...
    Ah tu veux dire, eviter de mettre des noop au milieu du code?

    [snip] (je coupe)

    Ca fait tout de meme beaucoup de regles dont certaines ont un interet qui est soit tres faible soit risquent d'etre mal interpretées.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  12. #12
    Membre éclairé
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Par défaut
    ne jamais utiliser de double ni de float si on peut faire autrement,
    à noter que sur les Pentium IV, ALU et FPU peuvent fonctionner simultanément.

    Donc si tu as besoin de faire 20% d'op sur des floats et 80% sur des entiers, tu lances une op sur float, 4 sur entiers, une sur float, 4 sur entiers etc.

    Bon évidemment c plus facile à faire en asm qu'en C++ mais on voit quand même la différence.

    Je ne sais pas si certains compilo réalisent cette optimisation pour l'instant spécifique à un CPU.

  13. #13
    Membre Expert

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Par défaut
    Je suis p'têtre HS, mais je veux quand même faire part de ma pensée : je me concentre sur la qualité du code, le rendre portable, bien optimiser les algorithmes. L'optimisation en elle-même : compilateur s'en charge :-)

    En jouant avec les "petites" optimisations : décalages binaires, utiliser int plutôt que float, etc., on gagne des performances, c'est sûr, mais ça rend le code moins compréhensible et donc plus difficile à maintenir et déboguer ...

    Un changement d'algorithme par contre permet des gains énorme de performances ! On passant d'une liste simplement chaînée à une liste doublement chaînée je passe d'un calcul de 3.5 secondes à 20 millisecondes !!! Simplement car effacer un élément dans une liste chaînée demande à connaître l'élément précédent, il faut donc parcourir la liste ... quand tu as 1 million d'élément, ça prend le temps qu'il faut :-)

    Par contre j'ai un faible pour le mot clé "const".

    On m'a d'ailleurs dit qu'il fallait plutôt utiliser "const int cst_x = 4;" que "#define cst_x (4)". Je doute. Mon problème est surtout de placer des "const type var=valeur;" dans un fichier .H ... "Impossible de précompiler l'entête car il contient du code" :-( Et si je mets un "extern" devant, et que je le déclare avec sa valeur dans le .CPP ... Ca marche pas, il me dit que la variable n'est pas définit ou je ne sais pas quoi :-/

    @+ Haypo

  14. #14
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    Un changement d'algorithme par contre permet des gains énorme de performances ! On passant d'une liste simplement chaînée à une liste doublement chaînée je passe d'un calcul de 3.5 secondes à 20 millisecondes !!! Simplement car effacer un élément dans une liste chaînée demande à connaître l'élément précédent, il faut donc parcourir la liste ... quand tu as 1 million d'élément, ça prend le temps qu'il faut :-)
    Oui le meilleur moyen de faire du code rapide
    c'est de faire une analyse du probleme et d'en déduire
    la structure de donnée la moins mauvaise à utiliser.

    Donc conseil au programmeur débutant: n'apprend pas de quel coté du if il faut mettre le bloc le plus probable, cela te donnera une fausse idée que tu maitrises la machine. Par contre prend des cours d'algorithmique de base ou lis un bouquin (style introduction a l'algorithmique de Thomas Cormen).

    On m'a d'ailleurs dit qu'il fallait plutôt utiliser "const int cst_x = 4;" que "#define cst_x (4)". Je doute. Mon problème est surtout de placer des "const type var=valeur;" dans un fichier .H ... "Impossible de précompiler l'entête car il contient du code" :-( Et si je mets un "extern" devant, et que je le déclare avec sa valeur dans le .CPP ... Ca marche pas, il me dit que la variable n'est pas définit ou je ne sais pas quoi :-/
    Entre les const et les define c'est un peu la guerre.
    Par contre ce qui est sur c'est qu'on peut toujours remplacer
    une suite de define par un type enum. C'est une maniere de typer plus fortement un entier, et en plus une
    variable de type enum apparaitra sous son nom propre dans
    le debogueur, ce qui peut etre un gain de temps.

    Pour ce qui est de la définition des constantes globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern const type mavar; // dans le .h
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const type mavar = .. ; // dans le cpp
    normalement ca marche.
    Quel est ton code et quel est ton message d'erreur? (a la compilation ou lors de l'édition de liens?)

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  15. #15
    Membre éclairé
    Inscrit en
    Août 2002
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 44
    Par défaut
    bien d'accord avec vous, ce qui prime c avant tout la structure de donnée et l'algo, et seulement ensuite l'implémentation.

    Mais c plus compliqué à expliquer dans le forum

  16. #16
    Membre expérimenté

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Par défaut
    Citation Envoyé par LeGreg
    moi j'aime bien generer des puissances de deux par un 2^n = 1 << n;
    Moi aussi. Mais cela implique:

    Supposition 1) << et >> signifient déclage vers le poids fort/faible.
    Les explications que je lis parlent juste de gauche/droite.
    L'effet serait inversé avec le "boutisme" de bits opposé ?

    Supposition 2) Les nombres sont représentés en système de base partant de 0, ou arabe, je ne sais pas trop comment on dit.
    Il existe d'autres représentations, certes moins courantes: décimal codé binaire, fibonacci, biaisé...

    Supposition 3) Les nombres sont représentés en base 2 (binaire).
    En base n, ce serait multiplier/diviser par n.

    Des suppositions légères, mais des suppositions quand même.

    Nota: il est vrai que mon manuel dit que <<1 revient à *2.

    C'est lesquels les mauvais compilateurs?
    Je ne sais pas...
    Mais le jour où j'ai besoin que mon exécutable soit effectivement performant, la première chose que je fais, c'est de me renseigner là-dessus.


    -préférer le type int, c'est quasiment par définition le plus rapidement manipulé par le processeur.
    Ca veut dire que bool ne peut pas etre manipulé rapidement par le proc?
    L'important c'est tout de meme la proprete des types manipulés par le programme, le compilateur fait sa sauce derriere pour arranger ca au mieux.
    Je veux dire:
    Si le type n'est pas soumis à une contrainte particulière, comme initialisé par tel autre type, passé a une fonction, surpasser ou pas, avoir des décimales, être signé ou pas...
    ...alors, il faut prendre int.
    Prendre un type plus petit en se disant "il prends moins de place en mémoire, j'y gagne" risque surtout de forcer le compilateur à générer du code supplémentaire, ou à utiliser des instructions processeur anciennes pour y accéder conformément au code écrit.

    int est par définition de la taille que le processeur manipule le mieux (mais au moins 32 bits dans les dernières normes).
    En interne, les types <int sont placés dans un espace d'un int, le compilateur sait ce qu'il fait.

    Je ne crois pas que le compilateur optimisera tres souvent sur const.
    Je crois l'inverse.
    Je crois même qu'il traque ce qui est const sans l'avoir été déclaré.
    Mais de toutes façon, il vaudrais mieux savoir que croire.

    -éviter les opérations d'écriture.
    ??
    J'ai été un peu bref, là...
    Je veux dire qu'une écriture, que ce soit en mémoire ou sur disque ou autre, est typiquement plus longue qu'une lecture.
    Ça peut être intéressant de travailler sur une valeur temporaire, et de n'écrire le résultat qu'une fois.

    Ca fait tout de meme beaucoup de regles dont certaines ont un interet qui est soit tres faible soit risquent d'etre mal interpretées.
    Oui...
    Toutes les expliquer en détail serait trop long.
    Mais je préfères les donner que de les taire.
    Ceux qui sont intéressés doivent se documenter pour bien comprendre, c'est clair...

    Une optimisation mal faite peut être pire que le code non-optimisé !

  17. #17
    Membre expérimenté

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Par défaut
    En C, on ne peut pas partager les variables constantes par un header comme en C++.
    Chaque source crée sa propre constante.

    Et si on utilises extern, la constante n'est pas connue à la compilation, ce qui permet moins d'optimisations (le C++ est également concerné).

    Par contre, on peut substituer des enums pour les entiers int:

  18. #18
    Membre expérimenté

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Par défaut
    Plutôt que de faire malloc/free dans un bloc pour une broutille...
    ...utiliser alloca, la mémoire est allouée sur la pile et automatiquement libérée à la sortie de bloc.

    Toutefois:
    -ce n'est pas standard.
    -la pile n'est faites que pour quelques mégas maximum.

  19. #19
    Membre Expert

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Par défaut
    << et >> signifient déclage vers le poids fort/faible.
    Les explications que je lis parlent justent de gauche/droite.
    L'effet serait inversé avec le "boutisme" de bits opposé ?
    Bien sur que non! on parle de representation binaire du nombre
    et non pas de sa representation en memoire (ou sur disque).

    Supposition 2) Les nombres sont représentés en système de base partant de 0, ou arabe, je ne sais pas trop comment on dit.
    Il existe d'autres représentations, certes moins courantes: décimal codé binaire, fibonacci, biaisé...
    les operateurs binaires operent sur les representations binaires
    des nombres. Point.

    Je crois l'inverse.
    Je crois même qu'il traque ce qui est const sans l'avoir été déclaré.
    Mais de toutes façon, il vaudrais mieux savoir que croire.
    Non tu crois probablement la meme chose que moi . Mais optimiser ce qui est effectivement "const" dans une expression, n'est pas ce que j'appelle moi optimiser sur le mot-clé "const".
    (exemple classique : fonction(objet&, const objet &)..)

    un article qui etaie ce que j'essaie d'expliquer tant bien que mal
    http://www.gotw.ca/gotw/081.htm

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  20. #20
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Par défaut
    Citation Envoyé par LeGreg
    les operateurs binaires operent sur les representations binaires
    des nombres. Point.
    Attention, il ne faut surtout pas confondre "opérateur binaire" et "opérateur agissant sur la représentation binaire" !
    Par exemple, ~ est un "opérateur agissant sur la représentation binaire" mais est unaire car ne prend qu'une opérande.
    En revanche, * et / sont binaires car ils prennent deux opérandes.

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/08/2014, 17h52
  2. Optimiser rapidité code
    Par bobosh dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/08/2008, 16h12
  3. Optimisation code pour gagner en rapidité
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/03/2008, 15h32
  4. requete QBE / requete code : rapidité et index
    Par LostIN dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 05/07/2006, 08h54
  5. [rapidité du code] Mise a jour a partir d'un TQuery.
    Par goethe dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/10/2004, 09h01

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