I have a 8 Meg file. Marshalling using JAXB takes 1082ms, using DOM takes 862ms, using SAX takes 438ms. This is using all defaults with JDK 1.6, no extra configuration such as using woodstox is used.
In an effort, to get better performance from JAXB, I try to make it use SAX parsing 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();
This makes it go even slower - 3207ms.
My questions are: 1. How do I make JAXB go faster? 2. How can I be 100% sure what underlying parsing mechanism it is using?
I haven't tried these, but EclipseLink provides a JAXB implementsion. http://www.eclipse.org/eclipselink/moxy.php Jibx is supposed to be fast, but I don't think its a JAXB implementation. Although it does the same thing. http://jibx.sourceforge.net/index.html
If EclipseLink is compliant, then you should be able to just drop it in and try it. Not sure about the effort to test Jibx.
You are on the right track with unmarshalling from a StAX input, but I would recommend a XMLStreamReader instead of a XMLEventReader.
Since StAX is a standard you can switch in another implementation such as WoodStox as the underlying parser.
Just like you are doing. If you pass a JAXB implementation an instance of
XMLStreamReader
then you can be reasonably sure that it is being used. If on the other hand you unmarshalled from something like anInputStream
then the JAXB implementation is free to use whatever parsing technique it wants to. If you go with Woodstox be sure to check out there performance page as well: