« Optimisation des compilateurs » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 8 :
* [[Optimisation des compilateurs/Les optimisations liées à la hiérarchie mémoire|Les optimisations liées à la hiérarchie mémoire]]
* [[Optimisation des compilateurs/Les optimisations de la taille du code|Les optimisations de la taille du code]]
 
== Techniques ==
 
Les techniques d'optimisation peuvent être divisées en deux catégories :
* La première s'applique localement, sur une instruction.
* La deuxième s'applique globalement sur tout le programme et nous permet d'obtenir plus de gain mais avec une implémentation plus complexe.
 
=== Optimisation des expressions ===
 
Cette technique d'optimisation locale simplifie les expressions mathématiques utilisées quand certaines valeurs constantes sont utilisées dans des opérations.
 
Par exemple, pour la multiplication :
* multiplier une expression par 0 revient à ne pas la calculer,
* une multiplication par 1 est inutile,
* une multiplication par une puissance n de 2 (2<sup>n</sup>) revient à effectuer un décalage de n bits vers la gauche (vers les bits de poids fort).
 
=== Optimisation sur des fenêtres « peephole » ===
 
Cette technique, appliquée après génération du code machine, consiste à examiner quelques instructions adjacentes et voire si c’est possible de les remplacer par une instruction ou une séquence d’instructions plus courte. Par exemple, une multiplication par deux peut être efficacement exécutée par un décalage à gauche ou par une simple addition de la valeur à elle-même.
 
Considérant ce code en assembleur Java :
aload 1
aload 1
mul
 
Il peut être remplacé par :
aload 1
dup
mul
 
Ce type d’optimisation a besoin d’avoir des hypothèses sur l’efficacité des instructions. Dans ce cas précis, on a assumé que l’opération « dup », qui duplique et écrit dans la pile, est plus efficace que l’opération « aload X », qui lit une variable locale et l’écrit dans la pile.
Un autre exemple d’optimisation est d’éliminer les opérations de lecture redondante.
 
Ce code
 
A = B + C ;
D = A + E ;
 
devient
 
MOV b, R0
ADD c, R0
MOV R0, a
MOV a, R0 # lecture redondante, elle peut être supprimée
ADD e, R0
MOV R0, d