- 浏览: 295559 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
msdn19880714:
楼主你是逗逼么,像你这样比较,直接被气死了
不小心被Cglib忽悠了(已纠正错误2009-3-1) -
javacainiaosc:
网上关于coherence的资料太少了,刚刚入手学习,感谢楼主 ...
Coherence企业级缓存(一) 特点 -
108439162:
不得不说,可能博主自己觉得这样做很牛逼了。但是你忘了依赖注入的 ...
我的开发经验分享(一)-Spring业务bean零配置 -
u010980147:
为什么不告诉我们要导入的包?你做截屏的时候顺道包impor ...
Mule web service调用中的复杂类型传递 -
bigtian:
现在办理社保转移好像没有当年这么麻烦了,国家出台了新的法律了。 ...
作为程序员看社保跨地区转移的问题
最新添加(2009-3-1),纠正文章错误 http://www.iteye.com/topic/336082
原帖
1. 背景 大家都知道,Java的反射调用性能要远低于直接对象调用,一般慢10-20倍多,但很多地方反射调用又是必须的,例如:BeanUtils.copyValues,ORM框架底层等对象映射创建等。因此有的开源框架通过asm等代码生成方式来优化Java反射调用的性能。
cglib中提供了Fast反射功能,包括FastClass,FastMethod等,替代 Java的标准实现,以图提高性能。
2. 问题
但我在实测中发现,cglib的Fast反射框架性能反而不如 JDK的标准反射实现.
测试用例:对ManageLogVO的两个实例进行copyValue,其中第一个是标准方式创建和复制,第二个通过反射方式创建和赋值。
分别采用 Java直接对象操作: testCopyValue();
JDK标准反射调用, testCopyValueUseReflection();
Cglib Fast反射: testCopyValueUseCglib();
执行10000次,尽量模拟真实环境情况。
3. 测试结果
下面是实测结果,记录执行10000次总耗用时间:
testCopyValue 31ms
testCopyValueUseReflection 609ms
testCopyValueUseCglib 922ms
反射耗时是直接操作的20倍,Fast反射更是对象直接操作的30倍。
4 代码片段:
1) 直接操作(共8个属性操作,限于篇幅只列出2个):
2) JDK 反射
3) Cglib Fast反射
通过JProfiler分析,结果类似,并且可以发现 FastClass.getMethod(), FastClass.create(),FastMethod.invoke() 分别是耗时大户,造成性能低下。
5 优化建议:
我的测试用例,基本模拟了真实ORM框架下的一些操作。instance每次创建,method每次都要查找,而由于 getMethod是性能消耗的主要地方,因此,可以考虑对Method做缓存处理,无论对于 JDK反射还是 Cglib fast反射都有一倍以上的性能提高。
谢谢提醒。贴子首部已增加声明。
100倍,这个倒不假!
不小心被楼主忽悠了。感谢sdh5724
真心接受批评,并感谢 sdh5724 指正。
好久没看这个贴了,用 sdh5724 提醒的方式 beanCopier 复制,效率很高,是标准Java反射调用的 1/5.
10000次对象复制测试结果(ms):
task 直接复制 31
task java标准反射复制 610
task cglib Fast复制(不好的写法) 890
task cglib beancopier复制 125
多谢提醒。java bean值拷贝时你的方法不错,稍后我也测一下。
不知一般的反射调用,比如:加载配置文件中的类和值定义,初始化到内存对象中,有没有更好的办法(cglib我还没挖掘透,呵呵),就像你提到的 BeanCopier, ps 我指的是一般意义上比较基础的反射操作。
引用
真心接受批评,并感谢 sdh5724 指正。
好久没看这个贴了,用 sdh5724 提醒的方式 beanCopier 复制,效率很高,是标准Java反射调用的 1/5.
10000次对象复制测试结果(ms):
task 直接复制 31
task java标准反射复制 610
task cglib Fast复制(不好的写法) 890
task cglib beancopier复制 125
好久没看这个贴了,用 sdh5724 提醒的方式 beanCopier 复制,效率很高,是标准Java反射调用的 1/5.
10000次对象复制测试结果(ms):
task 直接复制 31
task java标准反射复制 610
task cglib Fast复制(不好的写法) 890
task cglib beancopier复制 125
原帖
1. 背景 大家都知道,Java的反射调用性能要远低于直接对象调用,一般慢10-20倍多,但很多地方反射调用又是必须的,例如:BeanUtils.copyValues,ORM框架底层等对象映射创建等。因此有的开源框架通过asm等代码生成方式来优化Java反射调用的性能。
cglib中提供了Fast反射功能,包括FastClass,FastMethod等,替代 Java的标准实现,以图提高性能。
2. 问题
但我在实测中发现,cglib的Fast反射框架性能反而不如 JDK的标准反射实现.
测试用例:对ManageLogVO的两个实例进行copyValue,其中第一个是标准方式创建和复制,第二个通过反射方式创建和赋值。
分别采用 Java直接对象操作: testCopyValue();
JDK标准反射调用, testCopyValueUseReflection();
Cglib Fast反射: testCopyValueUseCglib();
执行10000次,尽量模拟真实环境情况。
3. 测试结果
下面是实测结果,记录执行10000次总耗用时间:
testCopyValue 31ms
testCopyValueUseReflection 609ms
testCopyValueUseCglib 922ms
反射耗时是直接操作的20倍,Fast反射更是对象直接操作的30倍。
4 代码片段:
1) 直接操作(共8个属性操作,限于篇幅只列出2个):
ManagelogVO newVO = new ManagelogVO(); newVO.setLogid(managelogVO.getLogid()); newVO.setOprcode(managelogVO.getOprcode());
2) JDK 反射
Object o = null; try { Class clazz = Class.forName("demo.cglib.ManagelogVO"); o = clazz.newInstance(); Method setterMethod = null; Method getterMethod = null; Object v = null; setterMethod = clazz.getMethod("setLogid", new Class[]{Long.class}); getterMethod = clazz.getMethod("getLogid", null); v = getterMethod.invoke(managelogVO, null); setterMethod.invoke(o, new Object[]{v}); setterMethod = clazz.getMethod("setOprcode", new Class[]{String.class}); getterMethod = clazz.getMethod("getOprcode", null); v = getterMethod.invoke(managelogVO, null); setterMethod.invoke(o, new Object[]{v});
3) Cglib Fast反射
Object o = null; try { Class clazz0 = Class.forName("demo.cglib.ManagelogVO"); // FastClass clazz = FastClass.create(clazz0); o = clazz.newInstance(); FastMethod setterMethod = null; FastMethod getterMethod = null; Object v = null; setterMethod = clazz.getMethod("setLogid", new Class[]{Long.class}); getterMethod = clazz.getMethod("getLogid", null); v = getterMethod.invoke(managelogVO, new Object[]{}); setterMethod.invoke(o, new Object[]{v}); setterMethod = clazz.getMethod("setOprcode", new Class[]{String.class}); getterMethod = clazz.getMethod("getOprcode", null); v = getterMethod.invoke(managelogVO, new Object[]{}); setterMethod.invoke(o, new Object[]{v});
通过JProfiler分析,结果类似,并且可以发现 FastClass.getMethod(), FastClass.create(),FastMethod.invoke() 分别是耗时大户,造成性能低下。
5 优化建议:
我的测试用例,基本模拟了真实ORM框架下的一些操作。instance每次创建,method每次都要查找,而由于 getMethod是性能消耗的主要地方,因此,可以考虑对Method做缓存处理,无论对于 JDK反射还是 Cglib fast反射都有一倍以上的性能提高。
评论
18 楼
msdn19880714
2014-04-30
楼主你是逗逼么,像你这样比较,直接被气死了
17 楼
raymond2006k
2009-03-03
raiha 写道
幸亏我看了回帖,楼主编辑一下主贴吧 ,别再误导了不看回帖的主
谢谢提醒。贴子首部已增加声明。
16 楼
case0079
2009-03-03
这样作的话不公平啊
15 楼
raiha
2009-03-02
幸亏我看了回帖,楼主编辑一下主贴吧 ,别再误导了不看回帖的主
14 楼
starfeng
2009-02-26
半桶水,耸人听闻,误人子弟.
13 楼
niwei
2009-02-25
sdh5724 写道
我曾经做的测试结果是100倍。。。。估计JDK的版本, 还有OS版本的影响。你可以测试下, JAVA5/6 OS 32/64的差异。 很大的。
100倍,这个倒不假!
12 楼
sdh5724
2009-02-22
我曾经做的测试结果是100倍。。。。估计JDK的版本, 还有OS版本的影响。你可以测试下, JAVA5/6 OS 32/64的差异。 很大的。
11 楼
raymond2006k
2009-02-20
Scriptlet 写道
不小心被楼主忽悠了。感谢sdh5724
真心接受批评,并感谢 sdh5724 指正。
好久没看这个贴了,用 sdh5724 提醒的方式 beanCopier 复制,效率很高,是标准Java反射调用的 1/5.
10000次对象复制测试结果(ms):
task 直接复制 31
task java标准反射复制 610
task cglib Fast复制(不好的写法) 890
task cglib beancopier复制 125
10 楼
Scriptlet
2009-02-20
不小心被楼主忽悠了。
感谢sdh5724
感谢sdh5724
9 楼
zhu_chen001
2009-02-19
在数据对象的反射上我使用的是field的setValue方法,这样的速度我测试过一般数据对象可以达到每秒反射4万次以上,可以达到压力测试的要求,但是beanUtil的反射慢多了,但是功能相对来说很强大
8 楼
sdh5724
2009-02-17
很多中间对象需要你的CACHE的, 不能像你这么写代码。这么比没有什么意义。 CGLIB还有功能是为了实现AOP, 这个东西出现在JDKPROXY之前, 无所谓睡优秀的问题。
7 楼
raymond2006k
2009-01-13
sdh5724 写道
都像你这么写代码, 还有什么比较地位, CGLIB根本不是这么用的。 CGLIB创建对象是非常消耗时间的。 在一个应用服务器里, 基本是创建一次class, 怎么会像你这样, 把把都是CREATE一个。
求求大家, 别把业界公认的高速度的东西写不规范的代码来比较。 做性能测试有很多前提的, 不能乱CALL API。 要遵循人家的API使用规则。
而且, 对象COPY根本不是这么写的,
BeanCopier :
class MyBeanCopy{
static BeanCopier copy = BeanCopier.create(Bean.class, Bean2.class, false);
void beanCopies(Object source , Object target){
copy.copy(source, target, null);
}
}
求求大家, 别把业界公认的高速度的东西写不规范的代码来比较。 做性能测试有很多前提的, 不能乱CALL API。 要遵循人家的API使用规则。
而且, 对象COPY根本不是这么写的,
BeanCopier :
class MyBeanCopy{
static BeanCopier copy = BeanCopier.create(Bean.class, Bean2.class, false);
void beanCopies(Object source , Object target){
copy.copy(source, target, null);
}
}
多谢提醒。java bean值拷贝时你的方法不错,稍后我也测一下。
不知一般的反射调用,比如:加载配置文件中的类和值定义,初始化到内存对象中,有没有更好的办法(cglib我还没挖掘透,呵呵),就像你提到的 BeanCopier, ps 我指的是一般意义上比较基础的反射操作。
6 楼
jltest
2009-01-12
对象不是有个clone的功能么
5 楼
sdh5724
2009-01-12
都像你这么写代码, 还有什么比较地位, CGLIB根本不是这么用的。 CGLIB创建对象是非常消耗时间的。 在一个应用服务器里, 基本是创建一次class, 怎么会像你这样, 把把都是CREATE一个。
求求大家, 别把业界公认的高速度的东西写不规范的代码来比较。 做性能测试有很多前提的, 不能乱CALL API。 要遵循人家的API使用规则。
而且, 对象COPY根本不是这么写的,
BeanCopier :
class MyBeanCopy{
static BeanCopier copy = BeanCopier.create(Bean.class, Bean2.class, false);
void beanCopies(Object source , Object target){
copy.copy(source, target, null);
}
}
求求大家, 别把业界公认的高速度的东西写不规范的代码来比较。 做性能测试有很多前提的, 不能乱CALL API。 要遵循人家的API使用规则。
而且, 对象COPY根本不是这么写的,
BeanCopier :
class MyBeanCopy{
static BeanCopier copy = BeanCopier.create(Bean.class, Bean2.class, false);
void beanCopies(Object source , Object target){
copy.copy(source, target, null);
}
}
4 楼
raymond2006k
2009-01-12
不知大家有没有搜罗更高效的解决办法。
3 楼
repsihWDX
2009-01-12
cglib慢在构造fastclass
java实现慢在getMethod和检查
java实现慢在getMethod和检查
2 楼
joachimz
2009-01-12
getMethod过程中,会构建大量对象,加剧gc,因此缓存Method会有较明显的效果。
1 楼
javatracker
2009-01-12
我的测试结果是JDK反射getMethod耗时是method.invoke的10倍以上,method.invoke耗时是直接调用的100倍以上,method.invoke耗时是fastMethod的2倍不到,也就是说fastMethod比直接反射要快一些,但如果直接反射不作检查的话性能会提高一倍,比fastMethod要快一点
发表评论
-
Velocity常见问题
2011-02-09 11:31 01. foreach循环里set临 时变量碰到null的问题 ... -
Web安全纪要
2011-01-25 17:05 01.HttpOnly Using Java to Set H ... -
Eclipse 插件开发技巧
2010-12-19 13:42 01. 菜单和toolbar <action ... -
InfoQ刚发表一篇论文《半静态语言–原理和价值分析》
2010-12-11 22:38 1899半静态语言 – 背景、原理和价值 (Semi-Static L ... -
Xml 的两类应用场景
2010-11-16 09:24 2335Xml 有两类应用场景 1 解析配置文件 这类场景侧重满 ... -
对敏捷的一点看法
2010-10-22 10:50 152810月14日敏捷中国2010 ... -
Apache项目提交流程
2010-08-21 09:47 0要将自己的项目提交给A ... -
Java应用性能问题技巧
2010-07-28 14:38 01. XML 解析时,会到 jar/META-INF/ 下去找 ... -
maven archetype 创建
2010-07-15 09:40 01. 创建一个 archetype 项目 mvn arche ... -
ConcurrentTest并发测试框架介绍
2010-07-10 23:58 1922ConcurrentTest Sourceforge Li ... -
使用Eclipse WTP进行快速Web开发(3)- 开发演示
2010-06-09 13:08 6396使用Eclipse WTP进行快速Web开发(3) 在前 ... -
使用Eclipse WTP进行快速Web开发(2)-准备演示项目
2010-06-08 18:19 4265目前,很多项目基于 maven 进行开发,构建和发布。 而 ... -
使用Eclipse WTP进行快速Web开发(1) - 配置Tomcat
2010-06-08 18:18 8672使用Eclipse WTP进行快速We ... -
使用Eclipse WTP进行快速Web开发
2010-06-08 17:38 0使用Eclipse WTP进行快速Web开发 -
WebBeans 规范适合我们吗?
2010-02-28 21:23 1563JavaEE6 规范已经正式获得通过了,其中一个亮点就是 ... -
认识WebBean ---- 定义
2010-02-16 13:07 3717Gavin King在开发 Seam ... -
YY一下今年技术上想做的事情
2010-01-30 14:15 2909去年下半年除了基 ... -
Java同步锁一个技巧
2010-01-30 11:02 4780Synchronized 同步 Java5开始虽然引入了高 ... -
key-value 型数据库
2010-01-03 22:54 0key-value 型数据库 Tokyo Tyrant Li ... -
HSql的schema
2010-01-03 16:33 1386前段时间被HSql的Schema问题搞的头大。今天梳理一下 ...
相关推荐
赠送jar包:cglib-nodep-3.2.4.jar; 赠送原API文档:cglib-nodep-3.2.4-javadoc.jar; 赠送源代码:cglib-nodep-3.2.4-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.2.4.pom; 包含翻译后的API文档:cglib-...
开发工具 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-nodep-3.1.jar; 赠送原API文档:cglib-nodep-3.1-javadoc.jar; 赠送源代码:cglib-nodep-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.1.pom; 包含翻译后的API文档:cglib-nodep-...
赠送jar包:cglib-nodep-3.1.jar; 赠送原API文档:cglib-nodep-3.1-javadoc.jar; 赠送源代码:cglib-nodep-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.1.pom; 包含翻译后的API文档:cglib-nodep-...
CGLIB-nodep-2.2.jar是CGLIB的一个无依赖版本,"nodep"即"no dependency"的缩写,意味着这个版本的CGLIB不包含任何外部依赖,只包含了CGLIB自身的核心功能。这对于那些希望减少项目依赖和减小应用体积的开发者来说...
赠送jar包:cglib-nodep-3.2.4.jar; 赠送原API文档:cglib-nodep-3.2.4-javadoc.jar; 赠送源代码:cglib-nodep-3.2.4-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.2.4.pom; 包含翻译后的API文档:cglib-...
赠送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文档-中文(简体)版...
cglib-nodep-2.2.3.jar cglig 库文件
赠送jar包:cglib-3.3.0.jar; 赠送原API文档:cglib-3.3.0-javadoc.jar; 赠送源代码:cglib-3.3.0-sources.jar; 赠送Maven依赖信息文件:cglib-3.3.0.pom; 包含翻译后的API文档:cglib-3.3.0-javadoc-API文档-...
在这里,我们有两个版本,即cglib-full-2.0和cglib-full-2.0.2。通常,更新的版本修复了旧版本中的bug,可能提供了新的特性和性能优化。从2.0到2.0.2,可能会包含一些稳定性改进和兼容性调整。 5. **使用步骤** -...
`cglib-nodep-2.2.jar` 和 `cglib-2.2.0.jar` 是CGLib的两个不同版本。`nodep` 在这里表示 "no dependencies",即无依赖版,意味着这个版本的CGLib不包含对其他库的依赖,开发者需要自行引入必要的依赖。而`cglib-...
赠送jar包:cglib-3.3.0.jar; 赠送原API文档:cglib-3.3.0-javadoc.jar; 赠送源代码:cglib-3.3.0-sources.jar; 赠送Maven依赖信息文件:cglib-3.3.0.pom; 包含翻译后的API文档:cglib-3.3.0-javadoc-API文档-...
在这个问题中,我们遇到了两个关键的jar包:`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`。这两个jar包对于理解Spring框架的工作原理以及它们在实际应用中的作用至关重要。 首先,`spring-...
CGlib-nodep-2.1_3.jar 是一个与Java编程相关的库,主要用来扩展Java反射功能,特别是在处理面向切面编程(AOP)时。它是一个无依赖(nodep)版本,意味着它包含了所有必需的类,无需额外导入其他库,如ASM库。这个...
JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源...
【标题】"cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar" 提供的是一组用于Java编程的库,它们主要用于实现动态代理和字节码操作。 【描述】"cglib动态代理模式jar包 cglib-2.2.jar asm-tree.jar asm-...
在深入理解`spring-cglib-repack-3.2.4.jar`和`spring-objenesis-repack-2.5.1.jar`这两个jar包之前,我们先来了解一下Spring框架的核心概念。 Spring框架的核心包括依赖注入(Dependency Injection,DI)和面向切...
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。...