Verbessern Sie die App-Leistung, indem Sie die Nutzung von Speicher und Speicherplatz auf dem Datenträger reduzieren.

In diesem Handbuch wird gezeigt, wie Sie die Leistung Ihrer Windows-Anwendung auf zwei primäre Arten verbessern:

Minimierung der Arbeitsspeicherauslastung

Es gibt eine Vielzahl von Möglichkeiten, um den von Ihrer Windows-App benötigten Arbeitsspeicher zu minimieren, sie haben folgende Möglichkeiten:

  • Verringern Sie die Speicherauslastung im Vordergrund.
  • Minimieren Sie Hintergrundarbeiten.
  • Freigabe von Ressourcen im Hintergrund
  • Stellen Sie sicher, dass Ihre Anwendung keine Arbeitsspeicherverluste hat.

Um die Speicherauslastung entsprechend zu minimieren, ist es zunächst wichtig. Folgendes zu verstehen:

Sobald Sie eine zu analysierende Systemablaufverfolgung haben, empfehlen wir einen Leitfaden zum Anwenden Ihrer Ablaufverfolgungsanalyse, um die Speicherauslastung zu verringern.

Arbeitssatz, dynamischer Arbeitsspeicher und virtuelle Zuteilung

Der Arbeitssatz einer Anwendung – der Satz von Seiten im virtuellen Adressbereich, der sich derzeit im Arbeitsspeicher befindet – ist ein Maß für die Speicherauslastung der App.

Die Speichermenge, die eine Anwendung verwendet, wirkt sich auf ihre Laufzeitleistung sowie auf die Reaktionsfähigkeit des Systems insgesamt aus. Die Minimierung der Speichernutzung trägt dazu bei, dass die App besser ausgeführt wird, indem die CPU-Belastungen reduziert werden, die mit dem Zugriff auf mehr Arbeitsspeicher verbunden sind. Eine geringere Speicherauslastung hilft auch bei der Reaktionsfähigkeit des Systems und der Benutzerfreundlichkeit der App im Allgemeinen, da die Anwendung nicht dazu führt, dass andere Speicherinhalte verdrängt werden.

Es kann zu einer Speicherverschiebung kommen, da das System versucht, kürzlich aufgerufene Inhalte im Speicher zu behalten und, falls erforderlich, früher verwendete Inhalte zu trimmen und auszulagern. Wenn der Benutzer zurück zur Shell oder zu einer anderen Anwendung wechselt und die erforderlichen Daten nicht im Arbeitsspeicher vorhanden sind, müssen die Daten vom Datenträger gelesen werden. Der Benutzer wird aufgrund dieses Prozesses wahrscheinlich eine Verlangsamung bemerken.

Es gibt zwei Schlüsselelemente für den von einer Anwendung verwendeten Arbeitsspeicher: 1) dynamischer Speicher und 2) dateigesicherter Speicher. Die dateigesicherte Speicherauslastung stammt aus Binärdateien und Datendateien, z.B. Datenbanken, die von einer Anwendung verwendet werden. Dies ist in der Regel kein erheblicher Teil der Speicherauslastung einer Anwendung und häufig eine Konstante. (Ausnahmen wären Datenverarbeitungsanwendungen, Codekompilierung usw.) Die wichtigere Quelle der Speicherauslastung und wo das Speichermanifest dynamischer Speicher ist.

Dynamischer Arbeitsspeicher entspricht dem virtuellen Arbeitsspeicher, der von einer Anwendung mithilfe von Speicherzuordnungsroutinen zugewiesen wird. Im Gegensatz zum dateigesicherten Speicher, der über Systemneustarts hinweg beibehalten wird, ist der dynamische Speicher nur für die Lebensdauer der Anwendung vorhanden. Der dynamische Arbeitsspeicher ist in der Regel eine wichtige Quelle für die Speicherauslastung und für die Entstehung von Arbeitsspeicherverlusten.

Virtuelle Zuteilungsroutinen (VirtualAlloc) behandeln Speicherzordnungsanforderungen von einer Windows-Anwendung unabhängig von der Routine der Anwendungsebene, die für die Speicherzuordnung verwendet wird. Auch wenn sich nicht der gesamte von einer Anwendung zugeordnete Speicher ständig im Arbeitsspeicher befindet, bietet die Analyse solcher Zuordnungen eine konsistente Methode, um die Speicherauslastung einer Anwendung zu verstehen.

Um die Speicherauslastung Ihrer Anwendung zu verstehen und Orte zu finden, an denen Verbesserungen vorgenommen werden können, empfehlen wir, eine VirtualAllocation-Ablaufverfolgung wie unten beschrieben zu erfassen.

Erfassen einer Systemablaufverfolgung zur Analyse der Speicherauslastung

Die Aufzeichnung von Geräteaktivitäten über einen bestimmten Zeitraum wird als Systemablaufverfolgung bezeichnet. Die Systemablaufverfolgung erzeugt eine Ablaufverfolgungsdatei, die verwendet werden kann, um einen Bericht zu generieren und Ihnen zu helfen, die Leistung Ihrer App zu verbessern.

Ablaufverfolgungen können in der Länge variieren:

  • Eine kurze Ablaufverfolgung kann verwendet werden, um den Start einer Anwendung zu erfassen. Dies kann den Übergang Ihrer App in den inaktiven Zustand umfassen, in dem das Anwendungsfenster minimiert wird oder das Anwendungsfenster geschlossen wird, während der Anwendungsprozess beibehalten wird.
  • Eine lange Ablaufverfolgung, in der Regel mehrere Minuten in der Dauer, ist bei der Diagnose von Arbeitsspeicherverlust nützlich. Wenn die Speicherauslastung im Laufe der Zeit weiter ansteigt, ist dies in der Regel ein Hinweis auf einen Arbeitsspeicherverlust.

Es stehen mehrere Tools zur Überwachung der Speicherauslastung zur Verfügung, darunter:

Im Rahmen dieses Artikels konzentrieren wir uns auf die Verwendung des Windows Performance Analyzer. Wenn Sie mehr über die Auswahl eines Tools zur Erstellung eines Leistungsprofils für Ihre Anwendung erfahren möchten, lesen Sie den Abschnitt Auswahl zwischen Visual Studio Performance Profiler, Windows Performance Toolkit und PerfView.

Erfassen einer Ablaufverfolgung:

  1. Öffnen Sie eine Befehlszeile (PowerShell oder Eingabeaufforderung) im Administratormodus. (Wenn Sie dies nicht im Administratormodus ausführen, erhalten Sie möglicherweise den Fehlercode: 0xc5585011, „Die Richtlinie zur Erstellung eines Leistungsprofils für das System konnte nicht aktiviert werden“)

  2. Geben Sie den Befehl wpr -start VirtualAllocation -filemode ein.

  3. Führen Sie das Szenario aus, das Sie untersuchen. (Beispiel: Starten der Anwendung.)

  4. Geben Sie den Befehl wpr -stop Trace.etl ein.

Analysieren der System-Ablaufverfolgung

Um herauszufinden, welchen Funktionen Ihrer Anwendung Arbeitsspeicher zugewiesen wurde, den Sie möglicherweise reduzieren können, müssen Sie nun die aufgezeichnete System-Ablaufverfolgung analysieren. Um die Ablaufverfolgung zu analysieren:

  1. Öffnen Sie die Ablaufverfolgung mit Windows Performance Analyzer und geben Sie den Befehl wpa.exe Trace.etl ein.

  2. Erweitern Sie im Fenster Graph-Explorer den Abschnitt Arbeitsspeicher, klicken Sie mit der rechten Maustaste auf das Diagramm Gesamtergebnis Commit, und wählen Sie Diagramm zur neuen Analyseansicht hinzufügen aus.

  3. Öffnen Sie den Ansichtseditor, indem Sie auf das Zahnrad -Symbol für dieEinstellungen klicken und die folgende Spaltenanordnung wählen: Prozess, Commit-Typ, Commit-Stapel und Größe.

  4. Klicken Sie auf die Spaltenüberschrift Größe, damit die Ergebnisse in absteigender Reihenfolge sortiert werden. Der Commit-Stapel zeigt den Codepfad an, der zum zugewiesenen Speicher führt. Diese Ergebnisse können dazu beitragen, den Grund für die Zuweisung zu verstehen. Das Sortieren nach Größe ermöglicht es Ihnen, sich auf die größeren Zuordnungen zu konzentrieren und zu untersuchen, ob es eine Möglichkeit zur Optimierung gibt.

  5. Filtern Sie nach den Prozessen, die Sie analysieren möchten, indem Sie mit der rechten Maustaste auf den Prozess klicken und Nach Auswahl filtern auswählen.

  6. Um den Bereich, der Sie interessiert, im Anzeigebereich zu vergrößern, wählen Sie einen Bereich aus, klicken mit der rechten Maustaste auf das Diagramm und wählen Zoom.

  7. Navigieren Sie durch den Commit-Stapel, um zu verstehen, welchen Funktionen Arbeitsspeicher zugewiesen wurde. Commit-Stapel benötigen geladene Symbole. Wählen Sie zum Laden von Symbolen die Option Geladene>Symbole finden im oberen Navigationsmenü aus.

    Screenshot der Windows Leistungsanalyse Speicherablaufverfolgung

Anwenden der Ablaufverfolgungsanalyse, um die Speicherauslastung zu verringern

Bei der Analyse des zugewiesenen Arbeitsspeichers finden Sie Hinweise, die Ihnen helfen, zu entscheiden, wo die Speicherauslastung minimiert werden kann.

Einige Bereiche, die Sie berücksichtigen sollten, um Ihre Ablaufverfolgungsanalyse auf die Aktualisierung Ihres Codes anzuwenden, um die Speicherauslastung zu reduzieren, umfassen:

  • Verringern der Speicherauslastung im Vordergrund: Die Analyse der Speicherablaufverfolgung kann Ihnen helfen, unnötige Arbeitsspeichernutzung im Vordergrund zu identifizieren und den Code so zu aktualisieren, dass diese Verwendung reduziert oder entfernt wird.

  • Minimieren der Arbeit im Hintergrund: Das System verfügt über Richtlinien, um Seiten aus den Prozess-Arbeitssätzen zu löschen. Durch die Verwendung von weniger Speicher im Hintergrund kann das System effizienter arbeiten, da weniger Speicher für die Anwendung reserviert bleibt. Erfahren Sie mehr darüber, wie Sie den Stromverbrauch und die Akkulaufzeit verbessern, indem Sie die Hintergrundarbeit minimieren, was sich auch in weniger Arbeitsspeichernutzung im Hintergrund übersetzt.

  • Freigeben von Ressourcen im Hintergrund: Zur Laufzeit kann eine Anwendung einige Speicher-Caches sowie Grafikzuweisungen zur Unterstützung ihrer Benutzeroberfläche erstellen. Diese Zuteilungen können möglicherweise freigegeben werden, wenn die Anwendung minimiert oder nicht sichtbar ist. Eine Anwendung kann sich für Benachrichtigungen über zu wenig Speicher registrieren lassen, um solche Maßnahmen zu ergreifen. Eine bessere Strategie ist es jedoch, den Speicher nach einer gewissen Zeit der Nichtbenutzung freizugeben, wenn die Anwendung zu dem Schluss kommt, dass sie inaktiv ist. Dieser Zeitraum der Nichtnutzung kann je nach Anwendung variieren, sodass mögliche Indikatoren für inaktive Verwendung von einer Handvoll Minuten bis zu einer ½ Stunde oder mehr reichen können. Es sollte darauf geachtet werden, diese Art von Speichereinsparungen mit Reaktionsfähigkeit auszugleichen. Wenn es aufwendig ist, einen Cache wiederherzustellen, kann die Anwendung entscheiden, ihn für die gesamte Lebensdauer der Anwendung beizubehalten.

  • Stellen Sie sicher, dass Ihre Anwendung keine Arbeitsspeicherverluste aufweist: Um zu prüfen, ob Arbeitsspeicherverluste vorhanden sind, führen Sie zunächst einen Steady-State-Benchmark durch, bei dem die Speicherauslastung der Anwendung nicht über einen bestimmten Wert hinauswächst. Sie können diesen Dauerzustand erreichen, indem Sie die Anwendung kontinuierlich nutzen oder sie im Hintergrund ruhen lassen. Anhand der Ablaufverfolgung, die Sie zur Identifizierung eines möglichen Speicherlecks erstellt haben, können Sie herausfinden, wo dieser Speicher in Ihrem Code zugewiesen wird und wie er wieder freigegeben werden kann, nachdem er seinen Zweck erfüllt hat. Wenn der Speicher während der Ausführung der Anwendung weiter wächst, ist dies ein wahrscheinlicher Hinweis auf einen Arbeitsspeicherverlust. Zoomen Sie auf den Bereich, der dem Anstieg in Ihrer Ablaufverfolgung entspricht, und analysieren Sie die Commit-Stapel sorgfältig.

Effizientes Verwenden von Speicherplatz auf dem Datenträger

Der Datenträger-Speicherbedarf bezieht sich auf die Größe einer Anwendung, wenn sie in einem inaktiven Zustand gespeichert ist (nicht ausgeführter Code). Wenn die Anwendung viel Speicherkapazität auf dem Datenträger beansprucht, kann dies eine Gelegenheit zur Optimierung sein.

Es gibt mehrere Möglichkeiten, um den Datenträger-Speicherbedarf Ihrer App zu verringern, um die Leistung zu verbessern:

  • Wenn ein Datenträger voll wird, kann das Dateisystem neue Inhalte nicht mehr zusammenhängend speichern. Ein voller Datenträger wird fragmentiert und speichert neue Inhalte in nicht zusammenhängenden Sektoren. Dies führt zu einer längeren Wartezeit, wenn der Datenträger auf diesen Inhalt zugreift. IO-Systeme bieten einen viel besseren Datenträgerdurchsatz, wenn der Inhalt zusammenhängend ist und der Zugriff sequentiell oder über größere IOs erfolgen kann.

  • Ein voller Datenträger kann bei SSD-basierten Systemen zu längeren Wartezeiten beim Schreiben führen. Wenn es weniger leere Zellen gibt, die Schreibvorgänge aufnehmen können, kann ein Schreibvorgang eine Lese-Änderung-Schreib-Operation nach sich ziehen, was die Leistung verlangsamt.

  • Ein voller Datenträger kann die Möglichkeit zum Aktualisieren der Anwendung behindern. Das Betriebssystem ist zwar widerstandsfähig und in der Lage, das System auch bei geringem verfügbarem Speicherplatz auf dem neuesten Stand und sicher zu halten, aber eine gesunde Menge an verfügbarem Speicherplatz für die Bereitstellung der Inhalte für Ihre App-Aktualisierung führt zu einem schnelleren und reibungsloseren Update-Erlebnis.

  • Wenn zur Laufzeit ein erheblicher Teil eines großen Datenträger-Speicherbedarfs aufgerufen werden muss, bedeutet dies auch einen erhöhten Speicherbedarf. Dies wirkt sich auf die Reaktionsfähigkeit Ihrer Anwendung und des Systems im Allgemeinen aus. Wenn außerdem nur ein kleiner Teil des Datenträger-Speicherbedarfs zur Laufzeit benötigt wird, kann es sein, dass die Anwendung den Speicherplatz nicht effizient nutzt.

Einige Möglichkeiten zum Verringern oder Effizienteren Verwenden des Datenträger-Speicherplatzes umfassen:

  • Wenden Sie „Pay-for-Play“-Prinzipien auf Ihren Datenträger-Speicherbedarf an (laden Sie nur das, was Sie benötigen): Eine Anwendung kann eine breite Palette von Features enthalten, bei denen nicht alle Features für alle Benutzer gelten. Dies kann ein Grund für einen großen Speicherbedarf auf dem Datenträger sein. Durch die Anwendung des „Pay-for-Play“-Prinzips können Sie die Benutzer auffordern, nur die Funktionen herunterzuladen, die sie benötigen, was zu einem geringeren Datenträger-Speicherbedarf führt, wenn sie Ihre App herunterladen. Zusätzliche Inhalte werden nur dann optional zum Download angeboten, wenn der Benutzer umfangreichere Funktionen benötigt. Zusätzlich zu Features können Sie die gleichen „Pay-for-Play“-Prinzipien auf die Sprachunterstützung anwenden. Die Anwendung kann standardmäßig eine Teilmenge der gängigen Sprachen enthalten, wobei zusätzliche Sprachen optional oder abhängig von der auf dem System des Benutzers eingestellten Region enthalten sein können.

  • Anwendung einer effizienten Cache-Größe: In einigen Fällen kann eine Anwendung Datenträgercaches On-Disk verwenden, um die Benutzerfreundlichkeit zu steigern. Sie können Richtlinien dafür festlegen, wie Ihre Anwendung den Cache verwaltet, indem Sie eine Obergrenze für die Cache-Größe auf der Grundlage der Datenträgerkapazität festlegen und die Größe des Cache anpassen, wenn der verfügbare Speicherplatz auf dem Datenträger gering ist.

  • Effiziente Verwendung von Ressourcen anwenden: Eine Anwendung enthält oft Bildmaterial und kann aus einer Reihe von Bildgrößen bestehen, um mehrere Auflösungen zu unterstützen. Die Optimierung der Bildgröße, der Abmessungen, des Formats und der Komprimierung für eine Teilmenge der Auflösungen und die Nutzung der Skalierung zur Unterstützung der verbleibenden Auflösungen kann den Speicherplatzbedarf erheblich reduzieren.

  • Untersuchen sie binäre Optimierungsmöglichkeiten: Mit Tools wie SizeBench geben den Autoren von Anwendungen die Möglichkeit zu untersuchen, was zum binären Speicherbedarf beiträgt, und herauszufinden, wie sie den belegten Speicherplatz reduzieren können.

Zusätzliche Ressourcen