背景:
继上一篇文章 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调用的优化已经做的很棒了。
测试数据仅拱参考,最后测试代码可见附件。测试方法如存在问题,欢迎拍砖