让JAXB更快

Mor*_*ive 12 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();
Run Code Online (Sandbox Code Playgroud)

这使它变得更慢 - 3207ms.

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

bdo*_*han 17

1 - 如何让JAXB更快?

你是从StAX输入解组的正确轨道,但我建议使用XMLStreamReader而不是XMLEventReader.

XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmler = xmlif.createXMLStreamReader(fr);
Run Code Online (Sandbox Code Playgroud)

由于StAX是标准,因此您可以将另一个实现(例如WoodStox)切换为基础解析器.

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

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


Bil*_*ill 2

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

如果 EclipseLink 兼容,那么您应该可以将其放入并尝试。不确定测试 Jibx 的努力。