12

我有一个 8 兆的文件。使用 JAXB 进行编组需要 1082 毫秒,使用 DOM 需要 862 毫秒,使用 SAX 需要 438 毫秒。这是使用 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% 确定它使用的是什么底层解析机制?

4

2 回答 2

16

1 - 如何让 JAXB 运行得更快?

您在从 StAX 输入解组的正确轨道上,但我建议使用 XMLStreamReader 而不是 XMLEventReader。

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

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

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

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

于 2011-12-24T19:11:59.573 回答
2

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

如果 EclipseLink 是兼容的,那么您应该能够将其放入并尝试一下。不确定测试 Jibx 的努力。

于 2011-12-24T18:35:30.033 回答