设为首页收藏本站language 语言切换
查看: 2738|回复: 0
收起左侧

菜鸟课堂:几个动态代理Proxy工具性能比较

[复制链接]
发表于 2010-2-20 15:09:06 | 显示全部楼层 |阅读模式
<p >动态代理现在基本是Java技术的核心模式,AOP模式的主要实现方式。现在我们使用Spring EJB3 Hibernate等大部分框架都有动态代理在其中,只不过表现方式在使用时并不明显。<p ><p >JDK本身有提供动态代理的API,但是因为性能或功能不够突出,所以,这些框架就是要专门字节码库Code Generation Library,Code Generation Library,目前主要有CGLib (基于ASM)和Javassist。<p ><p >现在JDK 6.0版本性能比以前1.4有很大提高,最近我使用这篇文章中Why do you think CGLib proxies are faster than JDK Proxies?的测试代码分别对JDK和CGLib Javassist三个动态代理性能进行了测试,发现惊人的结果,并不是说字节码库性能肯定比JDK快,至少Javassist慢。<p ><p >JDK与CGLib 测试代码在TSS文章中有,我改为Javassist和JDK测试如下:<p ><p >public class ProxyPerformanceComparison2 {<p >        public static void main(String[] args) throws Exception {<p >                Callable<Integer> jdkProxy = (Callable<Integer>)<p > Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] {<p > Callable.class },<p >                                new JdkHandler(new Counter()));<p >                ProxyFactory f = new ProxyFactory();<p >                f.setInterfaces(new Class[] { Callable.class });<p >                Class c = f.createClass();<p >                Callable<Integer> cglibProxy = (Callable<Integer>) c.newInstance();<p >                ((ProxyObject) cglibProxy).setHandler<p >                  (new JavaAssitInterceptor(new Counter()));<p >                for (int i2 = 0; i2 < 10; i2++) {<p >                        iterate(jdkProxy, "JDK Proxy: ");<p >                        iterate(cglibProxy, "JAVAASSIST:     ");<p >                        System.err.println();<p >                }<p >        }<p >        static final DecimalFormat format = new DecimalFormat();<p >        static void iterate(Callable<Integer> callable, String label)<p > throws Exception {<p >                int count = 10000000;<p >                long time = System.currentTimeMillis();<p >                int total = 0;<p >                for (int i = 0; i < count; i++) {<p >                        total += callable.call();<p >                }<p >                time = System.currentTimeMillis() - time;<p >                System.err.println(label + format.format<p >                  (count * 1000 / time) + " calls/s");<p >        }<p >        static class JdkHandler implements InvocationHandler {        <p >        final Object delegate;<p >                JdkHandler(Object delegate) {<p >                        this.delegate = delegate;<p >                }<p >                public Object invoke<p >(Object object, Method method, Object[] objects) throws Throwable {<p >                        return method.invoke(delegate, objects);<p >                }<p >        }<p >        static class JavaAssitInterceptor implements MethodHandler {<p >                final Object delegate;<p >                JavaAssitInterceptor(Object delegate) {<p >                        this.delegate = delegate;<p >                }<p >                public Object invoke<p >(Object self, Method m, Method proceed, Object[] args) throws Throwable {<p >                        return m.invoke(delegate, args);<p >                }<p >        }<p >        static class Counter implements Callable<Integer> {<p >                int count = 0;<p >                public Integer call() throws Exception {<p >                        return count++;<p >                }<p >        }<p >}<p ><p >测试结果如下:<p ><p >JDK 6和CGLib cglib-nodep-2.2.jar对比结果:<p >JDK Proxy: 1,049,937 calls/s<p >CGLIB: 2,820,130 calls/s<p ><p >如果使用cglib以前版本,性能更快:<p >JDK Proxy: 1,037,575 calls/s<p >CGLIB: 3,112,727 calls/s<p ><p >而JDK 6和JavaAssit 3.11测试结果如下:<p >JDK Proxy: 1,037,575 calls/s<p >JAVAASSIST: 626,695 calls/s<p ><p >JAVAASSIST竟然慢于JDK 6,惊人。<p ><p >要命的是,Hibernate 3.3以后版本使用JavaAssit,因为两家都是JBoss公司的缘故吧,http://opensource.atlassian.com/projects/hibernate/browse/HHH-2506,看来Hibernate这个好东西被收购后,开始有问题了。<p ><p >Tapstry5也是使用JAVAASSIST,Javassist vs. Every Other Bytecode Library Out There<p ><p >优化性能的每一步,点点积累,就会形成大效果。<p ><p >< align=right></P><p align="center"></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-6 07:17 , Processed in 0.814420 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表