L'optimisation de Gson la désérialisation
Quelle est la meilleure façon d'optimiser la désérialisation?
Je suis actuellement en utilisant le standard de Gson.la méthode toJson et Gson.fromJson méthodes pour la sérialisation et la désérialisation de certains objets complexes et je suis à la recherche pour réduire la désérialisation de temps si possible.
La plus complexe de mon objet contient 43 variables si ce qui compte.
OriginalL'auteur HandlerExploit | 2013-03-19
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez utiliser Gson, et de ne pas passer à un autre Java/de-API JSON, et si les performances de Gson est automagique de liaison de données n'est pas assez bon, alors il est possible de rester à la Gson de l'API, de presser et de certains modérément de meilleures performances.
Dans les dernières séries de tests de performance affiché au https://github.com/eishay/jvm-serializers/wiki, les résultats suggèrent que le rendement combiné de Gson de sérialisation et de désérialisation pourrait éventuellement être améliorée d'environ 25%, en utilisant l'API en continu de Gson au lieu de la liaison de données.
Noter que c'est en général ce qui complique singulièrement la mise en œuvre du code d'utilisateur, où des solutions comparables à des one-liners à l'aide de la liaison de données de l'API, par exemple,
new Gson().toJson(something)
, sont remplacés par (facilement) des dizaines de lignes, y compris dans les boucles et instructions conditionnelles. Ainsi, le coût de l'amélioration de la performance est plus compliqué code.Pour des exemples d'utilisation de l'API en continu par rapport à la liaison de données de l'API, jetez un oeil à la
JsonGsonManual
etJsonGsonDatabind
implémentations, en la jvm-sérialiseurs projet.(Note: On pourrait également utiliser l'arbre-modèle dans la Gson API, au lieu de la diffusion ou de la liaison de données Api, mais il ne semble pas offrir toutes les améliorations de performances sur la liaison de données. Pour un exemple, voir
JsonGsonTree
.)OriginalL'auteur Programmer Bruce
Gson est connu et de l'utiliser pour sa facilité d'utilisation. Si vous souhaitez vitesse, vous aurez à regarder le super populaire Jackson Json.
J'ai testé et comparé les deux Gson et Jackson et je peux vous dire que dans certains cas d'utilisation Jackson est 15 fois plus rapide sur les deux de la sérialisation et la désérialisation, même sur de très gros objets.
Pour obtenir le même comportement que Json-je utiliser les paramètres suivants
C'donner exactement les mêmes chaînes json comme Gson pour les mêmes objets. Vous pouvez le configurer pour utiliser uniquement les getters et les setters si vous le souhaitez. Je vous conseille de lire tous les jackson json annotations pour la manipulation des sous-types (utile pour le style RPC systèmes).
Mon cas d'utilisation : j'utilise jackson comme la sérialisation quand j'en ai besoin pour économiser de gouttes pour les systèmes de stockage (Redis, Cassandra, Mongo, ... parfois, mysql). Je l'utilise aussi comme la sérialisation pour mon style RPC Api pour assez élevé des systèmes de circulation, bien que je préfère à l'aide de Protobuf pour ceux qui, lorsque possible. Dans ce dernier cas, j'utilise Jackson pour sérialiser directement à byte[] ou flux de données pour de meilleures performances.
Une dernière remarque : L'objet mapper est thread-safe et d'avoir une instance statique comme dans l'exemple que je viens d'envoyer vous empêchera d'avoir la légère instanciation de frais généraux.
EDIT : je suis conscient que mon exemple n'est pas suivi beaucoup des meilleures pratiques de l'a souligné dans l'jackson page mais il me permet d'avoir simple de comprendre le code qui ressemble à la
Gson.toJson
etGson.fromJson
(j'ai commencé avec trop et mis sur le tard à Jackson)Gson.toJson(object)
=>JsonMapper.INSTANCE.mapper().writeValueAsString(object)
Gson.fromJson(object, clazz)
=>JsonMapper.INSTANCE.mapper().readValue(jsonString, clazz);
OriginalL'auteur ɭɘ ɖɵʊɒɼɖ 江戸
Il n'existe aucun moyen pour améliorer la Gson bibliothèque de sérialisation et de désérialisation temps.
En tant que Programmeur, Bruce a dit, si le temps d'exécution qui est vraiment important pour vous, jetez un oeil à la Jackson de la bibliothèque. Il est, à mon avis, un peu plus "compliqué" à utiliser, mais il a été prouvé beaucoup plus rapide que n'importe quel autre json bibliothèques dans les benchmarks.
Ici certaines des meilleures pratiques pour améliorer les performances avec Jackson.
OriginalL'auteur Padrus
J'aimerais passer à Jackson, et d'envisager fastJSON. Les deux montrent beaucoup plus rapide que Gson dans les benchmarks.
OriginalL'auteur Programmer Bruce
Les belles choses que la question de l'optimisation de json est de garder toutes les données dans un seul niveau.
Si un objet qu'un autre objet comme son domaine, et ce champ un autre objet, et ainsi de suite, chaque
new
consommer un peu plus de temps pour la désérialisation. Si tous les champs de votre objet ont des types primitifs, la désérialisation être un peu plus rapide.Jackson et Gson continuer à être le meilleur de la bibliothèque pour vous aider.
OriginalL'auteur Moesio