Mon collègue Stuart 'Pavlov' Parmenter vient de publier un très long billet sur la consommation de mémoire des navigateurs, et de Firefox 2 et 3 en particulier. Il explique comment Mozilla a travaillé pour réduire la consommation de mémoire de Firefox. Je vous fait grâce des détails, et je résume les points clés en fin de billet.

Le plus intéressant, c'est que la consommation de mémoire de Firefox 3 (Beta 4) est bien meilleure que celle de Firefox 2 (laquelle était déjà considérablement meilleure que celle d'un navigateur connu dont je tairais le nom parce que j'ai dit que je ne dirais plus de mal d'Internet Explorer 7 aujourd'hui ;-)

Utilisation mémoire dans Firefox 2, Firefox 3 Beta 4 et un autre navigateur

La méthode utilisée est la suivante (traduction par mes soins) :

Nous avons chargé 29 pages Web différentes dans 30 fenêtres sur 11 cycles (soit un total de 319 chargements). Nous ouvrons une nouvelle fenêtre à chaque chargement de page, en fermant la fenêtre la plus ancienne quand on atteint le nombre de 30 fenêtres. A la fin, nous fermons toutes les fenêtres sauf une, on laisse le navigateur quelques minutes pour voir si la mémoire est récupérée et les caches à court terme vidés, etc. Il y a une attente de 3 secondes entre chaque chargement de page de façon à ce que chaque navigateur prenne la même durée de test. Nous avons utilisé le serveur proxy intégré dans standalone Talos pour que ça soit toujours le même contenu qui est servi.

Pavlov donne les liens pour que chacun puisse tester ceci sur sa propre machine.

La conclusion de Pavlov est la suivante :

  • Tous les navigateurs augmentent leur consommation de mémoire au fil du temps, mais pour Firefox 3, c'est quasiment plat.
  • Le sommet (consommation maximale) pour Firefox 3 est plus bas que quand Firefox 2 revient au repos !
  • A la fin, Firefox 3 occupe 140 Mo de moins que Firefox 2, soit 60% de moins.
  • Firefox 3 finit à par charité pour Bill (qui vient d'être recalé à la 3eme place au classement des gens les plus riches du monde) je ne vais pas traduire cette phrase, le "pauvre" a déjà eu assez de mauvaises nouvelles comme cela ce mois-ci :-D

Comment est-on arrivé à ce résultat ?

Pavlov rentre dans beaucoup de détails, et tout est documenté dans bugzilla, mais voici les grandes lignes, pour ceux qui veulent en savoir plus, sans pour autant plonger dans les explications complètes en anglais :

  1. Réduction de la fragmentation mémoire. Pour Windows et Linux, nous utilisons maintenant jemalloc, de Jason Evans, auquel nous avons contribué, ce qui devrait profiter à FreeBSD.
  2. Suppression de cycles avec le "Cycle Collector". Les cycles, c'est quand deux objets en mémoire, qui ne sont plus utilisés (parce qu'on a fermé la page à laquelle ils appartiennent) se référencent mutuellement, ce qui fait que le logiciel pense qu'ils sont encore utilisés. Le "Cycle Collector" a pour objectif de détecter de telles situations et d'y remédier.
  3. Réglage des caches, avec des caches qui sont maintenant associés à des timers. Si vous n'accédez pas à une page pendant plus de 30 minutes, cela signifie probablement que vous n'allez pas y revenir avant quelque temps. On libère donc la mémoire cache.
  4. changements dans la façon de stocker les données des images, avec un timer sur le cache des images JPEG, et un stockage différent des GIF animés
  5. La chasse aux fuites (leaks). 400 bogues de fuite mémoire ont été corrigés, et création d'outils pour détecter les fuites.

Pavlov explique ensuite à quel point il est difficile de mesurer la quantité de mémoire effectivement utilisée. En gros : Linux et Vista font du bon boulot, là ou OS X et XP sont beaucoup moins précis (et surestiment la consommation)