CGLib的性能看来比较差

红薯 发布于 2010/03/14 22:42
阅读 4K+
收藏 5

CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。

下面是一段典型的用 CGLib 扩展指定类的方法:

@SuppressWarnings("unchecked")
private static <T> T createProxy(Class<T> targetClass){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetClass);
        enhancer.setCallback(new MyMethodInterceptor());
        return (T)enhancer.create();
}

在我本机上测试发现,这个方法的执行至少都要耗费 150-250 毫秒,另外调用返回对象的方法又需要耗费 50 毫秒左右。

而如果你直接构造一个指定类的对象,然后调用它的方法,这个时间的耗费可以忽略不计。

如此看来,不应该在运行时频繁调用这种方法,否则程序的执行效率会很差。

加载中
0
红薯
红薯

不知道这是不是新版本的 Hibernate 要抛弃 CGLib,而直接使用 ASM 的原因呢?

0
穿越星辰
穿越星辰

这点消耗会影响性能吗?

0
红薯
红薯

引用来自“hcom”的帖子

这点消耗会影响性能吗?

看情况,有些会,有些不会!

0
AiSun
AiSun

CGLib 可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成?

额。。。。可能是我孤陋寡闻了,您这句话的意思是Hibernate可以实现运行时期的PO动态改变吗?

0
AiSun
AiSun

请教:您在文章中提到“CGLib 可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成”

额。。。。可能是我孤陋寡闻了,您这句话的意思是Hibernate可以实现运行时期的PO动态改变吗?

0
黑桃
黑桃

红薯只运行了一次吧?这样测不是很准确,应该丢掉第一次,测后面构造对象的速度,我这边测试平均值是低于0.1ms

邸星星
邸星星
回复 @邸星星 : 不过想想这个一般也就用一次,@红薯 我冤枉你了
邸星星
邸星星
是啊 这样的测试对cglib不公平
0
newtypelv_9
newtypelv_9

用javassist代替cglib

0
邸星星
邸星星
再用asm代替javassist
0
sunyh
sunyh
反正 反射 就慢。
返回顶部
顶部