2011-12-24 40 views
11

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

在努力,以获得从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

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

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

+0

+1的EclipseLink莫西(我是技术主管)。 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实现。 – 2011-12-24 19:16:28

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的最快方式? – 2011-12-24 20:25:16

+0

不,StAX提供了两种类型的读取器'XMLStreamReader'和'XMLEventReader'。 “XMLStreamReader”选项总是比较快。 – 2011-12-24 20:29:46

+0

是的,我明白了,但我从未在我的原始示例中使用过SAX。你建议的方式约1800毫秒(没有woodstox)。仍然比使用普通的JAXB慢得多。为什么是这样? – 2011-12-24 20:31:54