幾個動態代理Proxy工具效能比較
動態代理現在基本是Java技術的核心模式,AOP模式的主要實現方式。現在我們使用Spring EJB3 Hibernate等大部分框架都有動態代理在其中,只不過表現方式在使用時並不明顯。
JDK本身有提供動態代理的API,但是因為效能或功能不夠突出,所以,這些框架就是要專門位元組碼庫Code Generation Library,Code Generation Library,目前主要有CGLib (基於ASM)和Javassist。
現在JDK 6.0版本效能比以前1.4有很大提高,最近我使用這篇文章中Why do you think CGLib proxies are faster than JDK Proxies?的測試程式碼分別對JDK和CGLib Javassist三個動態代理效能進行了測試,發現驚人的結果,並不是說位元組碼庫效能肯定比JDK快,至少Javassist慢。
JDK與CGLib 測試程式碼在TSS文章中有,我改為Javassist和JDK測試如下:
測試結果如下:
JDK 6和CGLib cglib-nodep-2.2.jar對比結果:
JDK Proxy: 1,049,937 calls/s
CGLIB: 2,820,130 calls/s
如果使用cglib以前版本,效能更快:
JDK Proxy: 1,037,575 calls/s
CGLIB: 3,112,727 calls/s
而JDK 6和JavaAssit 3.11測試結果如下:
JDK Proxy: 1,037,575 calls/s
JAVAASSIST: 626,695 calls/s
JAVAASSIST竟然慢於JDK 6,驚人。
要命的是,Hibernate 3.3以後版本使用JavaAssit,因為兩家都是JBoss公司的緣故吧,http://opensource.atlassian.com/projects/hibernate/browse/HHH-2506,看來Hibernate這個好東西被收購後,開始有問題了。
Tapstry5也是使用JAVAASSIST,Javassist vs. Every Other Bytecode Library Out There
最佳化效能的每一步,點點積累,就會形成大效果。
JDK本身有提供動態代理的API,但是因為效能或功能不夠突出,所以,這些框架就是要專門位元組碼庫Code Generation Library,Code Generation Library,目前主要有CGLib (基於ASM)和Javassist。
現在JDK 6.0版本效能比以前1.4有很大提高,最近我使用這篇文章中Why do you think CGLib proxies are faster than JDK Proxies?的測試程式碼分別對JDK和CGLib Javassist三個動態代理效能進行了測試,發現驚人的結果,並不是說位元組碼庫效能肯定比JDK快,至少Javassist慢。
JDK與CGLib 測試程式碼在TSS文章中有,我改為Javassist和JDK測試如下:
public class ProxyPerformanceComparison2 { public static void main(String[] args) throws Exception { Callable<Integer> jdkProxy = (Callable<Integer>) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Callable.class }, new JdkHandler(new Counter())); ProxyFactory f = new ProxyFactory(); f.setInterfaces(new Class[] { Callable.class }); Class c = f.createClass(); Callable<Integer> cglibProxy = (Callable<Integer>) c.newInstance(); ((ProxyObject) cglibProxy).setHandler(new JavaAssitInterceptor(new Counter())); for (int i2 = 0; i2 < 10; i2++) { iterate(jdkProxy, "JDK Proxy: "); iterate(cglibProxy, "JAVAASSIST: "); System.err.println(); } } static final DecimalFormat format = new DecimalFormat(); static void iterate(Callable<Integer> callable, String label) throws Exception { int count = 10000000; long time = System.currentTimeMillis(); int total = 0; for (int i = 0; i < count; i++) { total += callable.call(); } time = System.currentTimeMillis() - time; System.err.println(label + format.format(count * 1000 / time) + " calls/s"); } static class JdkHandler implements InvocationHandler { final Object delegate; JdkHandler(Object delegate) { this.delegate = delegate; } public Object invoke(Object object, Method method, Object[] objects) throws Throwable { return method.invoke(delegate, objects); } } static class JavaAssitInterceptor implements MethodHandler { final Object delegate; JavaAssitInterceptor(Object delegate) { this.delegate = delegate; } public Object invoke(Object self, Method m, Method proceed, Object[] args) throws Throwable { return m.invoke(delegate, args); } } static class Counter implements Callable<Integer> { int count = 0; public Integer call() throws Exception { return count++; } } } <p class="indent"> |
測試結果如下:
JDK 6和CGLib cglib-nodep-2.2.jar對比結果:
JDK Proxy: 1,049,937 calls/s
CGLIB: 2,820,130 calls/s
如果使用cglib以前版本,效能更快:
JDK Proxy: 1,037,575 calls/s
CGLIB: 3,112,727 calls/s
而JDK 6和JavaAssit 3.11測試結果如下:
JDK Proxy: 1,037,575 calls/s
JAVAASSIST: 626,695 calls/s
JAVAASSIST竟然慢於JDK 6,驚人。
要命的是,Hibernate 3.3以後版本使用JavaAssit,因為兩家都是JBoss公司的緣故吧,http://opensource.atlassian.com/projects/hibernate/browse/HHH-2506,看來Hibernate這個好東西被收購後,開始有問題了。
Tapstry5也是使用JAVAASSIST,Javassist vs. Every Other Bytecode Library Out There
最佳化效能的每一步,點點積累,就會形成大效果。
[該貼被banq於2009-10-16 13:02修改過]
相關文章
- 幾個比較火的BI分析工具
- Java動態代理 jdk和cglib的實現比較JavaJDKCGLib
- Java幾種常用JSON庫效能比較JavaJSON
- 資料分析領域幾個常用工具比較
- 動態代理jdk的Proxy與spring的CGlibJDKSpringCGLib
- 效能比較
- Cesium 比較常用的幾個方法
- Java JDK Proxy和CGLib動態代理示例講解JavaJDKCGLib
- Java進階 | Proxy動態代理機制詳解Java
- 幾款前端IDE工具:Sublime、Atom、VSCode比較前端IDEVSCode
- ETL 幾種工具的比較(Kettle,Talend,Informatica )ORM
- Java代理設計模式(Proxy)的四種具體實現:靜態代理和動態代理Java設計模式
- HTTP協議幾個版本的比較HTTP協議
- (重要)關於效能的幾個主要動態檢視
- (十七)關於動態代理,你能說出動態代理的幾種方式?
- 推薦幾款比較實用的工具,網站網站
- Java實體對映工具MapStruct 與BeanUtils效能比較JavaStructBean
- 幾種排序的比較排序
- Apache與Nginx的優缺點、效能比較,到底選擇哪個比較好?ApacheNginx
- java動態代理基本原理及proxy原始碼分析一Java原始碼
- Java提高班(六)反射和動態代理(JDK Proxy和Cglib)Java反射JDKCGLib
- java動態代理——代理方法的假設和驗證及Proxy原始碼分析五Java原始碼
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- 四個id 生成器效能比較記錄
- python 批量resize效能比較Python
- 一個比較float是否相等的工具類
- Java中幾個常用併發佇列比較 | BaeldungJava佇列
- 《Proxy系列專題》:代理模式(靜態、JDK、CGLib)模式JDKCGLib
- 代理模式詳解:靜態代理、JDK動態代理與Cglib動態代理模式JDKCGLib
- 請比較下for、forEach、for of的效能的效能
- 兔子動態代理ip伺服器要遵循幾個關鍵步驟伺服器
- 靜態代理和動態代理
- JAVA 靜態代理 & 動態代理Java
- 代理模式(Proxy)模式
- Java中List集合效能比較Java
- 排序演算法效能比較排序演算法
- 代理模式 - 動態代理模式
- 2023版:深度比較幾種.NET Excel匯出庫的效能差異Excel
- 動態代理