Gewusst wie: Verbessern der Leistung

Aktualisiert: November 2007

Mit den folgenden Programmiertechniken können Sie Speicherplatz sparen und die Leistung von Geräteanwendungen verbessern.

So sparen Sie bei der Arbeit mit Windows Forms und Grafiken Arbeitsspeicher

So sparen Sie Arbeitsspeicher bei Daten und Zeichenfolgen

  • Verwenden Sie in for-Schleifen anstelle von Objektvariablen ganzzahlige Variablen (Int32 oder Int64).

  • Vermeiden Sie die Verwendung der ToString-Methode einer Enumeration. Diese Methode beeinträchtigt die Anwendungsleistung, da Metadatentabellen durchsucht werden.

  • Vermeiden Sie OutOfMemoryException-Fehler. Diese Ausnahme kann von der Common Language Runtime ausgelöst werden, wenn nicht mehr genügend Speicher für die Zuordnung zu internen Prozessen oder neuen Objektinstanzen zur Verfügung steht. Um diese Ausnahme zu vermeiden, programmieren Sie keine umfangreichen Methoden, die 64 KB Speicher oder mehr beanspruchen.

  • Entfernen Sie die Datei System.SR.dll, die Fehlermeldungszeichenfolgen für Ausnahmedialogfelder enthält. Sie können die Anwendung ohne diese Datei bereitstellen und sparen so Arbeitsspeicher. .NET Compact Framework lädt Fehlerzeichenfolgen, die in der Datei System.SR.dll enthalten sind, dynamisch, wenn die Datei vorhanden ist.

    Ist diese DLL-Datei nicht auf dem Gerät vorhanden, enthalten alle Ausnahmen die Meldung, dass die Assembly für die Ressource nicht geladen werden kann. Während der Entwicklung empfiehlt es sich jedoch, dem Visual Studio-Projekt einen Verweis auf die Datei System.SR.dll hinzuzufügen, damit aussagekräftige Ausnahmen angezeigt werden.

  • Zeichenfolgen sind unveränderlich, sodass jedes Mal ein neues String-Objekt erstellt wird, wenn Sie die Zeichenfolge ändern. Erwägen Sie die Verwendung eines StringBuilder, wenn Sie eine Zeichenfolge erstellen, die häufig geändert wird.

  • Verwenden Sie die ParseExact-Methode für DateTime, wenn Sie das genaue für die DateTime-Serialisierung verwendete Format kennen. Andernfalls versucht der DateTime-Parser, mehrere kulturspezifische Formate sequenziell anzuwenden.

  • Beschränken Sie die Anzahl geöffneter SqlCeCommand-Objekte, und verwerfen Sie sie, wenn sie nicht mehr benötigt werden.

So sparen Sie Arbeitsspeicher beim Zusammenwirken mit systemeigenem Code

  • Verwenden Sie bei Plattformaufrufvorgängen blitfähige Typen, die sowohl im verwalteten als auch im nicht verwalteten Arbeitsspeicher eine gemeinsame Darstellung aufweisen, z. B. Int32 oder IntPtr. Blitfähige Werttypen, die größer als 32 Bits sind, werden schneller als Verweis übergeben denn als Wert. Weitere Informationen über blitfähige Typen finden Sie unter Blitfähige Typen in .NET Compact Framework.

  • Verwenden Sie das InAttribute-Attribut und das OutAttribute-Attribut für die Argumente in der Funktionssignatur, um unnötiges Marshalling zu reduzieren.

  • Verwenden Sie die Methoden in der Marshal-Klasse für die manuelle Konvertierung von IntPtr in verwaltete Objekten, z. B. PtrToStructure, PtrToStringBSTR, GetObjectForNativeVariant und GetObjectForIUnknown.

  • Verwenden Sie die Prelink-Methode und die PrelinkAll-Methode, um die JIT-Kompilierung des Stubs zu bewirken, der Aufrufe von verwaltetem Code durch systemeigenen Code unterstützt.

  • Wenn Sie erwarten, dass das systemeigene COM-Objekt üblicherweise S_FALSE oder andere Werte als S_OK_HRESULT zurückgibt, legen Sie das PreserveSig-Feld auf true fest, und definieren Sie die verwaltete Signatur so, dass sie mit der systemeigenen Signatur übereinstimmt. Damit wird der Mehraufwand für einen try/catch-Block vermieden, der benötigt wird, wenn die Laufzeit HRESULT-Werte aus den COM-Aufrufen in Ausnahmen übersetzt.

  • Lassen Sie bei einem Plattformaufruf möglichst viele Aufgaben abarbeiten, anstatt mehrere Aufrufe durchzuführen.

So sparen Sie Arbeitsspeicher bei Auflistungen

  • Verwenden Sie Indexer, wenn die Auflistung auf einem Array basiert.

  • Geben Sie nach Möglichkeit die Größe der Auflistung an, da dynamische Größenänderungen den überschüssigen Speicher beträchtlich erhöhen können.

  • Verwenden Sie generische Auflistungen, um Mehraufwand für das Boxing und Unboxing bei Werttypen zu vermeiden. Die beste Leistung erzielen Sie, wenn Sie Ihre eigenen optimierten Auflistungsergebnisse definieren.

So sparen Sie Arbeitsspeicher bei XML

  • Verwenden Sie XmlTextReader und XmlTextWriter statt XmlDocument, wofür mehr Arbeitsspeicher benötigt wird.

  • Geben Sie Einstellungen für XmlReaderSettings und XmlWriterSettings an, um die Leistung zu verbessern. Der IgnoreWhitespace-Eigenschaftenwert und der IgnoreComments-Eigenschaftenwert können die Leistung gegebenenfalls deutlich verbessern.

  • Verwenden Sie Zeichencodierungen für UTF-8, ASCII und UTF-16. Diese sind schneller als ANSI- und Windows-Codepagecodierungen.

  • Vermeiden Sie die Verwendung eines Schemas für die Analyse, da dieses zusätzlichen Validierungsaufwand verlangt.

  • Ordnen Sie Spalten als Attribute zu, und verwenden Sie ein typisiertes DataSet, wenn Sie ein DataSet-Formular aus einer XML-Quelle füllen.

  • Vermeiden Sie Folgendes, wenn Sie ein DataSet auffüllen:

    • Schemarückschluss

    • Geschachtelte Tabellen

    • Mehrere DateTime-Spalten. Verwenden Sie zur Leistungsverbesserung stattdessen den Ticks-Eigenschaftenwert.

  • Bei Verwendung der XML-Deserialisierung wird die Leistung durch die Einhaltung folgender Richtlinien verbessert:

    • Verwenden Sie möglichst kurze Element- und Attributnamen, da jedes Zeichen validiert werden muss.

    • Auf Attributdaten basierender XML-Code ist schneller als auf Elementdaten basierender XML-Code.

    • Verwenden Sie gegebenenfalls die XmlNodeReader.Skip-Methode.

    • Erwägen Sie eine binäre Serialisierung, wenn es vor allem auf Leistung ankommt.

  • Verwenden Sie für die XML-Serialisierung eine XmlSerializer-Instanz pro Typ, um die Suche nach Metadaten zu verkürzen.

  • Da die Serialisierung großer XML-Mengen den Arbeitsspeicher stark beanspruchen kann, erwägen Sie stattdessen die Erstellung eines benutzerdefinierten Serialisierungsmechanismus unter Verwendung von BinaryReader und BinaryWriter.

So sparen Sie Arbeitsspeicher, wenn ein Webdienst verwendet wird

  • Verwenden Sie beim Lesen und Schreiben ein DiffGram eines DataSet. Weitere Informationen finden Sie unter DiffGrams (ADO.NET).

  • Speichern Sie auf dem Gerät ein Remote-DataSet und dessen Schema als XML-Code.

  • Erstellen Sie einen einfachen Aufruf einer Webdienstmethode, der während des Begrüßungsbildschirms angezeigt wird, da der erste Aufruf langsamer ist als spätere Aufrufe.

  • Gehen Sie bei der Behandlung von Netzwerk- und Datenfehlern sorgfältig vor.

  • In bestimmten Fällen führt die manuelle Serialisierung des DataSet als XML-Zeichenfolge vor dem Ausführen eines Webdienstaufrufs zu einer Leistungsverbesserung.

So sparen Sie Arbeitsspeicher bei der erweiterten Programmierung

  • Lassen Sie umfangreiche Vorgänge asynchron verarbeiten.

  • Vermeiden Sie virtuelle Aufrufe. Die virtuellen Aufrufe der .NET Compact Framework-Laufzeit sind um etwa 30 Prozent langsamer als statische Aufrufe oder Instanzaufrufe. .NET Compact Framework verwendet aufgrund eingeschränkter Ressourcen keine vtables. Daher müssen Methoden unter Durchlaufen der Klassen- und Schnittstellenhierarchie aufgerufen werden. Dies ist ein sehr aufwändiger Vorgang. .NET Compact Framework verwaltet einen Cache aufgelöster virtueller Aufrufe, sodass Aufrufe in den meisten Fällen nicht neu interpretiert werden müssen.

  • Verwenden Sie nach Möglichkeit Felder anstelle von Eigenschaften.

  • Überschreiben Sie die GetHashCode-Methode und die Equals-Methode, wenn Sie einen Werttyp definieren. Wenn die Methoden nicht überschrieben werden, verwendet die Laufzeit verallgemeinerte Versionen dieser Methoden in der ValueType-Basisklasse.

  • Verwenden Sie die Reflektion mit Vorsicht. Die Verwendung der Reflektion für Untersuchungszwecke bei nicht instanziierten Klassen kann die Leistung der instanziierten Objekte in der Anwendung beeinträchtigen.

  • Stellen Sie sicher, dass die verwalteten Ressourcen vollqualifizierte Typnamen haben und in der RESX-Datei fehlerfrei eingetragen sind. Die Ressourcen müssen die richtige Version und die PublicKeyToken-Felder aufweisen. Der Aufwand zum Suchen des am besten geeigneten Ersatzes für einen nicht ordnungsgemäß angegebenen Typ beeinträchtigt die Leistung.

  • In bestimmten Fällen kann sich das direkte Auslesen von Anwendungsdaten aus der Datei als ausreichend und effizienter erweisen als die Verwendung von ResourceManager. Ein ResourceManager prüft unter Umständen mehrere Speicherorte im Dateisystem, um eine optimal passende Satellitenassembly zu finden, bevor die Ressourcenbinärdatei gefunden wird. Verwenden Sie entsprechende Tools für den Vorgang.

Siehe auch

Konzepte

Verwaltung des Gerätespeichers in .NET Compact Framework

Gewusst-wie-Themen für .NET Compact Framework

Weitere Ressourcen

Leistung und Diagnose in .NET Compact Framework