Skip to content
Skip to breadcrumbs
Skip to header menu
Skip to action menu
Skip to quick search
Quick Search
Browse
Pages
Blog
Labels
Attachments
Mail
Advanced
What’s New
Space Directory
Feed Builder
Keyboard Shortcuts
Confluence Gadgets
Log In
Sign Up
Dashboard
AspectWerkz
Copy Page
You are not logged in. Any changes you make will be marked as
anonymous
. You may want to
Log In
if you already have an account. You can also
Sign Up
for a new account.
This page is being edited by
.
Paragraph
Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Preformatted
Quote
Bold
Italic
Underline
More colours
Strikethrough
Subscript
Superscript
Monospace
Clear Formatting
Bullet list
Numbered list
Outdent
Indent
Align left
Align center
Align right
Link
Table
Insert
Insert Content
Image
Link
Attachment
Symbol
Emoticon
Wiki Markup
Horizontal rule
tinymce.confluence.insert_menu.macro_desc
Info
JIRA Issue
Status
Gallery
Tasklist
Table of Contents
Other Macros
Page Layout
No Layout
Two column (simple)
Two column (simple, left sidebar)
Two column (simple, right sidebar)
Three column (simple)
Two column
Two column (left sidebar)
Two column (right sidebar)
Three column
Three column (left and right sidebars)
Undo
Redo
Find/Replace
Keyboard Shortcuts Help
<h3>The need for performance metrics and comparison</h3> <p>Since we released AspectWerkz 1.0, and more generally for every release of any AOP / interceptor framework (AspectWerkz, AspectJ, JBoss AOP, Spring AOP, cglib, dynaop etc), a question is always raised: <strong>"what is the performance cost of such an approach?"</strong>, <strong>"how much do I loose per method invocation when an advice / interceptor is applied?"</strong>.</p> <p>This is indeed an issue that needs to be carefully addressed, and that in fact has affected the design of every mature enough framework.</p> <p>We are probably all scared by the cost of the <em>java.lang.reflect</em> despite its relative power, and usually, even before starting to evaluate semantics robustness and ease of use in general - we start doing some Hello World bench.</p> <p>We have started <strong>AWbench</strong> for that purpose. Offering a single place to measure the relative performance of AOP/Interceptor frameworks, and measure it by your own.</p> <p>More than providing performance comparison, AWbench is a good place to figure out the semantic differences and ease of use of each framework by using them for the same rather simple purpose. A "line of count" metrics will be provided in a next report.</p> <h3>Current performance results</h3> <p>This table provides the figures from a bench in "nanosecond per advised method invocation". A single method invocation is roughly about 5 ns/iteration on the bench hardware/software that was used. Note that an advised application will have more behavior than just a non advised method so you should not compare non advised version to advised version. AWbench does not provide yet metrics for a <em>hand written</em> implementation of the AOP concepts.</p> <p>The results were obtained with 2 million iterations.</p> <p><strong>In this table, the two first lines in bold are the most important ones. In a real world application, it is likely that the before or around advice will interact with the code it is advising and to be able to do that it needs to access runtime information (contextual information) like method parameters values and target instance. It is also likely that the join point is advised by more than one advice.</strong></p> <p>On the opposite it is very unlikely to have just a before advice that does nothing, but it gives us a good evaluation on the most minimal overhead we can expect.</p> <p><strong>Note:</strong> comparing such results when the difference is small (f.e. 15 ns vs 10 ns) might not be relevant. Before doing so you should run the bench several time and compute an average after removing the smallest and highest measurements. <br class="atl-forced-newline" /></p> <table class="confluenceTable"><tbody> <tr> <th class="confluenceTh"><p>AWBench (ns/invocation)</p></th> <th class="confluenceTh"><p>aspectwerkz</p></th> <th class="confluenceTh"><p>awproxy</p></th> <th class="confluenceTh"><p>aspectwerkz_1_0</p></th> <th class="confluenceTh"><p>aspectj</p></th> <th class="confluenceTh"><p>jboss</p></th> <th class="confluenceTh"><p>spring</p></th> <th class="confluenceTh"><p>dynaop</p></th> <th class="confluenceTh"><p>cglib</p></th> <th class="confluenceTh"><p>ext:aopalliance</p></th> <th class="confluenceTh"><p>ext:spring</p></th> <th class="confluenceTh"><p>ext:aspectj</p></th> </tr> <tr> <td class="confluenceTd"><p><strong>before, args() target()</strong></p></td> <td class="confluenceTd"><p><strong>10</strong></p></td> <td class="confluenceTd"><p><strong>25</strong></p></td> <td class="confluenceTd"><p><strong>606</strong></p></td> <td class="confluenceTd"><p><strong>10</strong></p></td> <td class="confluenceTd"><p><strong>220</strong></p></td> <td class="confluenceTd"><p><strong>355</strong></p></td> <td class="confluenceTd"><p><strong>390</strong></p></td> <td class="confluenceTd"><p><strong>145</strong></p></td> <td class="confluenceTd"><p><strong>-</strong></p></td> <td class="confluenceTd"><p><strong>220</strong></p></td> <td class="confluenceTd"><p><strong>-</strong></p></td> </tr> <tr> <td class="confluenceTd"><p><strong>around x 2, args() target()</strong></p></td> <td class="confluenceTd"><p><strong>80</strong></p></td> <td class="confluenceTd"><p><strong>85</strong></p></td> <td class="confluenceTd"><p><strong>651</strong></p></td> <td class="confluenceTd"><p><strong>50</strong></p></td> <td class="confluenceTd"><p><strong>290</strong></p></td> <td class="confluenceTd"><p><strong>436</strong></p></td> <td class="confluenceTd"><p><strong>455</strong></p></td> <td class="confluenceTd"><p><strong>155</strong></p></td> <td class="confluenceTd"><p><strong>465</strong></p></td> <td class="confluenceTd"><p><strong>476</strong></p></td> <td class="confluenceTd"><p><strong>-</strong></p></td> </tr> <tr> <td class="confluenceTd"><p>before</p></td> <td class="confluenceTd"><p>15</p></td> <td class="confluenceTd"><p>20</p></td> <td class="confluenceTd"><p>520</p></td> <td class="confluenceTd"><p>15</p></td> <td class="confluenceTd"><p>145</p></td> <td class="confluenceTd"><p>275</p></td> <td class="confluenceTd"><p>320</p></td> <td class="confluenceTd"><p>70</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>40</p></td> <td class="confluenceTd"><p>10</p></td> </tr> <tr> <td class="confluenceTd"><p>before, static info access</p></td> <td class="confluenceTd"><p>30</p></td> <td class="confluenceTd"><p>30</p></td> <td class="confluenceTd"><p>501</p></td> <td class="confluenceTd"><p>25</p></td> <td class="confluenceTd"><p>175</p></td> <td class="confluenceTd"><p>275</p></td> <td class="confluenceTd"><p>330</p></td> <td class="confluenceTd"><p>70</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>35</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>before, rtti info access</p></td> <td class="confluenceTd"><p>50</p></td> <td class="confluenceTd"><p>55</p></td> <td class="confluenceTd"><p>535</p></td> <td class="confluenceTd"><p>50</p></td> <td class="confluenceTd"><p>175</p></td> <td class="confluenceTd"><p>275</p></td> <td class="confluenceTd"><p>335</p></td> <td class="confluenceTd"><p>75</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>35</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>after returning</p></td> <td class="confluenceTd"><p>10</p></td> <td class="confluenceTd"><p>20</p></td> <td class="confluenceTd"><p>541</p></td> <td class="confluenceTd"><p>10</p></td> <td class="confluenceTd"><p>135</p></td> <td class="confluenceTd"><p>285</p></td> <td class="confluenceTd"><p>315</p></td> <td class="confluenceTd"><p>85</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>45</p></td> <td class="confluenceTd"><p>15</p></td> </tr> <tr> <td class="confluenceTd"><p>after throwing</p></td> <td class="confluenceTd"><p>3540</p></td> <td class="confluenceTd"><p>3870</p></td> <td class="confluenceTd"><p>6103</p></td> <td class="confluenceTd"><p>3009</p></td> <td class="confluenceTd"><p>5032</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>6709</p></td> <td class="confluenceTd"><p>8127</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>3460</p></td> </tr> <tr> <td class="confluenceTd"><p>before + after</p></td> <td class="confluenceTd"><p>20</p></td> <td class="confluenceTd"><p>30</p></td> <td class="confluenceTd"><p>511</p></td> <td class="confluenceTd"><p>20</p></td> <td class="confluenceTd"><p>160</p></td> <td class="confluenceTd"><p>445</p></td> <td class="confluenceTd"><p>345</p></td> <td class="confluenceTd"><p>80</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>35</p></td> <td class="confluenceTd"><p>20</p></td> </tr> <tr> <td class="confluenceTd"><p>before, args() primitives</p></td> <td class="confluenceTd"><p>10</p></td> <td class="confluenceTd"><p>20</p></td> <td class="confluenceTd"><p>555</p></td> <td class="confluenceTd"><p>10</p></td> <td class="confluenceTd"><p>195</p></td> <td class="confluenceTd"><p>350</p></td> <td class="confluenceTd"><p>375</p></td> <td class="confluenceTd"><p>145</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>210</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>before, args() objects</p></td> <td class="confluenceTd"><p>5</p></td> <td class="confluenceTd"><p>25</p></td> <td class="confluenceTd"><p>546</p></td> <td class="confluenceTd"><p>10</p></td> <td class="confluenceTd"><p>185</p></td> <td class="confluenceTd"><p>325</p></td> <td class="confluenceTd"><p>345</p></td> <td class="confluenceTd"><p>115</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>200</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>around</p></td> <td class="confluenceTd"><p>60</p></td> <td class="confluenceTd"><p>95</p></td> <td class="confluenceTd"><p>470</p></td> <td class="confluenceTd"><p>10</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>225</p></td> <td class="confluenceTd"><p>315</p></td> <td class="confluenceTd"><p>75</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>90</p></td> </tr> <tr> <td class="confluenceTd"><p>around, rtti info access</p></td> <td class="confluenceTd"><p>70</p></td> <td class="confluenceTd"><p>70</p></td> <td class="confluenceTd"><p>520</p></td> <td class="confluenceTd"><p>50</p></td> <td class="confluenceTd"><p>140</p></td> <td class="confluenceTd"><p>250</p></td> <td class="confluenceTd"><p>340</p></td> <td class="confluenceTd"><p>80</p></td> <td class="confluenceTd"><p>70</p></td> <td class="confluenceTd"><p>70</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>around, static info access</p></td> <td class="confluenceTd"><p>80</p></td> <td class="confluenceTd"><p>90</p></td> <td class="confluenceTd"><p>486</p></td> <td class="confluenceTd"><p>25</p></td> <td class="confluenceTd"><p>135</p></td> <td class="confluenceTd"><p>245</p></td> <td class="confluenceTd"><p>330</p></td> <td class="confluenceTd"><p>75</p></td> <td class="confluenceTd"><p>80</p></td> <td class="confluenceTd"><p>80</p></td> <td class="confluenceTd"><p>-</p></td> </tr> </tbody></table> <p><br class="atl-forced-newline" /> This table provides the figures from the same bench where for each category AspectWerkz 2.0.RC2-snapshot is the reference.<br /> The first line illustrates that for the most simple <em>before advice</em>, AspectWerkz is <em>13 times</em> faster than JBoss AOP 1.0. <br class="atl-forced-newline" /></p> <table class="confluenceTable"><tbody> <tr> <th class="confluenceTh"><p>AWBench (relative %)</p></th> <th class="confluenceTh"><p>aspectwerkz</p></th> <th class="confluenceTh"><p>awproxy</p></th> <th class="confluenceTh"><p>aspectwerkz_1_0</p></th> <th class="confluenceTh"><p>aspectj</p></th> <th class="confluenceTh"><p>jboss</p></th> <th class="confluenceTh"><p>spring</p></th> <th class="confluenceTh"><p>dynaop</p></th> <th class="confluenceTh"><p>cglib</p></th> <th class="confluenceTh"><p>ext:aopalliance</p></th> <th class="confluenceTh"><p>ext:spring</p></th> <th class="confluenceTh"><p>ext:aspectj</p></th> </tr> <tr> <td class="confluenceTd"><p><strong>before, args() target()</strong></p></td> <td class="confluenceTd"><p><strong>1 x</strong></p></td> <td class="confluenceTd"><p><strong>2.5 x</strong></p></td> <td class="confluenceTd"><p><strong>60.6 x</strong></p></td> <td class="confluenceTd"><p><strong>1 x</strong></p></td> <td class="confluenceTd"><p><strong>22 x</strong></p></td> <td class="confluenceTd"><p><strong>35.5 x</strong></p></td> <td class="confluenceTd"><p><strong>39 x</strong></p></td> <td class="confluenceTd"><p><strong>14.5 x</strong></p></td> <td class="confluenceTd"><p><strong>-</strong></p></td> <td class="confluenceTd"><p><strong>22 x</strong></p></td> <td class="confluenceTd"><p><strong>-</strong></p></td> </tr> <tr> <td class="confluenceTd"><p><strong>around x 2, args() target()</strong></p></td> <td class="confluenceTd"><p><strong>1 x</strong></p></td> <td class="confluenceTd"><p><strong>1 x</strong></p></td> <td class="confluenceTd"><p><strong>8.1 x</strong></p></td> <td class="confluenceTd"><p><strong>0.6 x</strong></p></td> <td class="confluenceTd"><p><strong>3.6 x</strong></p></td> <td class="confluenceTd"><p><strong>5.4 x</strong></p></td> <td class="confluenceTd"><p><strong>5.6 x</strong></p></td> <td class="confluenceTd"><p><strong>1.9 x</strong></p></td> <td class="confluenceTd"><p><strong>5.8 x</strong></p></td> <td class="confluenceTd"><p><strong>5.9 x</strong></p></td> <td class="confluenceTd"><p><strong>-</strong></p></td> </tr> <tr> <td class="confluenceTd"><p>before</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1.3 x</p></td> <td class="confluenceTd"><p>34.6 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>9.6 x</p></td> <td class="confluenceTd"><p>18.3 x</p></td> <td class="confluenceTd"><p>21.3 x</p></td> <td class="confluenceTd"><p>4.6 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>2.6 x</p></td> <td class="confluenceTd"><p>0.6 x</p></td> </tr> <tr> <td class="confluenceTd"><p>before, static info access</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>16.7 x</p></td> <td class="confluenceTd"><p>0.8 x</p></td> <td class="confluenceTd"><p>5.8 x</p></td> <td class="confluenceTd"><p>9.1 x</p></td> <td class="confluenceTd"><p>11 x</p></td> <td class="confluenceTd"><p>2.3 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>1.1 x</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>before, rtti info access</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1.1 x</p></td> <td class="confluenceTd"><p>10.7 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>3.5 x</p></td> <td class="confluenceTd"><p>5.5 x</p></td> <td class="confluenceTd"><p>6.7 x</p></td> <td class="confluenceTd"><p>1.5 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>0.7 x</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>after returning</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>2 x</p></td> <td class="confluenceTd"><p>54.1 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>13.5 x</p></td> <td class="confluenceTd"><p>28.5 x</p></td> <td class="confluenceTd"><p>31.5 x</p></td> <td class="confluenceTd"><p>8.5 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>4.5 x</p></td> <td class="confluenceTd"><p>1.5 x</p></td> </tr> <tr> <td class="confluenceTd"><p>after throwing</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1.7 x</p></td> <td class="confluenceTd"><p>0.8 x</p></td> <td class="confluenceTd"><p>1.4 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>1.8 x</p></td> <td class="confluenceTd"><p>2.2 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>0.9 x</p></td> </tr> <tr> <td class="confluenceTd"><p>before + after</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1.5 x</p></td> <td class="confluenceTd"><p>25.5 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>8 x</p></td> <td class="confluenceTd"><p>22.2 x</p></td> <td class="confluenceTd"><p>17.2 x</p></td> <td class="confluenceTd"><p>4 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>1.7 x</p></td> <td class="confluenceTd"><p>1 x</p></td> </tr> <tr> <td class="confluenceTd"><p>before, args() primitives</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>2 x</p></td> <td class="confluenceTd"><p>55.5 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>19.5 x</p></td> <td class="confluenceTd"><p>35 x</p></td> <td class="confluenceTd"><p>37.5 x</p></td> <td class="confluenceTd"><p>14.5 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>21 x</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>before, args() objects</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>5 x</p></td> <td class="confluenceTd"><p>109.2 x</p></td> <td class="confluenceTd"><p>2 x</p></td> <td class="confluenceTd"><p>37 x</p></td> <td class="confluenceTd"><p>65 x</p></td> <td class="confluenceTd"><p>69 x</p></td> <td class="confluenceTd"><p>23 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>40 x</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>around</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1.5 x</p></td> <td class="confluenceTd"><p>7.8 x</p></td> <td class="confluenceTd"><p>0.1 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>3.7 x</p></td> <td class="confluenceTd"><p>5.2 x</p></td> <td class="confluenceTd"><p>1.2 x</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>-</p></td> <td class="confluenceTd"><p>1.5 x</p></td> </tr> <tr> <td class="confluenceTd"><p>around, rtti info access</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>7.4 x</p></td> <td class="confluenceTd"><p>0.7 x</p></td> <td class="confluenceTd"><p>2 x</p></td> <td class="confluenceTd"><p>3.5 x</p></td> <td class="confluenceTd"><p>4.8 x</p></td> <td class="confluenceTd"><p>1.1 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>-</p></td> </tr> <tr> <td class="confluenceTd"><p>around, static info access</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1.1 x</p></td> <td class="confluenceTd"><p>6 x</p></td> <td class="confluenceTd"><p>0.3 x</p></td> <td class="confluenceTd"><p>1.6 x</p></td> <td class="confluenceTd"><p>3 x</p></td> <td class="confluenceTd"><p>4.1 x</p></td> <td class="confluenceTd"><p>0.9 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>1 x</p></td> <td class="confluenceTd"><p>-</p></td> </tr> </tbody></table> <p>Bench were run on a Java HotSpot 1.4.2, Windows 2000 SP4, Pentium M 1.6 GHz, 1 Go RAM.</p> <p><strong>Notes:</strong></p> <ul> <li>Some figures are not available when the underlying framework does not allow the feature. For the <em>ext:</em> ones, that can be due to pending work (AOP alliance interfaces can emulate a before advice just as it is the case in JBoss AOP).</li> <li>after throwing advice appears to be slow since it first, is an overhead in throwing the exception (user code) and second, in catching the exception and do an <em>instanceof</em> to check the exception type (advice code).</li> <li>latest run: Dec 20, 2004, as per Spring Framework team feedback.</li> </ul> <h3>AWbench internals</h3> <h4>Summary</h4> <p>AWbench is a micro benchmark suite, which aims at staying simple. The test application is very simple, and AWbench is mainly the glue around the test application that applies one or more <em>very simple</em> advice / interceptor of the framework of your choice.</p> <p>AWbench comes with an <strong>Ant script</strong> that allows you to run it on you own box, and provide some improvement if you know some for a particular framework.</p> <h4>What is the scope for the benchmark?</h4> <p>So far, AWbench includes <strong>method execution</strong> pointcuts, since <strong>call side</strong> pointcuts are not supported by proxy based framework (Spring AOP, cglib, dynaop etc).</p> <p>The <em>awbench.method.Execution</em> class is the test application, and contains one method per construct to bench. An important fact is that bytecode based AOP may provide much better performance for <strong>before advice</strong> and <strong>after advice</strong>, as well as much better performance when it comes to <strong>accessing contextual information</strong>. <br /> Indeed, proxy based frameworks are very likely to use reflection to give the user access to intercepted method parameters at runtime from within an advice, while bytecode based AOP may use more advanced constructs to provide access at the speed of a statically compiled access.</p> <p>The current scope is thus:</p> <p>For method execution pointcut</p> <table class="confluenceTable"><tbody> <tr> <th class="confluenceTh"><p>Construct </p></th> <th class="confluenceTh"><p> Contextual information access </p></th> <th class="confluenceTh"><p> Notes </p></th> </tr> <tr> <td class="confluenceTd"><p> </p></td> <td class="confluenceTd"><p> </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <td class="confluenceTd"><p><strong>before advice</strong> </p></td> <td class="confluenceTd"><p> none </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <td class="confluenceTd"><p>before advice </p></td> <td class="confluenceTd"><p> static information (method signature etc) </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <td class="confluenceTd"><p>before advice </p></td> <td class="confluenceTd"><p> contextual information accessed reflectively </p></td> <td class="confluenceTd"><p> Likely to use of casting and unboxing of primitives </p></td> </tr> <tr> <td class="confluenceTd"><p>before advice </p></td> <td class="confluenceTd"><p> contextual information accessed with explicit framework capabilities </p></td> <td class="confluenceTd"><p> Only supported by AspectJ and AspectWerkz 2.x</p></td> </tr> <tr> <th class="confluenceTh"><p> </p></th> <th class="confluenceTh"><p> </p></th> <th class="confluenceTh"><p> </p></th> </tr> <tr> <td class="confluenceTd"><p><strong>after advice</strong> </p></td> <td class="confluenceTd"><p> none </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <td class="confluenceTd"><p>after returning advice </p></td> <td class="confluenceTd"><p> return value </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <td class="confluenceTd"><p>after throwing advice </p></td> <td class="confluenceTd"><p> exception instance </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <th class="confluenceTh"><p> </p></th> <th class="confluenceTh"><p> </p></th> <th class="confluenceTh"><p> </p></th> </tr> <tr> <td class="confluenceTd"><p> <strong>before + after advice</strong> </p></td> <td class="confluenceTd"><p> none </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <th class="confluenceTh"><p> </p></th> <th class="confluenceTh"><p> </p></th> <th class="confluenceTh"><p> </p></th> </tr> <tr> <td class="confluenceTd"><p> <strong>around advice</strong> </p></td> <td class="confluenceTd"><p> optimized </p></td> <td class="confluenceTd"><p> AspectJ and AspetWerkz 2.x provides specific optimizations (thisJoinPointStaticPart vs thisJoinPoint) </p></td> </tr> <tr> <td class="confluenceTd"><p> around advice </p></td> <td class="confluenceTd"><p> non optimizezd </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <th class="confluenceTh"><p> </p></th> <th class="confluenceTh"><p> </p></th> <th class="confluenceTh"><p> </p></th> </tr> <tr> <td class="confluenceTd"><p> 2 around advice </p></td> <td class="confluenceTd"><p> contextual information </p></td> <td class="confluenceTd"><p> </p></td> </tr> </tbody></table> <p>By accessing contextual information we means:</p> <ul> <li>accessing a method parameter using its real type (i.e. boxing and unboxing might be needed)</li> <li>accessing a the advised instance using its real type (i.e. casting might be needed)</li> </ul> <p>A pseudo code block is thus likely to be:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> class awbench.method.Execution { int m_field; void before(int i) { // very simple test application method body - does not vary m_field++; } } class XXframework { // might be optimized by some framework using lazy instantiation .. interceptWithoutContextualInformationAccess(..) { // very simple advice body - does not vary awbench.Run.staticIntField++; } .. interceptWithReflectiveContextualInformationAccess(.., XXInvocation invocation, ..) { // very simple advice body - does not vary awbench.Run.staticIntField++; // reflective access to target instance and intercepted method argument Execution target = (Execution) invocation.getTarget(); int arg0 = (int) (Integer(invocation.getArgument_0())).intValue(); } // may not be supported by all framework .. interceptWithDirectContextualInformationAccess(.., Execution executionTargetInstance, int arg0Intercepted, ..) { // very simple advice body - does not vary awbench.Run.staticIntField++; // direct access to target instance and intercepted method argument thru rich framework facilities Execution target = executionTargetInstance; // no casting int arg0 = arg0Intercepted; // no casting } } </pre></td></tr></table> <h4>Which AOP and Proxy frameworks are benched?</h4> <p>The following are included in AWbench:</p> <p>Bytecode based frameworks</p> <table class="confluenceTable"><tbody> <tr> <th class="confluenceTh"><p>Framework </p></th> <th class="confluenceTh"><p> URL </p></th> </tr> <tr> <td class="confluenceTd"><p> AspectWerkz 1.0 </p></td> <td class="confluenceTd"> <a class="external-link" href="http://aspectwerkz.codehaus.org" rel="nofollow">http://aspectwerkz.codehaus.org</a> </td> </tr> <tr> <td class="confluenceTd"><p> AspectWerkz 2.x </p></td> <td class="confluenceTd"> <a class="external-link" href="http://aspectwerkz.codehaus.org" rel="nofollow">http://aspectwerkz.codehaus.org</a> </td> </tr> <tr> <td class="confluenceTd"><p> AspectJ (1.2) </p></td> <td class="confluenceTd"> <a class="external-link" href="http://eclipse.org/aspectj/" rel="nofollow">http://eclipse.org/aspectj/</a> </td> </tr> <tr> <td class="confluenceTd"><p> JBoss AOP (1.0) </p></td> <td class="confluenceTd"> <a class="external-link" href="http://www.jboss.org/developers/projects/jboss/aop" rel="nofollow">http://www.jboss.org/developers/projects/jboss/aop</a> </td> </tr> </tbody></table> <p>Proxy based frameworks</p> <table class="confluenceTable"><tbody> <tr> <th class="confluenceTh"><p>Framework </p></th> <th class="confluenceTh"><p> URL </p></th> </tr> <tr> <td class="confluenceTd"><p> Spring AOP (1.1.1) </p></td> <td class="confluenceTd"> <a class="external-link" href="http://www.springframework.org/" rel="nofollow">http://www.springframework.org/</a> </td> </tr> <tr> <td class="confluenceTd"><p> cglib proxy (2.0.2) </p></td> <td class="confluenceTd"> <a class="external-link" href="http://cglib.sourceforge.net/" rel="nofollow">http://cglib.sourceforge.net/</a> </td> </tr> <tr> <td class="confluenceTd"><p> dynaop (1.0 beta) </p></td> <td class="confluenceTd"> <a class="external-link" href="https://dynaop.dev.java.net/" rel="nofollow">https://dynaop.dev.java.net/</a> </td> </tr> </tbody></table> <p>Moreover, AWbench includes AspectWerkz Extensible Aspect Container that allow to run any Aspect / Interceptor framework within the AspectWerkz 2.x runtime:</p> <table class="confluenceTable"><tbody> <tr> <th class="confluenceTh"><p> AspectWerkz Extensible Aspect Container running </p></th> <th class="confluenceTh"><p> Notes</p></th> </tr> <tr> <td class="confluenceTd"><p> AspectJ </p></td> <td class="confluenceTd"><p> </p></td> </tr> <tr> <td class="confluenceTd"><p> AOP Alliance </p></td> <td class="confluenceTd"> <a class="external-link" href="http://aopalliance.sourceforge.net/" rel="nofollow">http://aopalliance.sourceforge.net/</a> </td> </tr> <tr> <td class="confluenceTd"><p> Spring AOP </p></td> <td class="confluenceTd"><p> </p></td> </tr> </tbody></table> <p>AWbench is extensible. Refer to the <strong>How to contribute?</strong> section (below) for more info on how to add your framework to the bench.</p> <h3>What's next ?</h3> <h4>Running awbench by your own</h4> <p>AWBench is released under LGPL.<br /> There will never be a distribution of it, but source can be checked out:</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> cvs -d :pserver:anonymous@cvs.aspectwerkz.codehaus.org:/home/projects/aspectwerkz/scm login cvs -z3 -d :pserver:anonymous@cvs.aspectwerkz.codehaus.org:/home/projects/aspectwerkz/scm co awbench </pre></td></tr></table> <p>Once checked out, you can run the bench using several different Ant target</p> <table class="wysiwyg-macro" data-macro-name="code" data-macro-default-parameter="java" style="background-image: url(/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre> ant run ant run:aspectwerkz ant run:aspectj ant run:jboss ant run:ext:aspectj ant run:ext:spring ant run:ext:aopalliance ant run:cglib ant run:spring ant run:dynaop ant run:all </pre></td></tr></table> <h4>How to contribute?</h4> <p>If you notice some optimizations for one of the implementation by respecting the requirements, we will add the fix in awbench and update the results accordingly.</p> <p>If you are willing to write a non-AOP, non-Proxy based version of this bench so that a comparison between AOP approach and regular OO design patterns is possible send us an email.</p> <h4>Limitations</h4> <p>The current implementation is not covering fine grained deployment models like <em>perInstance / perTarget</em>, whose underlying implementation are unlikely to be neutral on performance results.</p>
Please type the word appearing in the picture.
Attachments
Labels
Location
Watch this page
< Edit
Preview >
Loading…
Save
Cancel
Next hint
search
attachments
weblink
advanced