让JAXB更快

时间:2011-12-24 18:20:10

标签: xml performance jaxb jaxp

我有一个8兆的文件。使用JAXB进行编组需要1082ms,使用DOM需要862ms,使用SAX需要438ms。这是使用JDK 1.6的所有默认值,没有使用额外配置,例如使用woodstox。

为了从JAXB获得更好的性能,我尝试通过执行它来使用SAX解析...

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();

这使它变得更慢 - 3207ms。

我的问题是: 1.如何让JAXB更快? 2.我怎样才能100%确定它正在使用什么底层解析机制?

2 个答案:

答案 0 :(得分:17)

  

1 - 如何让JAXB更快?

你正在使用StAX输入解组,但我建议使用XMLStreamReader而不是XMLEventReader。

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

由于StAX是标准,因此您可以切换另一个实现,例如WoodStox作为底层解析器。

  

2 - 我怎样才能100%确定它正在使用什么底层解析机制?

就像你在做的一样。如果您将JAXB实现传递给XMLStreamReader的实例,那么您可以合理地确定它正在被使用。另一方面,如果你从InputStream之类的东西解组,那么JAXB实现可以自由地使用它想要的任何解析技术。如果您选择Woodstox,请务必查看性能页面:

答案 1 :(得分:2)

我没有尝试过这些,但EclipseLink提供了一个JAXB实现。 http://www.eclipse.org/eclipselink/moxy.php Jibx应该很快,但我认为它不是JAXB的实现。虽然它做了同样的事情。 http://jibx.sourceforge.net/index.html

如果EclipseLink符合要求,那么您应该可以直接删除它并尝试它。不确定测试Jibx的努力。