Loading lang_c_12_perfs...

enib_small.png LANG-C 12_Perfs — Optimisation des performances

En introduction de cet enseignement, nous justifiions l'usage du langage C par sa bonne aptitude à produire du code exécutable efficace en terme de temps de calcul, et par extension en coût énergétique du service rendu.
Nous argumentions en partie ceci par le fait que le compilateur est capable, lors de sa phase d'optimisation, de reformuler les traitements de manière minimale et parfaitement adaptée au matériel.
Cette opération consiste principalement à retirer du code exécutable produit toutes les vérifications pour lesquelles il peut être prouvé à l'avance (par l'analyse des types notamment, mais pas seulement) qu'elles ne sont pas nécessaires lors de l'exécution et par la reformulation la plus concise possible du code utile résultant (voir cette section).

Seulement, nous n'avons pas encore cherché à bénéficier de cette possibilité.
En effet, cet enseignement vise tout d'abord à découvrir les éléments fondamentaux du langage C et des recommandations raisonnables concernant sa mise en œuvre.
L'objectif premier est donc la réalisation de programmes corrects et maintenables ; ce n'est qu'après l'atteinte de ces premières exigences que la question de l'optimisation doit se poser.
{1 #build_mode } Mise au point avant l'optimisation
{2 #guidelines } Recommandations pour l'optimisation

Ici s'achève ce chapitre dans lequel nous avons expérimenté les capacités d'optimisation du compilateur en vue d'améliorer les performances des programmes réalisés.
Il en ressort que la démarche de mise au point et la démarche d'optimisation sont deux phases bien distinctes et exclusives l'une de l'autre.
La mise au point doit être la priorité afin de s'assurer que les traitements exprimés dans les algorithmes produisent bien les effets attendus sans introduire d'indétermination.
Ce n'est qu'après ces vérifications effectuées que l'optimisation doit être abordée, car elle provoque un remaniement du code exécutable tellement profond qu'il compromet toute tentative d'usage des outils de mise au point.

Indépendamment de la formulation précise des algorithmes, il faut savoir que certaines opérations sont réputées comme très coûteuses en temps d'exécution, nous éviterons donc de les invoquer de manière intensive (en boucle par exemple).
Parmi les plus courantes il y a :

Les précautions à prendre pour améliorer les performances lors de la formulation des algorithmes peuvent se résumer à exprimer le plus simplement possible nos intentions au compilateur sans introduire de contraintes qui ne soient pas justifiées dans le problème traité.
Il ne s'agit, à proprement parler, pas d'optimiser mais de laisser au compilateur l'opportunité de le faire.
En première approche nous pouvons nous contenter de :

Il se peut cependant que, sur des algorithmes suffisamment simples (parcours monotone de tableaux unidimensionnels par exemple), un compilateur moderne soit capable de prouver que les cas problématiques redoutés ne se produiront pas.
Il se peut également qu'il puisse se donner les moyens de les détecter à l'exécution et générer plusieurs versions du même algorithme qui seront invoquées selon les plages d'adresses et d'indices rencontrés lors de l'exécution.
Dans ces conditions très favorables, les précautions que nous prenons pourraient nous sembler inutiles car redondantes avec celles prises par le compilateur.
Toutefois, il convient de toujours s'efforcer de prendre ces précautions car tous les compilateurs ne sont pas aussi performants dans leur analyse des interactions potentielles entre les données d'un problème.
De plus, même lorsqu'un compilateur est capable de détecter les cas favorables d'un algorithme, une modification mineure de ce dernier peut mettre soudainement en échec cette analyse.

Pour en revenir aux motivations de l'usage du langage C exprimées dans cette section, si nous choisissons d'utiliser ce langage c'est que nous avons des attentes en matière de performances des traitements réalisés.
Il convient donc de se donner tous les moyens de parvenir à cet objectif en appliquant scrupuleusement les recommandations qui sont formulées ici ; il s'agit d'un travail d'attention incessant qui demande de la rigueur dans l'application de règles systématiques car la moindre maladresse peut ruiner de nombreux efforts.

Code source de l'expérimentation