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