Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84397
  • 博文数量: 5
  • 博客积分: 140
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-01 10:08
文章分类
文章存档

2015年(1)

2013年(1)

2012年(3)

我的朋友

分类: Java

2012-02-09 15:12:01

技术介绍
1.1. castor技术简介

         castor框架采取数据绑定模型进行数据处理。接口简单。相对于文档模型,数据绑定模型并不记录文档树结构,所占用的内存更少。

         castor框架使用数据绑定配置来指定生成的XML格式。灵活性强。可不需要文档格式验证。

         更多细节:http://www.ibm.com/developerworks/cn/xml/x-bindcastor/

1.2. xstream技术简介

         接口简单,上层包装完善。无需映射直接序列化/反序列化Java对象来完成于xml文本的转换,速率快,生成文档简介。但文档灵活性较弱。

         更多细节:

 

技术对比
2.1. 框架量级比较

         castor框架所需要的依赖包包括jtaservlet-apiavalon-frameworkcglibcommons-logginglog4jlogkitxerces,再加上自身jar包,框架复杂程度可见一斑。

         xstream所依赖的包仅为xpp3xstream本身(其实如果不使用xpp3的解析器,而直接使用dom解析器,xstream仅需其本身一个jar包即可。是一个非常轻量级的XML解析技术。

         经过比较,可以发现xstream相对于castor框架来说是一个非常轻量级的工具。

2.2. 编程难易度比较

         castor的编程需要针对变量——XML标签进行映射指定(mapping),这使得映射规则变换较为自由。对于castor框架来说,完成读/写所需要的步骤如下:

...

// write it out as XML (if not already present)

Mapping map = new Mapping();

map.loadMapping("mapping.xml");

File file = new File("test.xml");

Writer writer = new FileWriter(file);

Marshaller marshaller = new Marshaller(writer);

marshaller.setMapping(map);

marshaller.marshal(bean);

// now restore the value and list what we get

Reader reader = new FileReader(file);

Unmarshaller unmarshaller = new Unmarshaller(map);

FlightBean read = (FlightBean)unmarshaller.unmarshal(reader);

...

} catch (MappingException ex) {

ex.printStackTrace(System.err);

...

         xstream框架在映射中仅需指定特定类与其对应标签的名字即可,其余映射自动完成。对于xstream来说,完成读/写所需要的步骤如下:

XStream xstream = new XStream();

xstream.alias("person", Person.class); //bind class and xml tag

xstream.alias("phonenumber", PhoneNumber.class);

String xml = xstream.toXML(joe); //write

Person joe2 =  (Person)xstream.fromXML(xml); //read

         两种技术的编码都很容易实现。castor利用了mapping文件,在映射取名中更为灵活。但是在物流系统当前的需求中,并不需要特别指定的tag名称。在这一方面,两种技术旗鼓相当。

3.3. xml处理速度对比

         本文作者为了验证两种技术的XML处理速度,专门写了程序进行测试。程序分别对两种技术的读/写进行了测试。其中,需要转换的对象和文本数据如下:

         测试环境:

         XML:

         LP200909100033445

         SHCC

         01000111

         2231691983

         NORMAL

         EXPRESS1

         5500.0

        

                   张三

                   310013

                   0571-88155188

                   13575745195

                  

浙江省^^^杭州市^^^西湖区^^^创业大厦6

                   浙江省

                   杭州市

                   西湖区

                   创业大厦6

        

        

                  

                            TEST8782011122

                            Nokia N73

                            2

                            2000.0

                            颜色:红色;尺寸:L

                  

                  

                            8782011123

                            Nokia N72

                            1

                            1500.0

                            套餐A

                  

        

         STO

         456.0

         true

         2010-08-30 17:23:47.569 CST

         2010-08-30 17:23:47.569 CST

         11111111111111111111111111

         Order.java

public class Order {

         private String orderCode;

         private String wareHouseCode;

         private Integer customerId;

         private Long tradeId;

         private String orderType;

         private String shipping;

         private Double itemsValue;

         private Contact contact;

         private List productList;

         private String companyCode;

         private Double codItemValue;

         private String preSell;

         private String sendStartTime;

         private String sendEndTime;

         private String remark;

    //get & set methods

}

         Item.java

public class Item {

         private String spuCode;

         private String itemName;

         private String itemCount;

         private Double itemValue;

         private String spuName;

    //get & set methods

}

         Contact.java

public class Contact {

         private String contactName;

         private String zipCode;

         private String telephone;

         private String mobilePhone;

         private String address;

         private String province;

         private String city;

         private String country;

         private String adr;

    //get & set methods

}

         测试结果:

 

castor read(ms)

xstream read(ms)

castor write(ms)

xstream write(ms)

10

63

31

31

31

100

297

48

156

47

1000

2328

327

1360

203

10000

22687

3423

14124

1906

100000

224541

32686

136464

19093

1000000

2210592

319271

1435958

196888

         速率差异原因:首先,castor产生的class更大,在类加载过程中消耗的时间将比xstream多得多。其次,castor对于XSD的验证是相当严格的,而xstream则几乎直接忽略任何验证。这些都导致了xstream在效率上大大高于castor

         同时,本文作者还针对多线程情境下的两者的性能进行了比较。比较结果为:

castor read

xstream read

castor write

xstream write

10

78

31

47

31

100

485

110

203

140

1000

3610

1063

1828

1640

         通过锁和唤醒机制保证所有线程同时启动,并作用于两种解析器上,所获得的结果是,读的方面xstream的效率约是castor3.5倍,写的方面两者相差不多,约是castor1.3倍。由于线程数限制,不能进行更大规模的压力测试。

         由此可见,在处理大量数据的时候,xstream/写的效率比castor快了将近7倍。在处理效率方面,xstream技术较castor框架技术优越很多。      

XStream性能进一步优化方案

         通过对xstream应用的研究,本文作者还发现对xstream技术进一步优化的方案。

         首先,xstream支持使用多种XML解析器进行XML解析。通过比较,发现xstream使用的默认XPP3解析器的性能最优。XPP3运用的是拉式的解析,相较于dom解析器的效率优势,可以从如下表格中获得:

 

xpp3 read

dom read

xpp3 write

dom write

10

16

110

15

15

100

46

94

31

31

1000

329

843

203

219

10000

3511

9200

1984

2015

100000

32246

78642

19306

20727

1000000

334222

806337

201244

196269

         在写操作的时候,两者的效率类似,但在读操作的时候,XPP3解析器的效率是dom解析效率的2倍多。

         另一方面,xstream还提供了一个setMode()方法。该方法可以指定xstream在生成对象图的时候是否查找对象引用。在我们的应用中,可以推荐使用setMode(XStream.NO_REFERENCES)。调用该方法之后的性能提升如下表:

 

xpp3 read

xpp3 nr read

xpp3 write

xpp3 nr write

10

16

0

15

16

100

46

16

31

16

1000

329

297

203

250

10000

3511

2855

1984

2077

100000

32246

27210

19306

20539

1000000

334222

276958

201244

197629

         不难看出,该方法在读的时候可以将xstream的效率再提高1.2倍。值得注意的是,当xml中存在重复引用或环时不可用。

其他使用xstream的注意点:

         线程安全方面,根据xstream官方文档显示,xstream技术是线程安全的。但在超高并发应用情境下的线程安全性还需要进行压力测试。

         xstream在文本解析中的缺陷,比如不支持在xml中添加“_”符号,不支持注释。但是这些都可以在程序中避免。

         xstream没有对xml的字符集进行验证,所以对数据的传入和传出进行字符集设置,并反复测试验证是否会出现中文乱码。这一点非常重要。

         测试方面包括正确性测试和压力测试。可以自己编写一个客户端程序,然后通过各种场景数据加护验证正确性。在正确性得到验证的前提下,到专门的环境下进行同淘宝数据级别相仿的压力测试,并提取性能数据。

阅读(4916) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:通过注解简化spring aop织入点的指定

给主人留下些什么吧!~~