Jump to content

[C++] Techniques à éviter?


Dragohn

Recommended Posts

Bonjour,

Voilà, il s'avère que je dois effectuer un projet en C/C++, j'ai eut des cours en C++, mais à aucun momnet n'est abordé la partie "optimisation mémoire ".

Pour faire court, mon projet consiste à implémenter certains algos, et à comparer leur efficacité.

Ce que je voudrais éviter, c'est de fausser les résultats à cause de techniques de programmation propres au C++ qui viendraient alourdir les choses pour la machine, et donc dont je voudrais me passer.

Sauriez vous ce qui est à éviter pour "économiser" la machine, ou pourriez vous me conseiller une doc traitant de ce sujet? Je cherche de mon côté sans réel résultat.

Merci d'avance :keskidit:

Link to comment
Share on other sites

Avant d'optimiser en fonction du langage, commence par optimiser le principe de tes algorithmes, c'est le plus important.

Après, il faut juste éviter certaines bêtises comme déclarer toutes ses variables en début de routine comme en C, penser au décalage de bits ( a * 2 ^ n == a << n ), remplacer ses multiples booléens par des chaînes de bits (et hop, 32 booléen par dword), éviter de dériver à mort des classes très utilisées pour limiter les évaluations de constructeur, mettre un frein sur les tableaux non-dynamiques.......etc.

Link to comment
Share on other sites

Avant d'optimiser en fonction du langage, commence par optimiser le principe de tes algorithmes, c'est le plus important.

En fait je n'ai pas vraiment d'algo a construire, à la base le but est de comparer thériquement la vitesse d'un algo donné pour différentes structures de données, puis de comparer les temps en pratique via implémentation. Le seul truc à plancher est une méthode de génération automatique de graphes de grande taille, le reste c'est de l'implémentation de structures/algo connus dès le départ.

Merci pour vos conseils.

Irgoff > Le site que tu m'as donné m'éclaircit déjà pas mal.

Merci à vous deux :francais:

Link to comment
Share on other sites

penser au décalage de bits ( a * 2 ^ n == a << n ),

C'est inutile. Les compilos intelligents le font automatiquement.

theo@fermat:~$ cat decalage_bits.c; cat multi.c
#include <stdio.h>

int main(void)
{
       int a=5;
       a = a>>7;
}
#include <stdio.h>

int main(void)
{
       int a=5;
       a = a*128;
}

theo@fermat:~/tests$ gcc -S *.c; cat *.s
       .file   "decalage_bits.c"
       .text
.globl main
       .type   main, @function
main:
       pushl   %ebp
       movl    %esp, %ebp
       subl    $8, %esp
       andl    $-16, %esp
       movl    $0, %eax
       subl    %eax, %esp
       movl    $5, -4(%ebp)
       leal    -4(%ebp), %eax
       sarl    $7, (%eax)
       leave
       ret
       .size   main, .-main
       .section        .note.GNU-stack,"",@progbits
       .ident  "GCC: (GNU) 3.3.4 (Debian 1:3.3.4-13)"
       .file   "multi.c"
       .text
.globl main
       .type   main, @function
main:
       pushl   %ebp
       movl    %esp, %ebp
       subl    $8, %esp
       andl    $-16, %esp
       movl    $0, %eax
       subl    %eax, %esp
       movl    $5, -4(%ebp)
       movl    -4(%ebp), %eax
       sall    $7, %eax
       movl    %eax, -4(%ebp)
       leave
       ret
       .size   main, .-main
       .section        .note.GNU-stack,"",@progbits
       .ident  "GCC: (GNU) 3.3.4 (Debian 1:3.3.4-13)"

Link to comment
Share on other sites

Il faut aussi faire le distingo entre 'optimisation memoire' et 'optimisation rapidite' (ou autres optimisations...)

Pour debuter, quelques points sur lesquels s'interesser :

- connaitre le cout de son algo (en n ? n carre ? grand tau de n ? valeur du grand tau ?)

- savoir le cout des operations simples en connaissant son compilateur (pourquoi vaut-il mieux ecrire ++i que i++ par exemple). Un peu d'assembleur de fait pas ne mal et aide a comprendre comment reagit la machine.

- de meme s'interesser a ce que font les librairies qu'on utilise. Example : a partir de quand l'utilisation d'un type string est-il plus interessant qu'utiliser des char/char* avec des bibliotheques maison ? Est-ce valable pour mon systeme d'exploitation ?

Bref, le tout est de se poser des questions sur chaque lignes de code ecrites. Si on a une idee du code genere, on peut facilement optimiser 'a la volee' des portions de code simples.

Link to comment
Share on other sites

- connaitre le cout de son algo (en n ? n carre ? grand tau de n ? valeur du grand tau ?)

C'est pas un grand tau, mais un grand 'o' noté O(n), O(n²)... (grand o de n, grand o de n carré...)

Sinon, je suis parfaitement d'accord avec toi.

J'ajouterais que pour optimiser la vitesse, il existe des logiciels qui permettent de voir le nombre d'appels de tes fonctions et le temps qu'elles prennent. Ainsi, tu peut te concentrer sur les plus couteuse/plus appellées. Mais je n'en connasi pas sous windows.

Link to comment
Share on other sites

Merci bien pour vos conseils. Ca me fait réfléchir un peu différement, ce qui ne peut être que bien :incline:

Theocrite, les logiciels dont tu parles, en connaitrais tu sous Linux (les projets chez nous sont à faire sous Linux)

Encore merci :non:

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...