Améliorer les performances des applications en réduisant l’utilisation de la mémoire et de l’espace disque

Ce guide montre comment améliorer les performances de votre application Windows de deux manières principales :

Optimiser l’utilisation de la mémoire

Il existe différentes façons de réduire la quantité de mémoire utilisée par votre application Windows, vous pouvez :

  • Réduisez l’utilisation de la mémoire de premier plan.
  • Minimisez le travail en arrière-plan.
  • Libérez les ressources en arrière-plan.
  • Assurez-vous que votre application ne présente pas de fuite de mémoire.

Pour réduire correctement l’utilisation de la mémoire, il est tout d’abord important de comprendre :

Une fois que vous avez une trace système à analyser, nous vous recommandons d’appliquer votre analyse de trace pour réduire l’utilisation de la mémoire.

Ensemble de travail, mémoire dynamique et allocation virtuelle

L’ensemble de travail d’une application ( l’ensemble de pages dans son espace d’adressage virtuel qui réside actuellement en mémoire) est une mesure de l’utilisation de la mémoire de l’application.

La quantité de mémoire utilisée par une application a un impact sur ses performances d’exécution, ainsi que la réactivité du système dans son ensemble. La réduction de l’utilisation de la mémoire permet à l’application de s’améliorer en réduisant les coûts du processeur associés à l’accès à plus de mémoire. La réduction de l’utilisation de la mémoire aide également à la réactivité du système et à l’expérience de l’utilisateur de l’application en général, car l’application ne finit pas par déplacer d’autres contenus de mémoire.

Le déplacement de la mémoire peut se produire lorsque le système tente de conserver le contenu en mémoire récemment accessible et, si nécessaire, supprime et supprime le contenu utilisé précédemment. Lorsque l’utilisateur revient à l’interpréteur de commandes ou à une autre application et que les données nécessaires ne résident pas en mémoire, les données doivent être lues à partir du disque. L’utilisateur remarquera probablement un ralentissement en raison de ce processus.

Il existe deux éléments clés à la mémoire utilisée par une application : 1) mémoire dynamique et 2) mémoire sauvegardée par les fichiers. L’utilisation de la mémoire sauvegardée par fichier provient de fichiers binaires et de fichiers de données, tels que des bases de données, utilisées par une application. Il ne s’agit généralement pas d’un segment significatif de l’utilisation de la mémoire d’une application et souvent d’une constante. (Les exceptions seraient des applications de traitement de données, la compilation de code, etc.) La source la plus importante de l’utilisation de la mémoire et où le manifeste des fuites est de la mémoire dynamique.

La mémoire dynamique correspond à la mémoire virtuelle allouée par une application à l’aide de routines d’allocation de mémoire. Contrairement à la mémoire sauvegardée par fichier, qui persiste entre les redémarrages du système, la mémoire dynamique existe uniquement pendant la durée de vie de l’application. La mémoire dynamique est une source fréquemment importante d’utilisation de la mémoire et où la mémoire fuit le manifeste.

Les routines d’allocation virtuelle (VirtualAlloc) gèrent les demandes d’allocation de mémoire d’une application Windows indépendamment de la routine de couche application utilisée pour l’allocation de mémoire. Bien que toutes les mémoires allouées par une application ne résident pas dans la mémoire tout le temps, l’analyse de ces allocations offre un moyen cohérent de comprendre l’utilisation de la mémoire d’une application.

Pour comprendre l’utilisation de la mémoire de votre application et trouver des emplacements pour apporter des améliorations, nous vous recommandons de capturer une trace VirtualAllocation, comme décrit ci-dessous.

Capturer une trace système pour analyser l’utilisation de la mémoire

L’enregistrement de l’activité de l’appareil sur une période donnée est appelé suivi du système. Le suivi du système produit un fichier de trace qui peut être utilisé pour générer un rapport et vous aider à identifier comment améliorer les performances de votre application.

Les traces peuvent varier en longueur :

  • Vous pouvez utiliser une trace en cours d’exécution pour capturer le lancement d’une application. Cela peut inclure la transition de votre application vers l’état inactif, où la fenêtre de l’application est réduite ou les fenêtres d’application sont fermées pendant que le processus de l’application persiste.
  • Une trace longue, généralement plusieurs minutes dans la durée, est utile pour diagnostiquer les fuites de mémoire. Si l’utilisation de la mémoire continue de s’accélérer au fil du temps, il s’agit généralement d’une fuite suggérée.

Il existe plusieurs outils disponibles pour surveiller l’utilisation de la mémoire, notamment :

Dans le cadre de cet article, nous allons nous concentrer sur l’utilisation de Windows Analyseur de performances. Pour en savoir plus sur le choix d’un outil permettant de profiler les performances de votre application, consultez Choix entre Visual Studio Performance Profiler, Windows Performance Shared Computer Toolkit et PerfView.

Exécutez une capture de trace

  1. Ouvrez une ligne de commande (PowerShell ou Invite de commandes) en mode administrateur. (S’il n’est pas exécuté en mode administrateur, vous pouvez recevoir le code d'erreur : 0xc5585011, « Échec de l’activation de la stratégie pour profiler les performances du système »).

  2. Entrez la commande : wpr -start VirtualAllocation -filemode

  3. Exécutez le scénario que vous examinez. (Lancement de votre application, par exemple.)

  4. Entrez la commande : wpr -stop Trace.etl

Analyser la trace NetMon

Pour déterminer quelles fonctions de votre application ont alloué de la mémoire que vous pouvez réduire, vous devez maintenant analyser la trace système capturée. Pour analyser la trace :

  1. Ouvrez la trace à l’aide de Windows Analyseur de performances, en entrant la commande :wpa.exe Trace.etl

  2. Dans la fenêtre Explorateur de graphiques, développez la section Mémoire, cliquez avec le bouton droit sur le graphique Validation totale, puis sélectionnez Ajouter un graphique en mode Nouvelle analyse.

  3. Ouvrez l’Éditeur de vue en cliquant sur l’engrenage Paramètres et en sélectionnant la disposition de colonne suivante : Processus, Type de validation, Pile de validation et Taille.

  4. Cliquez sur l’en-tête de colonne Taille afin que les résultats soient triés dans l’ordre décroissant. La pile de validation affiche le chemin du code menant à l’allocation de la mémoire. Ces résultats peuvent aider à comprendre la raison de l’allocation. Le tri par taille vous permet de vous concentrer sur les allocations plus importantes et d’examiner s’il existe une possibilité d’optimiser.

  5. Filtrez sur le ou les processus qui vous intéressent en cliquant avec le bouton droit sur le processus et en sélectionnant Filtrer vers la sélection.

  6. Pour effectuer un zoom avant sur votre région d’intérêt dans la fenêtre d’affichage, sélectionnez une plage, cliquez avec le bouton droit sur le graphique, puis sélectionnez Zoom.

  7. Parcourez la pile de validation pour comprendre les fonctions qui ont alloué de la mémoire. Les piles de validation ont besoin de symboles chargés. Pour charger des symboles, sélectionnez Symboles>de chargement de trace dans la barre de menus de navigation supérieure.

    Capture d’écran de trace de mémoire windows Analyseur de performances

Application de votre analyse de trace pour réduire l’utilisation de la mémoire

Lors de l’analyse de la mémoire allouée, vous trouverez des indices pour vous aider à déterminer où l’utilisation de la mémoire peut être réduite.

Voici quelques domaines à prendre en compte en ce qui concerne l’application de votre analyse de trace à la mise à jour de votre code pour réduire l’utilisation de la mémoire, notamment :

  • Réduire l’utilisation de la mémoire au premier plan : l’analyse de la trace de mémoire peut vous aider à identifier toute utilisation inutile de la mémoire au premier plan et à mettre à jour votre code pour réduire ou supprimer cette utilisation.

  • Réduction du travail en arrière-plan : le système a des stratégies pour vieillir les pages des ensembles de travail de processus. L’utilisation de moins de mémoire en arrière-plan permet au système d’être plus efficace en conservant moins de mémoire de l’application. Apprenez-en davantage sur l’amélioration de la consommation d’énergie et de la durée de vie de la batterie en minimisant le travail en arrière-plan, ce qui se traduit également par une utilisation moins importante de la mémoire en arrière-plan.

  • Libérer des ressources en arrière-plan : au moment de l’exécution, une application peut créer des caches de mémoire, ainsi que créer des allocations graphiques pour prendre en charge son interface utilisateur. Ces allocations peuvent être libérées lorsque l’application est réduite ou non visible. Une application peut s’inscrire à des notifications à mémoire faible pour effectuer de telles actions, mais une meilleure stratégie peut être de libérer de la mémoire après une période de non-utilisation, lorsque l’application conclut qu’elle est inactive. Cette période de désutilisance peut varier selon l’application, de sorte que les indicateurs possibles d’utilisation inactive peuvent passer d’une poignée de minutes à une heure ou plus. Veillez à équilibrer ce type d’économies de mémoire avec la réactivité. Si un cache est coûteux à reconstruire, l’application peut choisir de la conserver pendant toute la durée de vie de l’application.

  • Assurez-vous que votre application ne fuit pas la mémoire : pour case activée pour les fuites de mémoire, commencez par établir un benchmark d’état stable, où l’utilisation de la mémoire de l’application est plateaux ou ne dépasse pas une certaine valeur. Vous pouvez établir cet état stable en utilisant en permanence l’application ou en la laissant inactive en arrière-plan. À l’aide de la trace que vous avez capturée pour identifier une fuite de mémoire possible, vous pouvez trouver où cette mémoire est allouée dans votre code et comment elle peut être libérée de son utilisation une fois qu’elle a servi son objectif. Si la mémoire continue de croître à mesure que l’application est en cours d’exécution, il s’agit probablement d’une fuite de mémoire. Effectuez un zoom avant sur la région correspondant à la croissance au sein de votre trace et analysez soigneusement les piles de validation.

Utiliser efficacement l’espace disque

L’empreinte disque fait référence à la taille d’une application lorsqu’elle est stockée dans un état inactif (pas d’exécution de code). Si l’application occupe un grand nombre d’empreintes disque, il peut être une opportunité d’optimiser.

Il existe plusieurs façons de réduire l’encombrement disque de votre application pour améliorer les performances :

  • À mesure qu’un disque est plein, le système de fichiers ne peut plus stocker de nouveau contenu de manière contiguë. Un disque complet devient fragmenté, stockant un nouveau contenu sur des secteurs non contigus. Cela se traduit par un temps de latence plus long lorsque ce contenu est accessible à partir du disque. Les systèmes d’E/S fournissent un débit de disque beaucoup plus élevé lorsque le contenu est contigu et qu’ils sont accessibles de manière séquentielle ou à l’aide d’E/S plus volumineuses.

  • Un disque complet peut se traduire par des latences d’écriture plus longues pour les systèmes SSD. Lorsqu’il existe moins de cellules vides pour absorber les écritures, une écriture peut entraîner une opération de lecture-modification-écriture, ce qui ralentit les performances.

  • Un disque complet peut entraver la possibilité de mettre à jour votre application. Bien que le système d’exploitation soit résilient et capable de maintenir le système à jour et sécurisé, même avec un espace disque disponible faible, une quantité saine d’espace disque disponible pour la mise en lots du contenu de votre mise à jour d’application se traduit par une expérience de mise à jour plus rapide et plus fluide.

  • L’utilisation d’une quantité importante d’empreinte disque importante à accéder au moment de l’exécution se traduit également par l’utilisation de la mémoire. Cela aura un impact sur la réactivité de votre application et du système en général. En outre, si une faible proportion de l’empreinte disque est requise au moment de l’exécution, l’application peut utiliser l’espace disque de manière inefficace.

Voici quelques façons de réduire ou d’être plus efficace avec votre espace disque :

  • Appliquez les principes de « paiement à l’utilisation » à votre empreinte disque (téléchargez uniquement ce dont vous avez besoin) : une application peut inclure un large éventail de fonctionnalités qui ne s’appliquent pas à tous les utilisateurs. Il peut s’agir d’une raison pour une grande empreinte sur disque. En appliquant des principes de « paiement à l’utilisation », vous pouvez demander aux utilisateurs de sélectionner uniquement pour télécharger les fonctionnalités dont ils ont besoin, en se déplaçant vers un encombrement disque plus petit lorsqu’ils téléchargent votre application. Le contenu supplémentaire est facultatif pour le téléchargement uniquement lorsque l’utilisateur a besoin de fonctionnalités plus riches. En plus des fonctionnalités, vous pouvez appliquer les mêmes principes de « paiement à jouer » à la prise en charge linguistique. L’application peut inclure un sous-ensemble de choix linguistiques populaires par défaut, avec des langues supplémentaires éventuellement incluses ou dépendantes de l’emplacement défini sur le système de l’utilisateur.

  • Appliquer un dimensionnement efficace du cache : dans certains cas, une application peut utiliser des caches sur disque pour rendre l’expérience utilisateur plus réactive. Les stratégies peuvent être définies pour la façon dont votre application gère le cache, avec une limite supérieure définie sur la taille du cache en fonction de la capacité du disque et le redimensionnement du cache lorsque l’espace disponible sur le disque est faible.

  • Appliquer une utilisation efficace des ressources : une application inclut souvent des ressources d’image et peut être constituée d’une plage de tailles d’image pour prendre en charge plusieurs résolutions. L’optimisation de la taille, des dimensions, du format et de la compression d’un sous-ensemble de résolutions et l’utilisation de la mise à l’échelle pour prendre en charge les résolutions restantes peuvent réduire considérablement l’encombrement du disque.

  • Examinez les opportunités d’optimisation binaire : les outils, tels que SizeBench, permettent aux auteurs d’applications d’examiner ce qui contribue à l’empreinte binaire et de trouver des opportunités pour réduire la quantité d’espace disque utilisé.

Ressources supplémentaires