Java marshaller性能

cbz*_*cbz 9 java performance multithreading jaxb marshalling

我已经使用JAXB Marshaller以及我自己的marshaller将纯java bean对象编组为XML.据观察,它们都需要几乎相同的时间进行编组.性能是不可接受的,需要改进.有哪些方法可以提高编组人员的表现?像线程一样?

Lio*_*orH 14

确保只创建一次JaxB上下文实例,创建上下文需要一些时间,因为它使用反射来解析对象的注释.

请注意,JAXBContext是线程安全的,但是marshallers\unmarshallers不是,因此您仍然需要为每个线程创建编组器.但是我发现当你已经拥有jaxb上下文时创建marshallers非常快.


Sta*_*Man 6

再提出其他好的建议,我建议您使用JAXB的方式有问题 - 只要表现良好,它通常表现良好:

  • 你使用JAXB版本2(永远不要使用过时的JAXB 1 - 这是非常缓慢,无用的垃圾); 最好是http://jaxb.dev.java.net最近的2.1.x版本
  • 确保使用SAX或Stax源/目标; 除非你绝对必须具备互操作性,否则永远不要使用DOM:使用DOM会使它慢3到5倍,没有任何好处(它只是对象模型加倍:POJO - > DOM - > XML; DOM部分完全没必要)
  • 理想情况下使用最快的SAX/Stax解析器; Woodstox比Sun捆绑的Stax处理器更快(而且BEA的参考文件是错误的,并不比Sun快)

如果JAXB仍然比手动编写的变体慢50%,我会分析它以查看还有什么问题.如果使用得当,它不应该工作缓慢 - 我已经连续测量它,并且发现它如此之快以至于手写转换器通常不值得花时间和精力.

Jibx是一个很好的包装,所以我没有反对尝试它.它可能仍然比JAXB快一点; 当两者都正确使用时,不是5倍或10倍.


Ben*_*ies 5

借调JibX的使用.和questzen一样,我发现JibX在性能测试中比JAXB快9倍.

此外,确保在使用JibX时在类路径上有woodstox.我发现woodstox的Stax Implementation比Stax的Java6实现快大约1050%.