<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body link="#355491" alink="#4262a1" vlink="#355491" style="background: #e2e2e2; margin: 0; padding: 20px;">

<div>
        <table cellpadding="0" bgcolor="#FFFFFF" border="0" cellspacing="0" style="border: 1px solid #dadada; margin-bottom: 30px; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                <tbody>
                        <tr>

                                <td>

                                        <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" style="border: solid 2px #ccc; background: #dadada; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                                                <tbody>
                                                        <tr>
                                                                <td bgcolor="#000000" valign="middle" height="58px" style="border-bottom: 1px solid #ccc; padding: 20px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 5px; -webkit-border-top-left-radius: 5px;">
                                                                        <h1 style="color: #333333; font: bold 22px Arial, Helvetica, sans-serif; margin: 0; display: block !important;">
                                                                        <!-- To have a header image/logo replace the name below with your img tag -->
                                                                        <!-- Email clients will render the images when the message is read so any image -->
                                                                        <!-- must be made available on a public server, so that all recipients can load the image. -->
                                                                        <a href="http://community.jboss.org/index.jspa" style="text-decoration: none; color: #E1E1E1">Community</a></h1>
                                                                </td>

                                                        </tr>
                                                        <tr>
                                                                <td bgcolor="#FFFFFF" style="font: normal 12px Arial, Helvetica, sans-serif; color:#333333; padding: 20px;  -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px;"><h3 style="margin: 10px 0 5px; font-size: 17px; font-weight: normal;">
    JBoss Reflect Performance Javassist vs Introspection
</h3>
<span style="margin-bottom: 10px;">
    reply from <a href="http://community.jboss.org/people/kabir.khan%40jboss.com">Kabir Khan</a> in <i>JBoss Microcontainer Development</i> - <a href="http://community.jboss.org/message/542552#542552">View the full discussion</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><blockquote class="jive-quote"><p>Kabir Khan wrote:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>I have done some performance measurements where I compare the times taken creating the following class, using javassist.bytecode.* and asm</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><div> </div><pre class="jive-pre"><code class="jive-code jive-java"><span style="color: navy;"><strong>public</strong></span> <span style="color: navy;"><strong>class</strong></span> JavassistMethod1 <span style="color: navy;"><strong>implements</strong></span> JavassistMethod
<span style="color: navy;">{</span> 
&#160; <span style="color: navy;"><strong>public</strong></span> Object invoke(Object target, Object[] args) <span style="color: navy;"><strong>throws</strong></span> Throwable
&#160; <span style="color: navy;">{</span>&#160;&#160;&#160;&#160; 
&#160;&#160;&#160;&#160;&#160; <span style="color: navy;"><strong>return</strong></span> Integer.valueOf(((SomeClass)target).someMethod(((Integer)args[0]).intValue(), (String)args[1])).intValue();
&#160; <span style="color: navy;">}</span>
<span style="color: navy;">}</span> 
</code></pre>
<div> </div>
<div> </div>
<div>Which would be used to call the method:</div>
<pre class="jive-pre"><code class="jive-code jive-java">&#160;&#160;&#160; <span style="color: navy;"><strong>int</strong></span> someMethod(<span style="color: navy;"><strong>int</strong></span> i, String);
</code></pre>
<div> </div>
<div> </div>
<div>The basic flow for what I do for both approaches is the same, whereby I do the following lots of times to generate lots of similar classes:</div>
<div> </div>
<div> </div>
<div>A) - Create class structure</div>
<div>B) - Add default constructor with body to call super</div>
<div>C) - Add invoke method</div>
<div>C1) - Add invoke method body</div>
<div>D) - Convert class structure from A) into byte[]</div>
<div>E) - Define java.lang.Class by calling ClassLoader.defineClass()</div>
<div>F) - Call Class.newInstance()</div>
</blockquote><p>Chiba has done some great work on creating a new API for Javassist tailor made to create new classes. Taking the defining of the class and instantiating it out of the equation (since that is JVM stuff out of our control), so we do A-D so we have the bytes ready to create the class the times are now for creating 20000 JavassistMethod implementations</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><table border="1" cellpadding="3" cellspacing="0" style="width: 100%; border: 1px solid #000000;"><tbody><tr><th align="center" style="background-color: #6690bc;" valign="middle"><span style="color: #ffffff;"><strong>ASM</strong></span></th><th align="center" style="background-color: #6690bc;" valign="middle"><span style="color: #ffffff;"><strong>Javassist ClassFile</strong></span></th><th align="center" style="background-color: #6690bc;" valign="middle"><span style="color: #ffffff; font-weight: 800; ">JavassistClassFileWriter</span></th></tr><tr><td>476</td><td>1030</td><td>356</td></tr><tr><td>613</td><td>1056</td><td>269</td></tr><tr><td>483</td><td>1076</td><td>309</td></tr><tr><td>464</td><td>1001</td><td>357</td></tr><tr><td>383</td><td>1186</td><td>315</td></tr></tbody></table><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>I have attached the modified benchmark</p></div>

<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
    <p style="margin: 0;">Reply to this message by <a href="http://community.jboss.org/message/542552#542552">going to Community</a></p>
        <p style="margin: 0;">Start a new discussion in JBoss Microcontainer Development at <a href="http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2115">Community</a></p>
</div></td>
                        </tr>
                    </tbody>
                </table>


                </td>
            </tr>
        </tbody>
    </table>

</div>

</body>
</html>