Add-ons bonnes pratiques performances extensions

Cet article nécessite une relecture technique. Voici comment vous pouvez aider.

Cet article nécessite une relecture rédactionnelle. Voici comment vous pouvez aider.

Un des grands avantages de Firefox est son extrême extensibilité. Les extensions peuvent presque tout faire. Cela présente un inconvénient: les extensions mal écrites ont un impact majeur sur l'expérience de navigation, incluant les performances de Firefox lui-même. Cet article vous offre quelques bonnes pratiques et suggestions qui pourront non seulement augmenter les performances et la vitesse de votre extension, mais aussi celles de Firefox.

Améliorer les performances au chargement

Les extensions sont chargées et démarrés à chaque fois qu'une nouvelle fenêtre du navigateur est ouverte. Cela signifie qu'à chaque fois qu'une fenêtre s'ouvre, votre extension peut avoir un impact sur le temps que mettra l'utilisateur à voir le contenu qu'il essaye de visualiser. Il y a plusieurs choses que vous pouvez faire pour réduire la durée que votre extension ajoutera à l'apparition du contenu désiré par l'utilisateur.

Chargez uniquement ce dont vous avez besoin, quand vous en avez besoin

Ne chargez pas des choses au démarrage qui ne seront nécessaire que si l'utilisateur clique sur un bouton, ou si une préférence donnée est activé quand elle ne l'est pas. Si votre extension présente des fonctionnalités accessibles uniquement si l'utilisateur est identifié auprès d'un service, ne chargez pas de ressources pour ces fonctionnalités tant que l'utilisateur n'est pas identifié.

Utilisez les modules de code JavaScript

Vous pouvez créer vos propres JavaScript code modules incorporants les fonctionnalités qui ne sont requises que dans des circonstances particulières. Cela permet de charger à la volé des morceaux de votre extension, au lieu de tout charger d'un coup.

While JavaScript modules can be extremely useful, and provide significant performance benefits, they should be used wisely. Loading modules incurs a small cost, so breaking code up to an unnecessary degree can be counter-productive. Code should be modularized to the extend that doing so increases clarity, and loading of large or expensive chunks of code fragments can be significantly deferred.

Defer everything that you can

Most extensions have a load event listener in the main overlay that runs their startup functions. Do as little as possible here. The browser window is blocked while your add-on's load handler runs, so the more it does, the slower Firefox will appear to the user.

If there is anything that can be done even a fraction of a second later, you can use an nsITimer or the window.setTimeout() method to schedule that work for later.  Even a short delay can have a big impact.

Astuces de performances générales

Evitez de créer des fuites de mémoires

Memory leaks require the garbage collector and the cycle collector to work harder, which can significantly degrade performance.

Zombie compartments are a particular kind of memory leak that you can detect with minimal effort.  See the Zombie compartments page, especially the Proactive checking of add-ons section.

See Common causes of memory leaks in extensions for ways to avoid zombie compartments and other kinds of leaks.

As well as looking for these specific kinds of leaks, it's worth exercising your extension's functionality and checking the contents of about:memory for any excessive memory usage.  For example, bug 719601 featured a "System Principal" JavaScript compartment containing 100s of MBs of memory, which is much larger than usual.

Evitez d'écrire des CSS lents

  • Lire le guide "writing efficient CSS".
  • Remember that any selector in your rule which might match many different nodes is a source of inefficiency during either selector matching or dynamic update processing. This is especially bad for the latter if the selector can dynamically start or stop matching. Avoid unqualified ":hover" like the plague.

Avoid DOM mutation event listeners

DOM mutation event listeners are extremely expensive and, once added to a document even briefly, significantly harm its performance. As mutation events are officially deprecated, and there are many alternatives, they should be avoided at all costs.

Lazily load services

The XPCOMUtils JavaScript module provides two methods for lazily loading things:

  • defineLazyGetter() défini une fonction sur un objet spécifié qui agit comme un getter la première fois qu'il sera utilisé. See examples.
  • defineLazyServiceGetter() défini une fonction sur un objet spécifié qui agit comme un getter pour un service. The service isn't obtained until the first time it's used. Look through the source for examples.

Beaucoup de services commun sont dàja en cache dans Services.jsm.

Utilisez les E/S asynchrones

Ne jamais faire E/S synchrone dans le thread principal.

N'importe quelle sorte d'E/S dans le thread principal, qu'elle soit sur un disque ou sur le réseau, peuvent provoquez de sérieux problème de ralentissement de l'interface utilisateur.

  • Ne jamais utiliser de XMLHttpRequests synchrone.
  • NetUtils.jsm fournis des helpers pour la lecture et la copies de fichier asynchrone.
  • Ne jamais accèder à une base de donnée SQLite de manière synchrone. Utilisez l'asynchronous API à la place.
  • Effectuer des opérations séquentielles, asynchrone peuvent être grandement simplifier en utilisant Promises.

Evitez les évenements de mouvement de la souris

Evitez d'utiliser les évenements de mouvement de la souris, tel que mouseover, mouseout, mouseenter, mouseexit, et plus spécialement mousemove. Ces évenements se déclenchent à haute fréquence, par conséquent leurs écouteurs d'évenements peuvent facilement provoquer une surcharge CPU.

Quand ces évenements ne peuvent être évités, computation during the listeners should be kept to a minimum and real work throttled. Ces évenements doivent être ajoutés sur des éléments les plus spécifiques possible, et supprimé immédiatement lorsqu'il ne sont plus nécessaires.

Evitez les images animées

Animated images are much more expensive than generally expected, especially when used in XUL tree elements..

Considérez l'utilisation des Chrome Workers

Vous pouvez utiliser ChromeWorker pour executer de longues tâches ou du traitement de données.

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : ArakNoPhob
 Dernière mise à jour par : ArakNoPhob,