Annexe A. Astuces pour les développeurs

Tout bon manuel de programmation couvrira les problèmes liés à la mémoire et à l'allocation de mémoire et à la performance de certaines fonctions spécifiques. En développant votre logiciel, soyez conscient des problèmes qui peuvent augmenter la consommation d'énergie sur les systèmes sur lesquels le logiciel est en cours d'exécution. Même si ces considérations n'affectent pas chaque ligne de code, vous pouvez l'optimiser dans les domaines où se créent des goulots d'étranglement de performance.
Les techniques les plus souvent problématiques incluent :
  • l'utilisation de threads.
  • les réveils CPU inutiles et l'utilisation incorrecte des réveils. Si vous devez effectuer un réveil, faites-le en une seule fois et aussi vite que possible (en anglais, « race to idle »).
  • l'utilisation de [f]sync() sans que cela ne soit nécessaire.
  • les interrogations actives inutiles, ou l'utilisation de délais d'attente réguliers et de courtes durées. (Au lieu de cela, il vaut mieux réagir aux événements)
  • une utilisation des réveils inefficace.
  • un accès disque inefficace. Utilisez des mémoires-tampons de grande taille pour éviter un accès au disque trop fréquent. N'écrivez qu'un grand bloc à la fois.
  • une utilisation inefficace des minuteurs. Groupez les minuteurs sur plusieurs applications (ou même sur plusieurs systèmes) si possible.
  • des E/S, ou une consommation d'énergie ou utilisation de mémoire excessive (y compris les fuites mémoires)
  • l'exécution de calculs inutiles.
Les sections suivantes examinent certains de ces domaines dans plus de détails.

A.1. Utilisation de threads

Il est communément admis que l'utilisation de threads permet aux applications de fonctionner mieux et plus vite, mais ce n'est pas toujours le cas.
Python

Python utilise le verrou global, Global Lock Interpreter[1], ainsi le threading n'est utile que pour de grandes opérations d'E/S. Unladen-swallow [2] est une implémentation plus rapide de Python avec laquelle vous serez probablement en mesure d'optimiser votre code.

Perl

À l'origine, les threads Perl furent créés pour des applications exécutées sur des systèmes sans bifurcation (de l'anglais, forking) (comme sur les systèmes avec système d'exploitation 32-bit 32-bit). Dans les threads Perl, les données sont copiées pour chaque thread (copie sur écriture). Par défaut, les données ne sont pas partagées, car les utilisateurs devraient pouvoir être en mesure de définir le niveau de partage des données. Pour le partage de données, le module threads::shared doit être inclut.Cependant, les données ne sont pas seulement copiées (copie sur écriture), mais le module crée aussi des variables attachées pour ces données, ce qui prendra encore plus de temps et sera encore plus lent. [3]Windows

C

Les threads C partagent la même mémoire, chaque thread possède sa propre pile, et le noyau n'a pas à créer de nouveaux descripteurs de fichiers ou à allouer de nouvel espace mémoire. C peut réellement utiliser la prise en charge de plus de CPUs pour plus de threads, Ainsi, vous pouvez utiliser un langage de bas niveau tel que C ou C++ afin de maximiser la performance de vos threads. Si vous utilisez un langage de script, prenez en considération un binding avec C. Utilisez des profileurs afin d'identifier les parties de votre code performant mal. [4]