Minimiser son code

Plus de code implique obligatoirement :

  1. Plus de maintenance
  2. Plus de deboggage
  3. Plus mémoire utilise (cache cpu devient inutile, goulet d'étranglement du bus mémoire)
  4. Plus de documentation
  5. Plus de cycles cpu pour une même opération
  6. Audit de sécurité plus dur

Causes :

  1. Négligence, mauvaise information (compilateur et éditeur de liens enlèvent-ils le code inutile? Utilité de "static", etc)
  2. Idéalisme : vouloir créer l'API parfaite conduit a des fonctions trop génériques, trop grosses
  3. Mauvaise gestion de projets : Multiple fonctions pour une même tache, dus a plusieurs programmeurs d'une même équipe
  4. Utilisations abusives d'interfaces pour une "Meilleure documentation"
  5. Le code croit avec le temps pendant lequel les besoins se précisent : les fonctions génériques deviennent énormes en fin de projet.

Comment ?

  1. Écrivez les interfaces spécifiques en premier lieu et les génériques en dernier.
  2. Pour augmenter les fonctionnalités d'une API, Ne rendez pas une fonction existante plus puissante. Ajoutez une nouvelle fonction à la place.
  3. Éviter les indirections, utiliser les fonctions les plus spécifiques possibles :
    • alloca plutôt que malloc
    • strchr plutôt que strstr
    • "fd=open("foo"interne, O_WRONLY|O_creat, 0600);" devrait être " fd=open_write("foo interne");"
  4. Utiliser les tableaux plutôt que les liste et arbres (empêche l'utilisation du cache CPU et nécessitent des fonctions)
  5. Généralisez les routines seulement si et si seulement il ne faut rien coder en plus.
  6. Utiliser CVS : Vérifier qu'une fonction n'existe pas déjà. A chaque commit tous les développeurs doivent vérifier le code.
  7. Inspecter le code binaire généré avec les outils nm, objdump, grep, gprof.
  8. Utiliser static pour déclarer au compilateur les portées de variables, et permettre au compilateur d'enlever du code inutile (ou émettre un avertissement)
  9. Utiliser les options d'optimisation qui ne genere pas de code supplémentaire : -Os plutôt que -O2
  10. Utiliser autant que possible les bibliothèques statiques : seuls les objets utilises seront inclus.
  11. Utiliser les macros avec circonspection.
  12. Utilisez des librairies optimisées : dietlibc, libowfat, trio, etc.

Exemples :

Basée sur une présentation de la dietlibc