Java marshaller性能

时间:2010-03-19 18:59:11

标签: java performance multithreading jaxb marshalling

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

7 个答案:

答案 0 :(得分:13)

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

请注意,JAXBContext是线程安全的,但marshallers \ unmarshallers不是,所以你仍然需要为每个线程创建marshaller。但是我发现当你已经拥有jaxb上下文时创建marshallers非常快。

答案 1 :(得分:6)

Byeond其他好的建议,我建议你使用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的参考impl。有缺陷,没有比Sun快)

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

如果写入大型XML树,则向其提供BufferedOutputStream javax.xml.bind.Marshaller.marshal(Object jaxbElement, java.io.OutputStream os)方法在我的案例中发挥了重大作用:

写入100MB XML文件所需的时间可以从130秒减少到7秒。

答案 4 :(得分:1)

根据我的经验,JIBX http://jibx.sourceforge.net/比JAXB快近10倍。是的,我测量了性能规格。我们用它来绑定大型HL7 xml的java bean。话虽这么说,提高性能的方法不是依赖于模式定义,而是编写自定义绑定。

答案 5 :(得分:1)

我们刚刚跟踪了与Xerces使用的默认解析器配置相关的JAXB性能问题。对于一个数据文件(< 1Mb)

,JAXB性能非常慢(30s +)

引用"如何更改默认解析器配置?"来自http://xerces.apache.org/xerces2-j/faq-xni.html

  

DOM和SAX解析器决定按以下顺序使用哪种解析器配置

     
      
  1. 查询org.apache.xerces.xni.parser.XMLParserConfiguration系统属性以获取解析器配置的类名。
  2.   
  3. 如果在JRE安装的lib子目录中存在名为xerces.properties的文件,并且定义了org.apache.xerces.xni.parser.XMLParserConfiguration属性,则将从该文件中读取其值。
  4.   
  5. 从META-INF / services /目录请求org.apache.xerces.xni.parser.XMLParserConfiguration文件。此文件包含解析器配置的类名。
  6.   
  7. org.apache.xerces.parsers.XIncludeAwareParserConfiguration用作默认解析器配置。
  8.   

使用JAXB进行解组会导致重复应用此算法。因此,可以花费大量时间重复扫描类路径,寻找不存在的配置文件。修复是执行选项1,选项2或选项3(在META-INF下创建配置文件)。任何阻止重复类路径扫描的东西。

希望这有助于某人 - 我们花了几天的时间来追踪这一点。

答案 6 :(得分:0)

我们可以通过在系统级别设置快速启动属性来实现编组和解组的性能。这将带来很多性能提升。

System.setProperty( “com.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot”, “真”);