让JAXB更快

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

这会使它变得更慢 - 3207毫秒。

我的问题是: 1. 如何让JAXB运行更快? 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,请务必查看其性能页面:


1
谢谢。啊,所以我使用的是StAX而不是SAX。你认为这是使用JAXB最快的方式吗? - More Than Five
1
不,StAX提供了两种类型的读取器XMLStreamReaderXMLEventReaderXMLStreamReader选项始终是更快的。 - bdoughan
是的,我明白,但我在原始示例中从未使用过SAX。您建议的方法大约需要1800毫秒(不使用woodstox)。仍然比使用普通JAXB慢得多。为什么会这样? - More Than Five
我不确定SAX是从哪里开始讨论的 :). 你使用的JRE/JDK中包含的StAX解析器版本可能存在性能问题。当你说“normal JAXB”时,是指从FileReader进行非编组吗?你使用Woodstox获得了什么性能数字?在处理数据或执行直接解析时,使用SAX或DOM数字吗? - bdoughan
我所说的普通JAXB是指:unmarshaller.unmarshal(new File("servers.xml"));使用JAXB可以提高效率,最快可达到920。但仍不及DOM或SAX快速。不知道为什么?有任何想法吗?非常感谢。 - More Than Five

2

+1 给 EclipseLink MOXy(我是技术负责人)。MOXy 符合 JAXB 2.1 和 2.2。有关将其用作提供程序的信息,请参见:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html。一定要查看我们最新的 2.3.2 版本:http://www.eclipse.org/eclipselink/downloads/。JiBX 不是一个 JAXB 实现。 - bdoughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接