天天看点

cglib相关性能测试对比正题:最后

背景: 

继上一篇文章 cglib源码学习交流 

很多同学提出,因中文文档缺乏,导致对文章中的介绍看的不是很明白,更多的只是想了解具体的使用即可。所以趁势写了这篇博文,主要是将cglib中的几个工具类和常用的reflect ,beanutils做一个对比,顺便也介绍一下cglib的相关用法,一举两得,望大家多多支持。

 说明: 该copybean基本包含了java的所有原型对象,基本对象,和常用的bigdecimal,biginteger,总共17个属性。

   定义一个testcallback接口。

 定义测试的模板方法 

   private static final decimalformat integerformat = new decimalformat("#,###");

 说明:

为了测试更加精确,避免因为在一次的循环中进行处理,jvm内存,gc,class装载对测试的影响,有一个warmup的过程,先执行少量的测试方法,这里是执行10次

避免jvm内存gc对测试id影响,这里有restorejvm强制进行一次jvm gc

   private static void restorejvm() {

测试环境说明:

操作系统 linux ccbu-156-49 2.6.18-131.el5.customxen #1 smp tue sep 15 15:46:11 cst 2009 x86_64 x86_64 x86_64 gnu/linux

虚拟8cpu , 5g内存

jdk  1.6.0_18

jvm 参数 

beancopier  (cglib)

propertyutils (apache-common)

beanutils (apache-common)

1.  beancopier  (cglib)

2. propertyutils (apache-common) 

3. beanutils (apache-common)

测试结果: 

测试次数:testcount = 1000 * 1000 = 100万次

beancopier total cost=36,626,000ns , each cost=36ns

propertyutils total cost=18,173,767,000ns , each cost=18173ns

beanutils total cost=31,236,079,000ns , each cost=31236ns

从这个结果可以看出, beancopier是propertyutils的504倍, propertyutils是beanutils的1.71倍, beancopier是propertyutils的861.84倍,差了近3个数量级。

bulkbean (cglib)

beanmap (cglib)

fastclass/fastmethod  (cglib)

未处理的jdk reflect (jdk)

处理的jdk reflect (jdk)

1. bulkbean 

2. beanmap

 3. fastclass/fastmethod

4.  未处理的jdk reflect

5. 处理过的jdk reflect

测试结果:  

测试次数:testcount = 1000 * 1000 * 100 = 1亿次

bulkbean total cost=2,125,759,000ns , each cost=21ns

beanmap total cost=2,730,912,000ns , each cost=27ns

fastclass total cost=2,576,470,000ns , each cost=25ns

未处理过的reflect total cost=2,882,755,000ns , each cost=28ns

处理过的reflect total cost=2,792,828,000ns , each cost=27ns

测试结果,性能相差不多,差距不大,这也可以说明jdk对reflect调用的优化已经做的很棒了。

测试数据仅拱参考,最后测试代码可见附件。测试方法如存在问题,欢迎拍砖