Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Handbuch wird gezeigt, wie Sie die Leistung Ihrer Windows-Anwendung auf zwei primäre Arten verbessern:
Minimieren der Speicherauslastung
Es gibt eine Vielzahl von Möglichkeiten, um den von Ihrer Windows-App benötigten Arbeitsspeicher zu minimieren, sie haben folgende Möglichkeiten:
- Reduzieren der Arbeitsspeicherauslastung im Vordergrund
- Minimieren der Hintergrundarbeit
- Freigeben von Ressourcen im Hintergrund
- Stellen Sie sicher, dass die Anwendung keinen Speicherverlust hat.
Um die Speicherauslastung entsprechend zu minimieren, ist es zunächst wichtig zu verstehen:
- Wie Arbeitsspeicher verwendet und zugewiesen wird, unter Verwendung des Arbeitssatzes, des dynamischen Arbeitsspeichers und der virtuellen Zuweisung,
- Wie man eine Systemverfolgung erfasst und
- wie die Systemablaufverfolgung analysiert wird.
Sobald Sie einen zu analysierenden System-Trace haben, geben wir Ihnen Empfehlungen zur Anwendung Ihrer Trace-Analyse, um die Speicherauslastung zu verringern.
Arbeitssatz, dynamischer Arbeitsspeicher und virtuelle Zuordnung
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 Menge des Arbeitsspeichers, den eine Anwendung verwendet, wirkt sich auf die Laufzeitleistung sowie die Reaktionsfähigkeit des Systems insgesamt aus. Die Minimierung des Arbeitsspeichers trägt dazu bei, dass die App besser ausgeführt wird, indem die CPU-Kosten 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.
Speicherverdrängung kann auftreten, wenn das System versucht, kürzlich abgerufene Inhalte im Speicherinhalt zu behalten und, falls erforderlich, zuvor verwendete Inhalte zu kürzen 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 speicherbasierte 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 bedeutendere Quelle der Speichernutzung und wo Speicherlecks auftreten, ist der dynamische Speicher.
Dynamischer Speicher entspricht dem virtuellen Speicher, der von einer Anwendung mithilfe von Speicherzuordnungsroutinen zugewiesen wird. Im Gegensatz zum dateigestützten Speicher, der über Systemneustarts hinweg beibehalten wird, ist der dynamische Speicher nur für die Lebensdauer der Anwendung vorhanden. Dynamischer Speicher ist häufig eine bedeutende Quelle für die Speicherauslastung und stellt den Bereich dar, in dem Speicherverluste auftreten.
Virtuelle Zuordnungsroutinen (VirtualAlloc) behandeln Speicherzuweisungsanforderungen von einer Windows-Anwendung unabhängig von der Anwendungsschichtroutine, die für die Speicherzuweisung verwendet wird. Obwohl nicht der gesamte von einer Anwendung zugewiesene Speicher in dem gesamten Speicher vorhanden sein kann, bietet die Analyse solcher Zuordnungen eine konsistente Möglichkeit, 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
Das Aufzeichnen 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.
Spuren 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 die Anwendungsfenster geschlossen werden, während der Anwendungsprozess beibehalten wird.
- Eine längere Ablaufverfolgung, die typischerweise mehrere Minuten dauert, ist bei der Diagnose von Speicherlecks nützlich. Wenn die Speicherauslastung im Laufe der Zeit weiter nach oben zeigt, ist dies in der Regel vorschlagend für ein Leck.
Es stehen mehrere Tools zur Überwachung der Speichernutzung zur Verfügung, darunter:
Im Rahmen dieses Artikels konzentrieren wir uns auf die Verwendung der Windows-Leistungsanalyse. Weitere Informationen zum Auswählen eines Tools zur Profilerstellung der Leistung Ihrer Anwendung finden Sie unter "Auswählen zwischen Visual Studio Performance Profiler, Windows Performance Toolkit und PerfView".
So erfassen Sie eine Protokollverfolgung:
Öffnen Sie eine Befehlszeile (PowerShell oder Eingabeaufforderung) im Administratormodus. (Wenn sie nicht im Administratormodus ausgeführt werden, erhalten Sie möglicherweise Fehlercode: 0xc5585011: "Fehler beim Aktivieren der Richtlinie für die Profilsystemleistung.")
Geben Sie den Befehl ein:
wpr -start VirtualAllocation -filemodeFühren Sie das Szenario aus, das Sie untersuchen. (Beispiel: Starten der Anwendung.)
Geben Sie den Befehl ein:
wpr -stop Trace.etl
Analysieren der Systemablaufverfolgung
Um zu ermitteln, welche Funktionen Ihrer App Arbeitsspeicher zugewiesen haben, den Sie möglicherweise reduzieren können, müssen Sie jetzt die erfasste Systemablaufverfolgung analysieren. So analysieren Sie die Ablaufverfolgung:
Öffnen Sie die Ablaufverfolgung mithilfe von Windows Performance Analyzer, indem Sie den Befehl eingeben:
wpa.exe Trace.etlErweitern Sie im Graph Explorer-Fenster den Abschnitt Arbeitsspeicher, klicken Sie mit der rechten Maustaste auf das Total Commit-Diagramm und wählen Sie Diagramm zur neuen Analyseansicht hinzufügen aus.
Öffnen Sie den Ansichts-Editor, indem Sie auf das Zahnrad Einstellungen klicken und die folgende Spaltenanordnung auswählen: Prozess, Commit-Typ, Commit-Stapel und Größe.
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 zugeordneten Arbeitsspeicher führt. Diese Ergebnisse können dazu beitragen, den Grund für die Zuordnung 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.
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.
Wenn Sie den Bereich des Viewports vergrößern möchten, wählen Sie einen Bereich aus, klicken Sie mit der rechten Maustaste auf das Diagramm, und wählen Sie "Zoom" aus.
Navigieren Sie durch den Commit-Stapel, um zu verstehen, welche Funktionen Arbeitsspeicher zugewiesen haben. Commit-Stacks benötigen geladene Symbole. Um Symbole zu laden, wählen Sie
Trace Symbole laden oben im Navigationsmenü aus.
Anwendung Ihrer Tracing-Analyse zur Reduzierung der Speicherauslastung
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 Sie die 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 Prozessarbeitssätzen zu löschen. Die Verwendung von weniger RAM im Hintergrund ermöglicht es dem System, effizienter zu arbeiten, indem weniger Anwendungsressourcen ständig geladen werden müssen. 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 Speichercaches erstellen sowie Grafikzuordnungen erstellen, um die Benutzeroberfläche zu unterstützen. Diese Zuordnungen können möglicherweise freigegeben werden, wenn die Anwendung minimiert oder nicht sichtbar ist. Eine Anwendung kann sich für Benachrichtigungen mit geringem Arbeitsspeicher registrieren, um eine solche Aktion zu ergreifen, aber eine bessere Strategie kann sein, Speicher nach einem Zeitraum freizugeben, der nicht verwendet wird, wenn die Anwendung beendet, 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 1/2 Stunde oder mehr reichen können. Es sollte darauf geachtet werden, diese Art von Speichereinsparungen mit Reaktionsfähigkeit auszugleichen. Wenn ein Cache teuer neu erstellt werden kann, kann die Anwendung diese für die Lebensdauer der Anwendung beibehalten.
Stellen Sie sicher, dass Ihre Anwendung keinen Speicher verliert: Um auf Speicherlecks zu überprüfen, richten Sie zuerst einen stetigen Benchmark ein, bei dem der Speicherverbrauch der Anwendung gleichbleibt oder nicht über einen bestimmten Wert hinausgeht. Sie können diesen stabilen Zustand erreichen, indem Sie die Anwendung kontinuierlich verwenden oder sie im Hintergrund inaktiv lassen. Mithilfe der erfassten Ablaufverfolgung können Sie einen möglichen Speicherverlust ermitteln, wo dieser Speicher in Ihrem Code zugewiesen wird und wie er freigegeben werden kann, nachdem er seinen Zweck erfüllt hat. Wenn der Arbeitsspeicher weiterhin größer wird, während die Anwendung ausgeführt wird, ist dies wahrscheinlich ein Hinweis auf einen Speicherverlust. Vergrößern Sie den Bereich, der dem Wachstum innerhalb Ihrer Verläufe entspricht, und analysieren Sie die Commit-Stapel sorgfältig.
Effizientes Verwenden von Speicherplatz
Der Datenträgerbedarf bezieht sich auf die Größe einer Anwendung, wenn sie in einem inaktiven Zustand gespeichert ist (nicht ausgeführter Code). Wenn die Anwendung viel Speicherplatz beansprucht, kann es eine Möglichkeit zur Optimierung sein.
Es gibt mehrere Möglichkeiten, um den Datenträgerbedarf 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 vollständiger Datenträger wird fragmentiert und speichert neue Inhalte in nicht zusammenhängenden Sektoren. Dies führt zu einer längeren Latenzzeit, wenn auf diesen Inhalt vom Datenträger zugegriffen wird. E/A-Systeme bieten einen wesentlich besseren Datenträgerdurchsatz, wenn der Inhalt zusammenhängend ist und sequenziell oder mit größeren IOs zugegriffen werden kann.
Ein vollständiger Datenträger kann zu längeren Schreiblatenzen für SSD-basierte Systeme führen. Wenn es weniger leere Zellen gibt, um Schreiboperationen zu absorbieren, kann ein Schreibvorgang einen Lese-Änderungs-Schreib-Vorgang erfordern, was die Leistung verlangsamt.
Ein vollständiger Datenträger kann die Möglichkeit zum Aktualisieren Der Anwendung behindern. Während das Betriebssystem stabil und in der Lage ist, das System auf dem neuesten Stand und sicher zu halten, auch mit geringem verfügbarem Speicherplatz, wird eine gesunde Menge verfügbarer Speicherplatz für das Staging des Inhalts für Ihr App-Update zu einer schnelleren, reibungsloseren Aktualisierungserfahrung führen.
Der Zugriff auf einen großen Datenträgerbedarf zur Laufzeit wird ebenfalls in die Speichernutzung übersetzt. Dies wirkt sich auf die Reaktionsfähigkeit Ihrer Anwendung und des Systems im Allgemeinen aus. Wenn zur Laufzeit nur ein kleiner Teil des Speicherplatzbedarfs benötigt wird, könnte die Anwendung Speicherplatz ineffizient nutzen.
Einige Möglichkeiten zum Verringern oder Effizienteren Verwenden des Speicherplatzes umfassen:
Wenden Sie "Pay-for-Play"-Prinzipien auf Ihren Datenträgerbedarf 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 Speicherplatz auf dem Datenträger sein. Wenn Sie nach dem Prinzip "Pay-for-Play" verfahren, können Sie die Benutzer auffordern, nur die Funktionen herunterzuladen, die sie benötigen. Dies führt zu einer geringeren Festplattenauslastung, wenn sie Ihre App herunterladen. Zusätzliche Inhalte stehen nur dann optional zum Download bereit, wenn der Benutzer einen Bedarf an umfangreicheren Funktionen hat. 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 beliebter Sprachauswahlen enthalten, wobei optional zusätzliche Sprachen eingeschlossen oder vom Speicherort abhängig sind, der im System des Benutzers festgelegt ist.
Effiziente Cachegröße anwenden: In einigen Fällen kann eine Anwendung Caches auf dem Datenträger verwenden, um die Reaktionsfähigkeit der Benutzer zu erhöhen. Richtlinien können festgelegt werden, wie Ihre Anwendung den Cache verwaltet, wobei eine obere Grenze für die Cachegröße basierend auf der Datenträgerkapazität festgelegt und die Größe des Caches geändert wird, wenn der verfügbare Speicherplatz auf dem Datenträger niedrig ist.
Effiziente Verwendung von Ressourcen anwenden: Eine Anwendung enthält häufig Bildressourcen und kann aus einem Bereich von Bildgröße bestehen, um mehrere Auflösungen zu unterstützen. Die Optimierung von Bildgröße, Abmessungen, Format und Komprimierung für eine Teilmenge von Auflösungen und die Nutzung der Skalierung zur Unterstützung der verbleibenden Auflösungen kann den Speicherplatz auf dem Datenträger erheblich reduzieren.
Untersuchen sie binäre Optimierungsmöglichkeiten: Tools wie SizeBench ermöglichen Anwendungsautoren, zu untersuchen, was zum binären Speicherbedarf beiträgt, und Finden von Möglichkeiten zur Reduzierung des verwendeten Speicherplatzes.
Weitere Ressourcen
Windows developer