2009-11-12 6 views
33

Je veux comprendre pourquoi the protocol buffers solution for .NET développé par Marc Gravell est aussi rapide que c'est.Comment protobuf-net obtient une performance respectable?

Je peux comprendre comment la solution Google originale a atteint ses performances: elle pré-génère du code optimisé pour la sérialisation des objets; J'ai écrit quelques sérialisations à la main et je sais qu'il est possible d'écrire du code plutôt rapide de cette façon si vous évitez la réflexion. Mais la bibliothèque de Marc est une solution d'exécution qui utilise des attributs et ne produit aucun code généré. Alors, comment ça marche ?

+4

Avez-vous essayé de lire la source? Ou même demander directement à Mark? – Lazarus

+0

J'ai essayé et même eu quelques idées mais si quelqu'un peut donner une réponse rapide ce serait bien – MichaelT

+2

Je serai heureux d'en parler pendant des heures ;-p Mais il faudra attendre que je finisse de travailler ... –

Répondre

41

protobuf-net utilise un modèle de stratégie; au besoin (une seule fois par type), il utilise la réflexion pour regarder les types, et construit un ensemble de sérialiseurs (basés sur une interface commune) qu'il peut utiliser pour sérialiser et désérialiser - donc lorsqu'il est utilisé l'ensemble connu de sérialiseurs.

À l'intérieur cela, il essaie de faire un usage raisonnable de la réflexion quand on parle aux membres; il utilise Delegate.CreateDelegate pour parler aux propriétés, et DynamicMethod (et IL personnalisé) pour parler aux champs (si possible, cela dépend de la structure cible). Cela signifie qu'il parle toujours à connu types de délégués, plutôt que seulement DynamicInvoke (ce qui est très lent).

Sans fou, le code a quelques Optimisations (sans doute au détriment de la lisibilité) en termes de:

  • tampon locale byte[] (des entrées/flux de sortie)
  • en utilisant de taille fixe des tableaux (plutôt que des listes, etc.); peut-être trop
  • en utilisant les médicaments génériques pour éviter la boxe
  • nombreux tweaks/twiddles/etc autour des boucles de traitement binaire

Avec le recul, je pense que je fait une erreur sur le point de médicaments génériques; la complexité signifiait que forçant génériques dans le système bent it out of shape in a few places, et provoque activement certains problèmes majeurs (pour les modèles complexes) on compact framework.

J'ai quelques dessins (dans ma tête seulement) à l'aide de ce refactoriser non interfaces -Générique, et à la place (pour les cadres appropriés) d'utiliser davantage ILGenerator (mon premier choix aurait été Expression, mais que les forces une version cadre supérieure). Le problème, cependant, est que cela va prendre beaucoup de temps pour travailler, et jusqu'à très récemment I've been pretty swamped.

Récemment, j'ai réussi à start spending some time on protobuf-net again, donc j'espère que je vais effacer mon arriéré de demandes etc et commencer sur ce bientôt. Il est également mon intention de le faire fonctionner avec les modèles autres que la réflexion (c'est-à-dire en décrivant le mappage de fil séparément).


et ne produit aucun code

produit Je ne dois aussi préciser qu'il existe deux (en option) des itinéraires Codegen si vous souhaitez utiliser le code généré; protogen.exe, ou le VS add-in, permettent la génération de code à partir d'un fichier .proto.Mais ce n'est pas nécessaire - il est utile surtout si vous avez un fichier .proto existant, ou si vous avez l'intention d'interopérer avec un autre langage (C++ etc) pour le développement en premier.

-3

Ses performances sont très bonnes!

Vous pouvez voir une comparaison complète entre les différents formats, y compris protobuf fait par moi- http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/

Cette comparaison comprend de grandes et de petits échantillons de données et différents formats.

L'un des tests dans mon post enter image description here

+0

La question portait sur la façon dont la performance a été accomplie, et non comment elle est performante. –

Questions connexes