AOP Benchmark
1、性能测试的AOP或代理框架
(1)字节码框架
l AspectWerkz 1.0
l AspectWerkz 2.x
l AspectJ 1.2
l JBoss AOP 1.0
(2)代理框架
l Spring AOP 1.1.1
l cglib proxy 2.0.2
l dynaop 1.0beta
(3)AspectWerkz可扩展Aspect容器
l AspectJ
l AOP Alliance
l Spring AOP
2、性能测试结果
AWBench (ns/invocation) | Aspect Werkz2.x | awproxy | Aspect Werkz1.0 | aspectj | jboss | spring | dynaop | cglib | ext: aopalliance | ext: spring | ext: aspectj |
before, args() target() | 10 | 25 | 606 | 10 | 220 | 355 | 390 | 145 | - | 220 | - |
around x 2, args() target() | 80 | 85 | 651 | 50 | 290 | 436 | 455 | 155 | 465 | 476 | - |
before | 15 | 20 | 520 | 15 | 145 | 275 | 320 | 70 | - | 40 | 10 |
before, static info access | 30 | 30 | 501 | 25 | 175 | 275 | 330 | 70 |
| 35 |
|
before, rtti info access | 50 | 55 | 535 | 50 | 175 | 275 | 335 | 75 |
| 35 |
|
after returning | 10 | 20 | 541 | 10 | 135 | 285 | 315 | 85 | - | 45 | 15 |
after throwing | 3540 | 3870 | 6103 | 3009 | 5032 |
| 6709 | 8127 |
| - | 3460 |
before + after | 20 | 30 | 511 | 20 | 160 | 445 | 345 | 80 | - | 35 | 20 |
before, args() primitives | 10 | 20 | 555 | 10 | 195 | 350 | 375 | 145 |
| 210 |
|
before, args() objects | 5 | 25 | 546 | 10 | 185 | 325 | 345 | 115 |
| 200 |
|
around | 60 | 95 | 470 | 10 |
| 225 | 315 | 75 |
| - | 90 |
around, rtti info access | 70 | 70 | 520 | 50 | 140 | 250 | 340 | 80 | 70 | 70 | - |
around, static info access | 80 | 90 | 486 | 25 | 135 | 245 | 330 | 75 | 80 | 80 | - |
下面的表格以AspectWerkz 2.0.RC2-snapshot 作为参考标准:
AWBench (relative %) | Aspect Werkz2.x | awproxy | Aspect werkz1.0 | aspectj | jboss | spring | dynaop | cglib | ext: aopalliance | ext: spring | ext: aspectj |
before, args() target() | 1 x | 2.5 x | 60.6 x | 1 x | 22 x | 35.5 x | 39 x | 14.5 x | - | 22 x | - |
around x 2, args() target() | 1 x | 1 x | 8.1 x | 0.6 x | 3.6 x | 5.4 x | 5.6 x | 1.9 x | 5.8 x | 5.9 x | - |
before | 1 x | 1.3 x | 34.6 x | 1 x | 9.6 x | 18.3 x | 21.3 x | 4.6 x | - | 2.6 x | 0.6 x |
before, static info access | 1 x | 1 x | 16.7 x | 0.8 x | 5.8 x | 9.1 x | 11 x | 2.3 x |
| 1.1 x |
|
before, rtti info access | 1 x | 1.1 x | 10.7 x | 1 x | 3.5 x | 5.5 x | 6.7 x | 1.5 x |
| 0.7 x |
|
after returning | 1 x | 2 x | 54.1 x | 1 x | 13.5 x | 28.5 x | 31.5 x | 8.5 x | - | 4.5 x | 1.5 x |
after throwing | 1 x | 1 x | 1.7 x | 0.8 x | 1.4 x |
| 1.8 x | 2.2 x |
| - | 0.9 x |
before + after | 1 x | 1.5 x | 25.5 x | 1 x | 8 x | 22.2 x | 17.2 x | 4 x | - | 1.7 x | 1 x |
before, args() primitives | 1 x | 2 x | 55.5 x | 1 x | 19.5 x | 35 x | 37.5 x | 14.5 x |
| 21 x |
|
before, args() objects | 1 x | 5 x | 109.2 x | 2 x | 37 x | 65 x | 69 x | 23 x |
| 40 x |
|
around | 1 x | 1.5 x | 7.8 x | 0.1 x |
| 3.7 x | 5.2 x | 1.2 x |
| - | 1.5 x |
around, rtti info access | 1 x | 1 x | 7.4 x | 0.7 x | 2 x | 3.5 x | 4.8 x | 1.1 x | 1 x | 1 x | - |
around, static info access | 1 x | 1.1 x | 6 x | 0.3 x | 1.6 x | 3 x | 4.1 x | 0.9 x | 1 x | 1 x | - |
测试环境:Java HotSpot 1.4.2,Windows 2000 SP4,Pentium M 1.6 GHz,1 G RAM