2009-11-13 8 views
2

Je suis en train de sérialiser des données d'environ 30   KB, et j'ai besoin de trouver un moyen plus rapide de sérialiser et de désérialiser les données. Pour moi, la vitesse est aussi importante que la taille, donc soit je trouve un moyen de compacter les données plus étroitement, soit j'ai besoin d'un mécanisme plus rapide pour construire les objets. J'ai essayé de construire des méthodes personnalisées pour cela, ainsi que d'utiliser les méthodes de sérialisation intégrées, mais j'espère que quelqu'un là-bas a une certaine expérience avec cela. Dans mon application, les millisecondes comptent, donc la vitesse est bonne comparée à la taille d'autant plus que certains objets peuvent être assez grands.Quelle est la méthode de sérialisation la plus rapide pour .NET?

EDIT

Les données sont un objet avec de nombreuses propriétés sur elle, y compris un dictionnaire et un certain nombre de ints et les champs de chaîne. Supposons un maillage complexe. J'ai donc fait cela pour un exemple qui vous donne une idée de ce à quoi pourraient ressembler les relations dans l'objet.

<Serializable()> Class A 
    Inherits B 
    Dim _C As New C 
    Dim E As Byte() 
End Class 
<Serializable()> Class B 
    Dim A As Int32 
    Dim B As Dictionary(Of String, Object) 
End Class 
<Serializable()> Class C 
    Dim A As Int32 
    Dim D As String 
End Class 

Bien sûr, il existe également des accesseurs pour les champs, mais cela ne devrait pas avoir d'impact sur ce point.

+0

veuillez être plus précis; un exemple est toujours utile –

Répondre

0

La réponse dépend radicalement du type et de la structure des données à sérialiser.

Si les données sont un tableau de 30 Ko d'octets, écrivez le tout dans un flux binaire en un seul bloc, il ne peut pas obtenir beaucoup plus vite que cela.

Si les données sont un maillage de 30K d'objets hautement structurés intégrés dans un maillage d'interconnexions ... - bonne chance!

0

Il existe un benchmark intéressant dans le post protobuf-net vs NetDataContractSerializer sur le blog de Marc Gravell.

De toute façon, vous devez donner plus de détails sur la structure de vos données si vous voulez une réponse utile.

2

Il y a plusieurs choses qui me viennent à l'esprit.

Est-il possible de réduire la quantité de données en cours de sérialisation? Cela pourrait être une impasse pour vous, mais il va évidemment avoir un grand impact sur la performance.

Pouvez-vous réduire la latence globale en diffusant les données sérialisées? Si la cible d'un graphe d'objet sérialisé est un flux réseau, un fichier, etc., vous pouvez alors chevaucher deux ou plusieurs opérations et réduire la latence globale.

Pouvez-vous réduire la généralité de la structure pour que la sérialisation personnalisée couvre plus de cas? Je regarde B :: B et il peut tirer n'importe quel type via la valeur du dictionnaire. Il se peut que les types réels mis dans ce dictionnaire soient entièrement sous votre contrôle, mais cela vaut la peine d'être évoqué parce que les structures de données plus simples et plus contrôlées sont, en général, plus faciles et plus rapides à sérialiser.

Y a-t-il une redondance dans les données que vous pouvez exploiter? Si vous saviez que certains des objets contenus dans le dictionnaire étaient fonctionnellement équivalents, vous pourriez les sérialiser en tant que groupe et les référencer simplement par index lors de la sérialisation du dictionnaire.

Aussi, ne sous-estimez pas l'effet que la taille a sur les performances.Encore une fois, cela dépend de ce que le programme fait avec la structure, mais même produire un grand flux d'octets lui-même peut entraîner un coût en temps. Bien sûr, envoyer plus d'octets sur un réseau ou dans un fichier prend également plus de temps. Je suggérerais que l'écriture d'un code de sérialisation personnalisé minimal pour les classes produirait une nette amélioration par rapport à la sérialisation par défaut de l'exécution, même si vous n'avez pas besoin d'écrire autant de métadonnées. La construction des enfants devrait être plus rapide aussi.

Une autre technique (qui peut ou ne peut pas aider ici) est de rendre votre structure de données liée mieux pour la sérialisation. Par exemple, si vous avez une structure arborescente, conservez des références entre frères et sœurs en plus des références parent-enfant afin de pouvoir les énumérer toutes dans l'ordre sans le coût de traitement récursif de l'arborescence. Un tas me vient aussi à l'esprit. Vous pouvez itérer sur les éléments du tas, sans tenir compte de la manière dont les éléments sont individuellement liés les uns aux autres.

Questions connexes