11
votes

Java Marshaller Performance

J'ai utilisé Jaxb Marshaller ainsi que mon propre marshaller pour faire ma marais des objets de haricots Java pure dans XML. Il a été observé que les deux nécessitent presque le même moment au maréchal. La performance n'est pas acceptable et doit être améliorée. Quelles sont les moyens possibles où nous pouvons améliorer la performance du marshaller? Comme filetage?


4 commentaires

Comment ce n'est pas acceptable? Quel est votre référence? Partagez-le


Il y a des points de repère très anciens (mais toujours intéressants) ici: bindark.dev.java.net/ Old-Index.html


Avez-vous vérifié si c'est le problème avec la validation de plusieurs fois? Je doute!!


Je voulais juste ajouter que, selon Java.dzone.com/articles/xml-unmarshalling-benchmark Le paysage a considérablement changé à partir de Java 7, ne laissant aucune raison d'utiliser quoi que ce soit mais Jaxb.


7 Réponses :


1
votes

Dans mon expérience, JiBX http://jibx.sourceforge.net/ était presque 10 fois plus rapide alors JAXB. Oui, je l'ai mesuré pour une spécification de performance. Nous l'avons utilisé pour lier les haricots java avec grand xml HL7. Cela étant dit, la façon d'améliorer la performance est de ne pas compter sur la définition du schéma, mais pour les liaisons d'écriture personnalisés.


0 commentaires

6
votes

Appariant l'utilisation de JibX. Comme Questzen, j'ai trouvé que Jibx était 9 fois plus rapide que Jaxb dans mes tests de performance.

En outre, assurez-vous d'avoir WoodStox sur la classe de classe lors de l'utilisation de JibX. J'ai trouvé la mise en œuvre de Stax de Woodstox est d'environ 1050% plus rapide que la mise en œuvre Java6 de Stax.


2 commentaires

Rien contre Jibx, mais de ce que j'ai vu, 9x semble assez élevé. Jaxb a été assez performant pour moi, tant que vous utilisez WoodStox, n'utilisez pas de validation (que Jibx ne fera pas, et est rarement utile pour le maréchalage). Et aussi, si possible, n'utilisez pas la version JAXB IMPLO JDK Bundles: Utilisez-la à ce jour.


En fait, en témoignez-en, je me souviens que le paquet Stax Stax (SJSXP) est beaucoup plus lent à l'écriture de XML que WoodStox - cela pourrait expliquer 9x différence, en supposant que Jibx utilise WoodStox (qu'il fait par défaut).



15
votes

Assurez-vous de créer l'instance de contexte Jaxb uniquement une fois, la création du contexte prend un certain temps car elle utilise la réflexion pour analyser les annotations de l'objet.

Notez que le jaxbcontext est le fil sûr, mais les marshallers \ Mibarshallers ne sont pas, alors vous devez toujours créer le marshallateur pour chaque fil. Cependant, j'ai trouvé que créer les marshallers lorsque vous détenez déjà un contexte Jaxb, est assez rapide.


2 commentaires

Merci pour ce commentaire, aidé à accélérer mon junit un peu. La génération de contexte Jaxb pour moi prend plus de 14 secondes. Après cela, bien que le maréchal / lesmarlales soient assez rapides: 0,116S maréchal: 0,023S


À partir de JDK 8U192, c'est toujours très important. Il a coupé le temps d'enregistrer un XML de 100 Mo en quelques secondes.



6
votes

BYEOND Autres bonnes suggestions, je suggère qu'il y a quelque chose qui ne va pas avec la façon dont vous utilisez Jaxb - il est généralement assez performant aussi longtemps que:

  • Vous utilisez JAXB Version 2 (n'utilisez jamais jamais l'obsolète Jaxb 1 - c'était horriblement lent et peu de merde); De préférence, une version récente 2.1.x de http://jaxb.dev.java.net
  • Assurez-vous d'utiliser SAX ou STAX SOURCE / DESTINATION; N'utilisez jamais DOM, sauf si vous devez absoluter l'interopérabilité: utiliser DOM le fera 3 - 5 fois plus lent, sans aucun avantage (il suffit de doubler le modèle d'objet: POJO -> DOM -> XML; la partie DOM est totalement inutile)
  • Utilisez idéalement un analyseur SAX / Stax le plus rapide disponible; Woodstox est plus rapide que le processeur STAX groupé de Sun (et Bea's Ref. Impl. Est buggy, pas plus rapide que Sun)

    Si JAXB est toujours plus de 50% plus lent que la variante écrite manuelle, je le ferais pour voir quoi d'autre se trompe. Il ne devrait pas fonctionner lentement lorsqu'il est utilisé correctement - je l'ai mesuré, continuellement et que je l'ai trouvé si vite que les convertisseurs d'écriture à la main ne méritent généralement pas de temps et d'efforts.

    JIBX est un bon paquet aussi BTW, donc je n'ai rien contre l'essayer. Il pourrait toujours être peu plus rapide que Jaxb; juste pas 5x ou 10x, lorsque les deux sont utilisés correctement.


0 commentaires

0
votes

Nous pouvons réaliser la performance dans le marshalling et la désélectionner en définissant la propriété de démarrage rapide au niveau du système. Cela donnera beaucoup d'amélioration de la performance.

system.setproperty ("com.sun.xml.bind.v2.runtime.jaxbcontexTextimpl.fastboot", "vrai");


0 commentaires

1
votes

Nous venons de suivre un problème de performance JAXB associé à la configuration d'analyse par défaut utilisée par Xerces. Jaxb Performance était très lente (30s +) pour un fichier de données (<1 Mo)

citant "Comment changer la configuration d'analyse par défaut?" de http://xerces.apache.org/xerces2-j/faq-xni .html

Les analyseurs Dom et Sax décident de la configuration d'analyseur à utiliser dans l'ordre suivant

  1. L'ORG.APACHE.XERCES.XNI.PARSER.XMLPARSERConfiguration La propriété est interrogée pour le nom de la classe de la configuration d'analyse.
  2. Si un fichier appelé xerces.properties existe dans le sous-répertoire LIB de l'installation JRE et de la propriété Org.apache.xerces.xni.Parser.xmlParseConfiguration est défini, sa valeur sera lue dans le fichier.
  3. Le fichier org.apache.xerces.xni.parser.xmlParseConfiguration est demandé à partir du répertoire Meta-Inf / Services / Services. Ce fichier contient le nom de la classe de la configuration d'analyseur.
  4. l'org.apache.xerces.parsers.xinclUserawareparseConfiguration est utilisé comme configuration d'analyseur par défaut.

    Unmarshalling à l'aide de Jaxb entraîne l'application de cet algorithme à plusieurs reprises. Donc, une quantité énorme de temps peut être consacrée à plusieurs reprises à la numérisation de la classe de classe, à la recherche du fichier de configuration qui n'existe pas. Le correctif est de faire l'option 1, l'option 2 ou l'option 3 (créez le fichier de configuration sous META-INF). Rien pour empêcher la numérisation de classe répétée.

    J'espère que cela aide quelqu'un - il nous a pris des jours pour suivre cela.


0 commentaires

3
votes

Si de gros arbres XML sont écrits, fournissant un bufferedOutputStream au javax.xml.bind.marshaller.marshal (objet jaxbelement, java.io.outputtream OS) méthode a fait une grande différence dans mon cas:

Le temps nécessaire pour écrire un fichier XML de 100 Mo pourrait être réduit de 130 secondes à 7 sec.


0 commentaires