xml序列化的性能问题

最近一个web模块在做性能测试,用lr一压,发现tps很低,还不到15

 

问题很严重,虽然达到了需求中规定的要求,但是发现实在有点对不起观众。

 

决定对代码进行分析,我开始一段的一段的进行分析,查看执行时间。后来老大用jprofile分析,更快,看样子我有点土了。

 

很快我把问题定位在xml的序列化上,因为请求的参数都是xml报文,而我们使用的是castor来进行反序列化和序列化。发现消耗在这段的时间占总时间的一半,感觉不对劲。

 

后来我就直接写了个简单的测试例子,用jmeter来压,也很慢,然后我找网上的xstream来做同样的事情,性能比这个高10倍左右,看样子是castor对多线程支持不好,高并发下性能不行。

 

对比castorXStream两个开源的组件序列化和反序列化xml的性能。

部署在weblogic上的例子,100个线程循环100次,以下是使用jmeter测试后的聚合报告截图:

 

 castor

 
xstream

 
 
xstreamthroughput的值最高能达到300

 

通过对比,可以发现castor的性能存在问题。

 

后来察看castor的文档,发现在个文档(xml-best-practice.html)有对性能说明;

主要是说要对Descriptor classes 这种对象进行缓存,还好castor有这种机制,只要使用

XMLContext对象来创建(Un)Marshaller实例就行。具体看下面的代码:

 

private final static XMLContext xmlContext;   
  
static {   
    xmlContext = new XMLContext();   
    try {   
        /**  
         * 请确保以下的目录下面有.castor.cdr这样的文件存在,  
         * 否则cache将不起作用  
         */  
        xmlContext.addPackages(new String[]{"com.asiainfo.aidmccsupport.boss",   
                "com.asiainfo.aidmccsupport.boss.operate",   
                "com.asiainfo.aidmccsupport.boss.query"});   
        xmlContext.setProperty("ReuseObjects", true);   
  
    } catch (ResolverException e) {   
        e.printStackTrace();   
    }   
       
}  

  

 

经过这种优化,再用jmeter测试,发现性能上升了一倍,总体感觉估计还是castor的性能不行。

没办法,目前只能将就用castor,因为发现使用xstream来替代需要修改好多代码,主要是castor生成的javabean类文件中的属性都是带下划线的,而xstream要求属性名称和xml的节点名称一样才能解析。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值