Java-Marshaller-Leistung

8

Ich habe sowohl JAXB Marshaller als auch meinen eigenen Marshaller verwendet, um reine Java-Objekte in XML zu mappen. Es wurde beobachtet, dass beide fast die gleiche Zeit benötigen, um zu marshalen. Die Leistung ist nicht akzeptabel und muss verbessert werden. Welche Möglichkeiten gibt es, um die Leistung des Marshallers zu verbessern? Wie Threading?

    
cbz 19.03.2010, 18:59
quelle

7 Antworten

3

Die Verwendung von JibX abstimmen. Wie bei questzen fand ich heraus, dass JibX in meinen Leistungstests 9 mal schneller war als JAXB.

Stellen Sie außerdem sicher, dass Sie Woodstox auf dem Klassenpfad verwenden, wenn Sie JibX verwenden. Ich fand Woodstox's Stax Implementation ist ungefähr 1050% schneller als die Java6 Implementierung von Stax.

    
Ben Davies 31.03.2010, 11:35
quelle
12

Stellen Sie sicher, dass Sie die JaxB-Kontextinstanz nur einmal erstellen. Das Erstellen des Kontexts dauert einige Zeit, da Reflektionen verwendet werden, um die Anmerkungen des Objekts zu analysieren.

Beachten Sie, dass der JAXBContext threadsicher ist, aber die Marshaller \ unmarshaller nicht, also müssen Sie den Marshaller für jeden Thread erstellen. Wie auch immer, ich habe festgestellt, dass das Erstellen der Marshaller, wenn Sie bereits einen Jaxb-Kontext haben, ziemlich schnell ist.

    
LiorH 31.03.2010 11:44
quelle
5

Abgesehen von anderen guten Vorschlägen, schlage ich vor, dass etwas mit der Art und Weise, wie Sie JAXB verwenden, nicht stimmt - es funktioniert im Allgemeinen recht gut, solange:

  • Sie benutzen JAXB Version 2 (NIEMALS veraltete JAXB 1 verwenden - das war schrecklich langsam, nutzloses Stück Mist); vorzugsweise eine aktuelle Version 2.1.x von Ссылка
  • Stellen Sie sicher, dass Sie SAX oder Stax Quelle / Ziel verwenden; NIEMALS DOM verwenden, außer Sie müssen absolut für die Interoperabilität: mit DOM wird es 3 - 5x langsamer, ohne Nutzen (es verdoppelt nur Objektmodell: POJO -> DOM - XML ​​XML; DOM Teil ist völlig unnötig)
  • Idealerweise den schnellsten verfügbaren SAX / Stax-Parser verwenden; Woodstox ist schneller als Suns gebündelter Stax-Prozessor (und BEA's ref. Impl. Ist fehlerhaft, nicht schneller als Sun)

Wenn JAXB immer noch mehr als 50% langsamer ist als manuell geschriebene Variante, würde ich es profilieren, um zu sehen, was sonst noch falsch läuft. Es sollte nicht langsam arbeiten, wenn es richtig verwendet wird - ich habe es kontinuierlich gemessen und es so schnell gefunden, dass handschriftliche Konverter normalerweise keine Zeit und Mühe wert sind.

Jibx ist auch ein gutes Paket, also habe ich nichts dagegen, es auszuprobieren. Es könnte immer noch etwas schneller sein als JAXB; nur nicht 5x oder 10x, wenn beide richtig verwendet werden.

    
StaxMan 17.04.2010 20:10
quelle
3

Wenn große XML-Bäume geschrieben werden, die einen BufferedOutputStream für die javax.xml.bind.Marshaller.marshal (Objekt jaxbElement, java.io.OutputStream os) Methode machte einen großen Unterschied in meinem Fall:

Die Zeit, die benötigt wird, um eine 100-MB-XML-Datei zu schreiben, könnte von 130 auf 7 Sekunden reduziert werden.

    
IngmarK 12.01.2015 20:07
quelle
1

Meiner Erfahrung nach war JIBX Ссылка fast zehnmal schneller als JAXB. Ja, ich habe es für eine Leistungsspezifikation gemessen. Wir haben es verwendet, um Java-Beans mit großen HL7 XML zu binden. Davon abgesehen besteht der Weg zur Leistungsverbesserung nicht darin, sich auf die Schemadefinition zu verlassen, sondern benutzerdefinierte Bindungen zu schreiben.

    
questzen 19.03.2010 21:06
quelle
1

Wir haben gerade ein JAXB-Leistungsproblem im Zusammenhang mit der von Xerces verwendeten Standardparser-Konfiguration festgestellt. JAXB-Leistung war sehr langsam (30s +) für eine Datendatei (& lt; 1Mb)

Zitat "Wie ändere ich die Standard-Parser-Konfiguration?" von Ссылка

  

Die DOM- und SAX-Parser entscheiden, welche Parserkonfiguration in der folgenden Reihenfolge verwendet werden soll:

     
  1. Die Systemeigenschaft org.apache.xerces.xni.parser.XMLParserConfiguration wird nach dem Klassennamen der Parserkonfiguration abgefragt.
  2.   
  3. Wenn eine Datei namens xerces.properties im Unterverzeichnis lib der JRE-Installation existiert und die Eigenschaft org.apache.xerces.xni.parser.XMLParserConfiguration definiert ist, wird ihr Wert aus der Datei gelesen.
  4.   
  5. Die Datei org.apache.xerces.xni.parser.XMLParserConfiguration wird im Verzeichnis META-INF / services / angefordert. Diese Datei enthält den Klassennamen der Parserkonfiguration.
  6.   
  7. Die org.apache.xerces.parsers.XIncludeAwareParserConfiguration wird als Standardparserkonfiguration verwendet.
  8.   

Das Unmarshalling mit JAXB führt dazu, dass dieser Algorithmus wiederholt angewendet wird. Es kann also sehr viel Zeit darauf verwendet werden, den Klassenpfad wiederholt zu durchsuchen und nach der Konfigurationsdatei zu suchen, die nicht existiert. Die Lösung besteht darin, Option 1, Option 2 oder Option 3 zu machen (erstellen Sie die Konfigurationsdatei unter META-INF). Alles, um den wiederholten Klassenpfad-Scan zu verhindern.

Hoffe, das hilft jemandem - es hat uns Tage gekostet, das aufzuspüren.

    
David Blake 26.03.2014 11:27
quelle
0

Wir können die Leistung beim Marshalling und beim Unmarshalling erreichen, indem wir die Eigenschaft "Schnellstart" auf Systemebene festlegen. Dies wird viel Leistungsverbesserung bringen.

System.setProperty ("com.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot", "true");

    
sreeharsha07 10.01.2014 08:58
quelle