Machen JAXB schneller gehen
Ich habe eine 8 Meg-Datei. Marshalling mit JAXB nimmt 1082ms, mithilfe von DOM dauert 862ms, mit SAX nimmt 438ms. Dies ist über alle standardmäßig mit dem JDK 1.6, keine extra Einstellungen wie die Verwendung von woodstox verwendet wird.
In einer Anstrengung, um eine bessere Leistung von JAXB ist, versuche ich, es mit SAX Parsen by doing...
FileReader fr = new FileReader("myfile.xml");
JAXBContext jc = JAXBContext.newInstance(MyObjectList.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLEventReader xmler = xmlif.createXMLEventReader(fr);
long beginTime = System.currentTimeMillis();
MyObjectList obj = (MyObjectList)unmarshaller.unmarshal(xmler);
long endTime = System.currentTimeMillis();
Dies macht es gehen noch langsamer - 3207ms.
Meine Fragen sind:
1. Wie kann ich JAXB schneller gehen?
2. Wie kann ich 100% sicher sein, was die zugrunde liegende parsing-Mechanismus ist es?
InformationsquelleAutor More Than Five | 2011-12-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie auf dem richtigen Weg mit unmarshalling von einem StAX-Eingang, aber ich würde empfehlen, einen XMLStreamReader, anstatt ein XMLEventReader.
Seit StAX ist ein standard, kann man den Schalter in eine andere Implementierung wie WoodStox als die zugrunde liegenden parser.
Gerade wie Sie tun. Wenn Sie eine JAXB-Implementierung eine Instanz der
XMLStreamReader
dann können Sie ziemlich sicher sein, dass es verwendet wird. Wenn Sie auf der anderen Seite unmarshallt so etwas wie eineInputStream
dann die JAXB-Implementierung ist frei zu verwenden, was parsing-Technik, die es will. Wenn Sie gehen mit Woodstox werden Sie sicher, dass Sie es performance-Seite:Nein, StAX bietet zwei Arten von Lesern
XMLStreamReader
undXMLEventReader
. DieXMLStreamReader
option ist immer der schnellere.Ja habe ich bekommen, aber ich war noch nie mit SAX in meinem ursprünglichen Beispiel. Die Weise, die Sie vorschlagen, kommt in etwa 1800ms (ohne woodstox). Noch viel langsamer als mit normalen JAXB. Warum ist das so?
Ich bin mir nicht sicher, wo SAX, trat in der Diskussion :). Es kann eine perf Ausgabe der version des StAX-parser enthalten, die in der JRE/JDK Sie verwenden. Wenn Sie "normal JAXB" meinst du unmarshalling von einem
FileReader
? Was perf-Nummern erhalten Sie mit Woodstox? Mit dem SAX-oder DOM-Nummern sind Sie die Verarbeitung der Daten, oder einfach nur tun, eine gerade analysieren?Durch normale JAXB ich meine: unmarshaller.unmarshal(new File("servers.xml")); die Zeiten werden besser mit JAXB. Down-920. So, dass ist das beste Ergebnis mit JAXB / StreamReader. Allerdings ist es noch nicht so schnell wie DOM oder SAX. Ich Frage mich, warum? Irgendwelche Ideen? Dank eine Mühle.
InformationsquelleAutor Blaise Doughan
Ich habe nicht versucht, diese aber bildet EclipseLink eine JAXB implementsion. http://www.eclipse.org/eclipselink/moxy.php Jibx soll schnell sein, aber ich glaube nicht, die eine JAXB-Implementierung. Obwohl es nicht die gleiche Sache. http://jibx.sourceforge.net/index.html
Wenn EclipseLink konform ist, dann sollten Sie in der Lage, einfach fallen lassen und ausprobieren. Nicht sicher über die Aufwand zu testen, Jibx.
InformationsquelleAutor Bill