XML vs Binaire de performance pour la Sérialisation/Désérialisation
Je suis en train de travailler sur un compact cadre de l'application et de la nécessité de booster les performances. L'application fonctionne hors ligne par la sérialisation des objets au format XML et de les stocker dans une base de données. À l'aide d'un outil de profilage j'ai pu voir c'était tout à fait une grande surcharge, le ralentissement de l'application. J'ai pensé que si je suis passé à une sérialisation binaire la performance serait d'augmenter, mais parce que ce n'est pas pris en charge dans le cadre compact, j'ai regardé protobuf-net. La sérialisation semble plus rapide, mais la désérialisation beaucoup plus lente, et l'application est de faire plus de désérialisation de la sérialisation.
Devrait sérialisation binaire devrait être plus rapide et si oui qu'est ce que je peux faire pour accélérer les performances? Voici un extrait de comment je suis en utilisant XML et binaire:
La sérialisation XML:
public string Serialize(T obj)
{
UTF8Encoding encoding = new UTF8Encoding();
XmlSerializer serializer = new XmlSerializer(typeof(T));
MemoryStream stream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);
serializer.Serialize(stream, obj);
stream = (MemoryStream)writer.BaseStream;
return encoding.GetString(stream.ToArray(), 0, Convert.ToInt32(stream.Length));
}
public T Deserialize(string xml)
{
UTF8Encoding encoding = new UTF8Encoding();
XmlSerializer serializer = new XmlSerializer(typeof(T));
MemoryStream stream = new MemoryStream(encoding.GetBytes(xml));
return (T)serializer.Deserialize(stream);
}
Protobuf-net sérialisation Binaire:
public byte[] Serialize(T obj)
{
byte[] raw;
using (MemoryStream memoryStream = new MemoryStream())
{
Serializer.Serialize(memoryStream, obj);
raw = memoryStream.ToArray();
}
return raw;
}
public T Deserialize(byte[] serializedType)
{
T obj;
using (MemoryStream memoryStream = new MemoryStream(serializedType))
{
obj = Serializer.Deserialize<T>(memoryStream);
}
return obj;
}
OriginalL'auteur Charlie | 2009-07-07
Vous devez vous connecter pour publier un commentaire.
Je vais corriger moi-même, Marc Gravall a souligné la première itération a une surcharge de construire le modèle, donc j'ai fait quelques tests en prenant la moyenne de 1000 itérations de la sérialisation et la désérialisation pour XML et binaire. J'ai essayé mes tests avec la v2 du Compact Framework DLL d'abord, et ensuite avec la v3.5 DLL. Voici ce que j'ai, le temps est en ms:
OriginalL'auteur Charlie
Le principal poste de dépense dans votre méthode est la génération réelle de la classe XmlSerializer. La création de la serialiser agit d'un processus fastidieux qui vous devriez le faire seulement une fois pour chaque type d'objet. Essayez de mettre en cache le serialisers et voir si cela améliore les performances à tous.
Suivant ces conseils, j'ai vu une grande amélioration de la performance de mon application qui m'a permis de continute pour l'utilisation de la sérialisation XML.
Espère que cette aide.
OriginalL'auteur Cr1spy
Intéressant... les pensées:
Delegate.CreateDelegate
qui permet protobuf-net pour accéder à des propriétés beaucoup plus rapide que dans peut en CF 2.0FieldInfo.SetValue
Il y a un certain nombre d'autres choses qui n'existent tout simplement pas dans la MUCOVISCIDOSE, de sorte qu'il a à faire des compromis dans quelques endroits. Trop de modèles complexes, il est également un problème connu avec les génériques des limites de FC. Un correctif est en cours, mais c'est un grand changement, et de prendre "un certain temps".
Pour info, certaines mesures régulières (au complet) .NET la comparaison de différents formats (y compris
XmlSerializer
et protobuf-net) sont ici.Est-il possible de l'essayer en CF 3.5 (avec le CF 3.5 binaire) juste pour voir si cela résout-il?
Ok, je viens de lancer mon test sur CF3.5 et de voir les performances de manière significative à partir de CF2; binaire effectue beaucoup plus rapidement pour les deux de sérialisation et de désérialisation. Malheureusement, je suis attaché à CF2 bien donc peut-être repenser les choses.
Juste pour clarifier mon texte au-dessus.. je veux dire, je vois les performances de manière significative dans CF3.5; CF2 est plus lent.
Désolé..scratch, j'ai lu le rapport perf de mal! Voici ce que je reçois le test d'une simple entité avec 3 propriétés: XML Sérialiser 317ms XML Désérialiser: 7ms Binaire Sérialiser: 147ms Binaire Désérialiser: 19ms
OriginalL'auteur Marc Gravell
Avez-vous essayé de créer des classes de sérialisation pour vos classes? Au lieu d'utiliser XmlSerializer qui est d'un usage général, sérialiseur (il crée un groupe de classes au moment de l'exécution). Il y a un outil pour faire cela (sgen). Vous l'exécuter au cours de votre processus de création et génère un assembly personnalisé qui peut être utilisé dans le rythme de XmlSerializer.
Si vous avez Visual Studio, l'option est disponible dans le cadre de l'onglet des propriétés de votre projet.
OriginalL'auteur Tundey
Est l'impact sur les performances de la sérialisation des objets, ou de l'écriture à la base de données? Car l'écriture d'entre elles est susceptible de frapper une sorte de stockage lent, j'imagine qu'il sera beaucoup plus perf frapper que la sérialisation étape.
Gardez à l'esprit que la perf mesures posté par Marc Gravel sont de tester les performances de plus de 1 000 000 d'itérations.
Quel type de base de données sont vous de les stocker dans? Sont les objets sérialisés en mémoire ou sur la droite pour le stockage? Comment sont-ils envoyés à la db? Quelle sont les objets? Lorsque l'on est mis à jour, ne vous envoyer tous les objets de la base de données, ou simplement celui qui a changé? Êtes-vous de la mise en cache quoi que ce soit dans la mémoire, ou la re-lecture de stockage à chaque fois?
OriginalL'auteur kyoryu
XML est souvent lent à traiter et prend beaucoup d'espace. Il y a eu un certain nombre de tentatives pour le résoudre, et les plus populaires d'aujourd'hui semble être simplement déposer le lot dans un fichier gzip, comme avec le Open Packaging Convention.
La W3C a montré le gzip approche à moins qu'optimales, et ils et divers d'autres groupes ont travaillé sur l'amélioration de la sérialisation binaire adapté pour la rapidité de traitement et de compression, pour la transmission.
OriginalL'auteur IanGilham