AOP 底層技術性能測試與比較

Spring對AOP的支持

Spring中AOP代理由Spring的IOC容器負責生成、管理,其依賴關係也由IOC容器負責管理。因此,AOP代理可以直接使用容器中的其它bean實例作爲目標,這種關係可由IOC容器的依賴注入提供。Spring創建代理的規則爲:

1、默認使用Java動態代理來創建AOP代理,這樣就可以爲任何接口實例創建代理了
2、當需要代理的類不是代理接口的時候,Spring會切換爲使用CGLIB代理,也可強制使用CGLIB

SpringAOP侷限性

只能對spring管理的bean增加aop功能

AOP 底層技術比較

AOP技術 功能 性能 面向接口編程 編程難度 使用場合
直接編輯class 文件 完全控制類 無明顯性能代價 不要求 高,要求對 class 文件結構和 Java 字節碼有深刻了解 對class字節碼結構深入瞭解,且只需要改動很小
JDK Instrument 完全控制類 無論是否改寫,每個類裝入時都要執行 hook 程序 不要求 高,要求對 class 文件結構和 Java 字節碼有深刻了解 更適用於監控和控制虛擬機的行爲
JDK Proxy 只能改寫 method 反射引入性能代價 要求
ASM 幾乎能完全控制類 無明顯性能代價 不要求 中,能操縱需要改寫部分的 Java 字節碼

動態代理技術的層級關係

ASM –> cglib –> springAOP
ASM –> AspectJ
javassit –> JBoss AOP

性能比較

  • 創建動態代理類:
    ASM>JDK Proxy >Javassist Proxy >Javassist Bytecode Proxy>Cglib Proxy

測試數據:(JDK-1.6.0_18-b07, ASM-3.3, CGLIB-2.2, JAVAASSIST-3.11.0.GA )
Create JDK Proxy: 13 ms
Create CGLIB Proxy: 182 ms
Create JAVAASSIST Proxy: 96 ms
Create JAVAASSIST Bytecode Proxy: 111 ms
Create ASM Proxy: 2 ms

測試數據:(JDK-1.7.0_79, ASM-3.3.1, CGLIB-2.2, JAVAASSIST-3.12.0.GA )
Create JDK Proxy: 13 ms
Create CGLIB Proxy: 217 ms
Create JAVAASSIST Proxy: 99 ms
Create JAVAASSIST Bytecode Proxy: 168 ms
Create ASM Proxy: 3 ms

  • 運行動態代理類:
    Javassist Bytecode Proxy>ASM >Cglib > JDK > Javassist Proxy

測試數據:
(JDK-1.6.0_18-b07, ASM-3.3, CGLIB-2.2, JAVAASSIST-3.11.0.GA )
Run JDK Proxy: 2224 ms, 634,022 t/s
Run CGLIB Proxy: 1123 ms, 1,255,623 t/s
Run JAVAASSIST Proxy: 3212 ms, 438,999 t/s
Run JAVAASSIST Bytecode Proxy: 206 ms, 6,844,977 t/s
Run ASM Bytecode Proxy: 209 ms, 6,746,724 t/s

測試數據:(JDK-1.7.0_79, ASM-3.3.1, CGLIB-2.2, JAVAASSIST-3.12.0.GA )
Run JDK Proxy: 105 ms, 13,429,194 t/s
Run CGLIB Proxy: 87 ms, 16,207,648 t/s
Run JAVAASSIST Proxy: 431 ms, 3,271,613 t/s
Run JAVAASSIST Bytecode Proxy: 56 ms, 25,179,739 t/s
Run ASM Bytecode Proxy: 67 ms, 21,045,752 t/s

注:左側爲更底層,右側爲更高層

  • 差異原因:
    各方案生成的字節碼有很大區別,其中JDK和CGLIB在實現時包裝了自己的一些類,邏輯比較複雜,所以生成的字節碼非常大,而用javassist和asm生成的字節碼非常小,所以速度快。

參考資料:

http://javatar.iteye.com/blog/814426/
https://www.ibm.com/developerworks/cn/java/j-lo-asm30/

發佈了31 篇原創文章 · 獲贊 12 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章