一直在用cglib,突然想起来还没有测试过他的效率到底如何,所以稍微测试了一下
对于有11个成员变量的bean,一个是直接使用java的反射读取,另一个是使用cglib转换beanMap以后直接使用get读取。(详细结果见下表)
可以看出, cglib 的效率是 直接反射的3倍(字节码编程确实很厉害!)另外,cglib的beanMap在初次创建一个类的缓存时会耗费一定的时间(300ms),之后使用了缓存,再创建相同的bean就不再有多余的时间消耗了。
|
cglib |
反射 |
cglib |
反射 |
cglib |
反射 |
|
循环10000次 |
100000 |
1000000 |
时间(毫秒) |
344 |
156 |
719 |
1234 |
4203 |
11531 |
时间(毫秒) |
47 |
125 |
438 |
1218 |
3859 |
11391 |
时间(毫秒) |
31 |
125 |
407 |
1406 |
3781 |
11500 |
时间(毫秒) |
47 |
125 |
437 |
1250 |
3797 |
11484 |
时间(毫秒) |
47 |
125 |
407 |
1218 |
3781 |
11547 |
时间(毫秒) |
31 |
125 |
438 |
1219 |
3781 |
11469 |
时间(毫秒) |
31 |
125 |
421 |
1157 |
4438 |
11453 |
时间(毫秒) |
31 |
110 |
390 |
1172 |
3797 |
11406 |
时间(毫秒) |
47 |
125 |
406 |
1172 |
3797 |
11484 |
时间(毫秒) |
31 |
125 |
391 |
1156 |
3891 |
11609 |
时间(毫秒) |
47 |
125 |
391 |
1172 |
4172 |
11328 |
时间(毫秒) |
31 |
125 |
406 |
1234 |
3813 |
11343 |
时间(毫秒) |
31 |
125 |
407 |
1203 |
3813 |
11437 |
时间(毫秒) |
32 |
218 |
422 |
1203 |
3782 |
11797 |
时间(毫秒) |
78 |
235 |
438 |
1500 |
3953 |
11906 |
时间(毫秒) |
62 |
125 |
406 |
1922 |
4094 |
11515 |
时间(毫秒) |
47 |
125 |
469 |
1375 |
3844 |
11531 |
时间(毫秒) |
31 |
125 |
437 |
1266 |
3797 |
11766 |
时间(毫秒) |
47 |
110 |
437 |
1266 |
3781 |
11594 |
时间(毫秒) |
47 |
109 |
406 |
1344 |
3781 |
11453 |
总平均: |
57 |
134.4 |
434 |
1284 |
3898 |
11527.2 |
两者的速度比: |
0.424107143 |
0.33764161 |
0.33813502 |
除第一次平均: |
41.89 |
|
419 |
|
3882 |
|
初次多用时: |
302.1 |
|
300 |
|
321.3 |
|
public class CglibSpeedTest {
int size = 1000000;
List catchList = null;
public List<SettleSubs> getInitData() {
if (catchList != null ) {
return catchList;
}
catchList = new ArrayList<SettleSubs>(size);
for (int i = 0; i < size; i++) {
SettleSubs settle = new SettleSubs();;
settle.setBuyorsell ("s1s");
settle.setClientId ("s2s");
settle.setContractId ("s3s");
settle.setDayStr ("s4s");
settle.setDetailSeq (1 );
settle.setContractType("s5s");
settle.setCsgWarehouse("s6s");
settle.setDealPrice (2 );
settle.setSettlePrice (3 );
settle.setTotalQtt (4 );
settle.setRcptQtt (5 );
settle.setFrzCsgQtt (6 );
settle.setDepositAmt (7 );
settle.setSubsBalance (8 );
settle.setConveyQtt (9 );
settle.setCnyBalance (10 );
catchList.add(settle);
}
return catchList;
}
public long testReflectance() throws Exception {
List<SettleSubs> list = getInitData();
// System.out.println("开始" + DateUtil.format(new Date()));
long start = System.currentTimeMillis();
Class clazz = SettleSubs.class;
List<Method> listMethods = new ArrayList<Method>();
for (Method method : clazz.getMethods()) {
if (method.getName().startsWith("get")) {
listMethods.add(method);
}
}
for (SettleSubs settle: list) {
// StringBuilder sb = new StringBuilder();
for (Method method : listMethods) {
method.invoke(settle);
}
// System.out.println(sb);
}
// System.out.println(System.currentTimeMillis() - start);
// System.out.println("完成:" + DateUtil.format(new Date()));
return System.currentTimeMillis() - start;
}
public long testCglib() throws Exception {
List<SettleSubs> list = getInitData();
// System.out.println("开始" + DateUtil.format(new Date()));
long start = System.currentTimeMillis();
Set keyset = BeanMap.create(list.get(0)).keySet();
for (SettleSubs settle: list) {
BeanMap map = BeanMap.create(settle);
for (Object key : keyset) {
map.get(key);
}
}
// System.out.println(System.currentTimeMillis() - start);
// System.out.println("完成:" + DateUtil.format(new Date()));
return System.currentTimeMillis() - start;
}
public static void main(String[] args) throws Exception {
// new CglibSpeedTest().testReflectance();
CglibSpeedTest test = new CglibSpeedTest();
System.out.println("次数:" + test.size);
for (int i = 0; i < 20; i++) {
System.out.println(test.testCglib() + "\t" + test.testReflectance());
}
}
}
分享到:
相关推荐
实现MethodInterceptor简单的aop 分别用cglib和反射实现了一下
该资源里面有Jdk动态代理,cglib动态代理,反射和拦截器(链)示例,里面也有所需要的jar包,下载下来导入eclipse即可运行,有问题请问我
CGLIB简介CGLIB简介CGLIB简介CGLIB简介CGLIB简介
CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
spring-bean 源码依赖的jar包,用于spring源码部署的时候使用
cglib包及依赖汉cglib3.1和asm4.2,主要作用是用户代理,代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。...
CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要...
开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4...
赠送jar包:cglib-3.1.jar; 赠送原API文档:cglib-3.1-javadoc.jar; 赠送源代码:cglib-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-3.1.pom; 包含翻译后的API文档:cglib-3.1-javadoc-API文档-中文(简体)版...
代理模式详解-jdk与cglib动态代理与底层实现,spring中常用的设计模式,本案例是从源码到代理模式的实现。
cglib
cglib.zip
jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,...
cglib 的jar包,用于做动态代理的,但是版本太高不知道会不会有影响
cglib-3.2.5.jar、cglib-nodep-3.2.5.jar、cglib-RELEASE_3_2_5.tar.gz(源码)、cglib-RELEASE_3_2_5.zip(源码)
基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...
Spring源码出错,缺失cglib.3.2.6 与 objenesis.2.6这两个jar包,下载后放入eclipse提示的工程的相应路径即可
里面包含完整的cglib-nodep-2.2.jar和asm-2.2.3.jar,放心下载
CGLIB-DOC,CGLIB说明文件.
Cglib最新版本的2个jar包,分别是cglib-3.3.0.jar和cglib-nodep-3.3.0.jar,压缩后上传,方便大家使用。