Make JAXB go faster

半世苍凉 提交于 2019-12-03 04:31:02

问题


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?


回答1:


1 - How do I make JAXB go faster?

You are on the right track with unmarshalling from a StAX input, but I would recommend a XMLStreamReader instead of a XMLEventReader.

XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmler = xmlif.createXMLStreamReader(fr);

Since StAX is a standard you can switch in another implementation such as WoodStox as the underlying parser.

2 - How can I be 100% sure what underlying parsing mechanism it is using?

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 an InputStream 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:

  • http://woodstox.codehaus.org/Performance



回答2:


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.



来源:https://stackoverflow.com/questions/8626153/make-jaxb-go-faster

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!