XML vs Binärleistung für Serialisierung / Deserialisierung

8

Ich arbeite an einer kompakten Framework-Anwendung und muss die Leistung steigern. Die App funktioniert derzeit offline, indem Objekte in XML serialisiert und in einer Datenbank gespeichert werden. Mit einem Profiling-Tool konnte ich sehen, dass dies ein ziemlich großer Aufwand war, der die App verlangsamte. Ich dachte, wenn ich zu einer binären Serialisierung wechseln würde, würde die Leistung zunehmen, aber weil das im kompakten Rahmen nicht unterstützt wird, schaute ich auf protobuf-net. Die Serialisierung scheint schneller zu sein, aber die Deserialisierung ist wesentlich langsamer und die App macht mehr Deserialisierung als Serialisierung.

Sollte die binäre Serialisierung schneller sein und wenn ja, was kann ich tun, um die Leistung zu beschleunigen? Hier ist ein Ausschnitt davon, wie ich sowohl XML als auch binär verwende:

XML-Serialisierung:

%Vor%

Protobuf-net Binäre Serialisierung:

%Vor%     
Charlie 07.07.2009, 12:28
quelle

6 Antworten

5

Ich werde mich selbst korrigieren, Marc Gravall hat darauf hingewiesen, dass die erste Iteration einen Aufwand hat, das Modell zu erweitern, also habe ich einige Tests durchgeführt, die den Durchschnitt von 1000 Iterationen der Serialisierung und Deserialisierung sowohl für XML als auch für binär genommen haben. Ich habe zuerst meine Tests mit der v2 der Compact Framework DLL und dann mit der DLL v3.5 versucht. Hier ist, was ich habe, Zeit ist in ms:

%Vor%     
Charlie 08.07.2009 12:56
quelle
3

Der Hauptaufwand in Ihrer Methode ist die tatsächliche Generierung der XmlSerializer-Klasse. Das Erstellen des Serialisierers ist ein zeitraubender Vorgang, den Sie nur einmal für jeden Objekttyp durchführen sollten. Versuchen Sie, die Serialisierer zwischenzuspeichern, und prüfen Sie, ob dies die Leistung überhaupt verbessert.

Nach diesem Rat habe ich eine große Leistungsverbesserung in meiner App gesehen, die es mir erlaubt hat, die XML-Serialisierung fortzusetzen.

Hoffe, das hilft.

    
Cr1spy 19.11.2011 17:58
quelle
1

Interessant ... Gedanken:

  • Welche Version von CF ist das? 2.0? 3.5? Insbesondere hat CF 3.5 Delegate.CreateDelegate , wodurch protobuf-net viel schneller auf Eigenschaften zugreifen kann als in can 2.0
  • Kommentieren Sie Felder oder Eigenschaften ? Auch in CF sind die Reflexionsoptimierungen begrenzt; Sie können in CF 3.5 bessere Ergebnisse mit Eigenschaften erzielen, da bei einem Feld die einzige verfügbare Option FieldInfo.SetValue ist.

Es gibt eine Reihe anderer Dinge, die bei CF einfach nicht existieren, also muss es an einigen Stellen Kompromisse eingehen. Für übermäßig komplexe Modelle gibt es auch ein bekanntes Problem mit den generischen Einschränkungen von CF . Eine Korrektur ist im Gange, aber es ist eine große Änderung und dauert "eine Weile".

Weitere Informationen zu regulären (vollständigen) .NET-Vergleichen verschiedener Formate (einschließlich XmlSerializer und protobuf-net) sind hier .

    
Marc Gravell 07.07.2009 12:34
quelle
0

Haben Sie versucht, benutzerdefinierte Serialisierungsklassen für Ihre Klassen zu erstellen? Anstatt den XmlSerializer zu verwenden, der ein Allzweck-Serializer ist (er erzeugt zur Laufzeit eine Menge von Klassen). Es gibt ein Werkzeug dafür (sgen). Sie führen es während des Erstellungsprozesses aus und es generiert eine benutzerdefinierte Assembly, die im Tempo von XmlSerializer verwendet werden kann.

Wenn Sie Visual Studio verwenden, ist die Option auf der Registerkarte "Erstellen" der Projekteigenschaften verfügbar.

    
Tundey 07.07.2009 12:41
quelle
0

Wird die Leistung beim Serialisieren der Objekte oder beim Schreiben in die Datenbank beeinträchtigt? Da das Schreiben wahrscheinlich eine Art langsamer Speicherung ist, würde ich mir vorstellen, dass es sich um einen größeren Performance-Hit handelt als bei der Serialisierung.

Bedenken Sie, dass die von Marc Gravell veröffentlichten Perf-Messungen die Leistung über 1.000.000 Iterationen testen.

In welcher Art von Datenbank speichern Sie sie? Werden die Objekte im Speicher oder direkt im Speicher serialisiert? Wie werden sie an die db gesendet? Wie groß sind die Objekte? Wenn Sie aktualisiert werden, senden Sie alle Objekte an die Datenbank oder nur an die geänderte? Wird irgendetwas im Speicher zwischengespeichert oder jedes Mal neu aus dem Speicher gelesen?

    
kyoryu 08.07.2009 06:36
quelle
0

XML ist oft langsam zu verarbeiten und benötigt viel Platz. Es gab eine Reihe von verschiedenen Versuchen, dies anzugehen, und das populärste heute scheint zu sein, das Los einfach in eine gzip-Datei zu legen, wie mit dem Packaging Convention öffnen .

Der W3C hat gezeigt, dass der gzip-Ansatz weniger als optimal ist, und sie und verschiedene andere Gruppen haben an einer besseren binären Serialisierung gearbeitet, die für die schnelle Verarbeitung und Komprimierung für die Übertragung geeignet ist.

    
IanGilham 10.07.2009 18:56
quelle