can you add asm and run benchmark 10 times?

*Romain Manni-Bucau*
*Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
*Blog: **http://rmannibucau.wordpress.com/*<http://rmannibucau.wordpress.com/>
*LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
*Github: https://github.com/rmannibucau*



2013/8/1 James Carman <ja...@carmanconsulting.com>

> This is rudimentary off the top of my head, but the following code
> produces this output:
>
> It took a total of 9.022382 seconds using $Proxy0.
> It took a total of 5.528322 seconds using
> TestAnnotationTrainer$Foo$$EnhancerByCGLIB$$c462c19e.
> It took a total of 5.084160 seconds using JavassistUtilsGenerated_1.
>
> I'm sure it's not the most scientific, but it's a start.
>
> private static void benchmark(Foo[] foos, long n)
>     {
>         final long totals[] = new long[foos.length];
>         for (int count = 0; count < n; ++count)
>         {
>             for (int i = 0; i < foos.length; i++)
>             {
>                 Foo foo = foos[i];
>                 final long before = System.nanoTime();
>                 for (int j = 0; j < 10000; ++j)
>                 {
>                     foo.bar();
>                 }
>                 totals[i] += System.nanoTime() - before;
>             }
>         }
>         for (int i = 0; i < foos.length; i++)
>         {
>             Foo foo = foos[i];
>             System.out.println(String.format("It took a total of %f
> seconds using %s.", totals[i] / 1000000000.0,
> foo.getClass().getSimpleName()));
>         }
>     }
>
>
> //----------------------------------------------------------------------------------------------------------------------
> // Inner Classes
>
> //----------------------------------------------------------------------------------------------------------------------
>
>     public static interface Foo
>     {
>         public void bar();
>     }
>
>     public static class FooImpl implements Foo
>     {
>         @Override
>         public void bar()
>         {
>
>         }
>     }
>
>
> //----------------------------------------------------------------------------------------------------------------------
> // main() method
>
> //----------------------------------------------------------------------------------------------------------------------
>
>     public static void main(String[] args)
>     {
>         CglibProxyFactory cglib = new CglibProxyFactory();
>         JdkProxyFactory jdk = new JdkProxyFactory();
>         JavassistProxyFactory javassist = new JavassistProxyFactory();
>         ObjectProvider<Foo> provider =
> ObjectProviderUtils.<Foo>constant(new FooImpl());
>         Foo cglibFoo = cglib.createDelegatorProxy(provider, Foo.class);
>         Foo jdkFoo = jdk.createDelegatorProxy(provider, Foo.class);
>         Foo javassistFoo = javassist.createDelegatorProxy(provider,
> Foo.class);
>
>         final Foo[] foos = new Foo[]{jdkFoo, cglibFoo, javassistFoo};
>
>         benchmark(foos, 100000);
>
>
>     }
> }
>
> On Thu, Aug 1, 2013 at 11:15 AM, Romain Manni-Bucau
> <rmannibu...@gmail.com> wrote:
> > hehe, do you have figures?
> >
> > when JIT did its work reflection is almost free. You can update the asm
> > proxy factory to handle 3 implementations but it is not worth it IMO
> >
> > *Romain Manni-Bucau*
> > *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> > *Blog: **http://rmannibucau.wordpress.com/*<
> http://rmannibucau.wordpress.com/>
> > *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> > *Github: https://github.com/rmannibucau*
> >
> >
> >
> > 2013/8/1 James Carman <ja...@carmanconsulting.com>
> >
> >> You're going to lose the benefit of having ASM if you just end up
> >> using reflection to call the methods anyway aren't you?  The Javassist
> >> code actually generates Java code that actually calls the real method
> >> on an instance of the appropriate type.  That's what makes it faster.
> >>
> >> On Thu, Aug 1, 2013 at 10:57 AM, Romain Manni-Bucau
> >> <rmannibu...@gmail.com> wrote:
> >> > No, but believe me you want a handler (this one or invoker) to
> maintain
> >> the
> >> > code and keep it easy.
> >> >
> >> > *Romain Manni-Bucau*
> >> > *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> >> > *Blog: **http://rmannibucau.wordpress.com/*<
> >> http://rmannibucau.wordpress.com/>
> >> > *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> >> > *Github: https://github.com/rmannibucau*
> >> >
> >> >
> >> >
> >> > 2013/8/1 Matt Benson <gudnabr...@gmail.com>
> >> >
> >> >> That's my point; it doesn't.
> >> >>
> >> >>
> >> >> On Thu, Aug 1, 2013 at 9:49 AM, James Carman <
> >> ja...@carmanconsulting.com
> >> >> >wrote:
> >> >>
> >> >> > Does the ASM API require a java.lang.reflect.InvocationHandler?
> >> >> >
> >> >> > On Thu, Aug 1, 2013 at 10:41 AM, Romain Manni-Bucau
> >> >> > <rmannibu...@gmail.com> wrote:
> >> >> > > Well for the maintainance it is easier (and not really slower) to
> >> use a
> >> >> > > little abstraction. InvocationHandler/Inoker is fine. Since
> JdkProxy
> >> >> uses
> >> >> > > the exact same code i throught it could be shared.
> >> >> > >
> >> >> > > *Romain Manni-Bucau*
> >> >> > > *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> >> >> > > *Blog: **http://rmannibucau.wordpress.com/*<
> >> >> > http://rmannibucau.wordpress.com/>
> >> >> > > *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> >> >> > > *Github: https://github.com/rmannibucau*
> >> >> > >
> >> >> > >
> >> >> > >
> >> >> > > 2013/8/1 Matt Benson <gudnabr...@gmail.com>
> >> >> > >
> >> >> > >> The behavior of proxies is specified by Invokers,
> ObjectProviders,
> >> and
> >> >> > >> Interceptors. Each ProxyFactory implementation bridges from
> these
> >> >> > >> interfaces to the most appropriate mechanism specific to the
> target
> >> >> > >> technology. In the case of ASM, I would think that would be
> direct
> >> >> calls
> >> >> > >> against the proxy interface implementations themselves.
> >> >> > >>
> >> >> > >> Matt
> >> >> > >> On Aug 1, 2013 9:21 AM, "Romain Manni-Bucau" <
> >> rmannibu...@gmail.com>
> >> >> > >> wrote:
> >> >> > >>
> >> >> > >>> a sed shold almost work but the issue is the same: the code is
> >> >> > >>> duplicated, no? is there invoker elsewhere?
> >> >> > >>>
> >> >> > >>> *Romain Manni-Bucau*
> >> >> > >>> *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> >> >> > >>> *Blog: **http://rmannibucau.wordpress.com/*<
> >> >> > http://rmannibucau.wordpress.com/>
> >> >> > >>> *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> >> >> > >>> *Github: https://github.com/rmannibucau*
> >> >> > >>>
> >> >> > >>>
> >> >> > >>>
> >> >> > >>> 2013/8/1 Matt Benson <gudnabr...@gmail.com>
> >> >> > >>>
> >> >> > >>>> But is there some technical reason why it's helpful for ASM
> >> proxies
> >> >> to
> >> >> > >>>> use
> >> >> > >>>> InvocationHandler specifically?  Why wouldn't they just use
> >> Invoker
> >> >> > >>>> directly?
> >> >> > >>>>
> >> >> > >>>> Matt
> >> >> > >>>>
> >> >> > >>>>
> >> >> > >>>> On Thu, Aug 1, 2013 at 8:51 AM, Romain Manni-Bucau <
> >> >> > >>>> rmannibu...@gmail.com>wrote:
> >> >> > >>>>
> >> >> > >>>> > +1
> >> >> > >>>> >
> >> >> > >>>> > jdkproxyfactory can even be hardcoded as a default IMO
> (without
> >> >> > using
> >> >> > >>>> the
> >> >> > >>>> > SPI)
> >> >> > >>>> >
> >> >> > >>>> >
> >> >> > >>>> > *Romain Manni-Bucau*
> >> >> > >>>> > *Twitter: @rmannibucau <https://twitter.com/rmannibucau>*
> >> >> > >>>> > *Blog: **http://rmannibucau.wordpress.com/*<
> >> >> > >>>> > http://rmannibucau.wordpress.com/>
> >> >> > >>>> > *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> >> >> > >>>> > *Github: https://github.com/rmannibucau*
> >> >> > >>>> >
> >> >> > >>>> >
> >> >> > >>>> >
> >> >> > >>>> > 2013/8/1 James Carman <ja...@carmanconsulting.com>
> >> >> > >>>> >
> >> >> > >>>> > > You mean all the InvocationHandler classes in JdkProxy?  I
> >> guess
> >> >> > we
> >> >> > >>>> > > could break those out into top-level classes, but then
> you'd
> >> >> have
> >> >> > >>>> > > multiple implementations on your classpath if you made a
> >> >> > dependency
> >> >> > >>>> on
> >> >> > >>>> > > commons-proxy-jdk.  We could move those to "core" I guess.
> >> >> > >>>> > >
> >> >> > >>>> > > On Thu, Aug 1, 2013 at 7:49 AM, Romain Manni-Bucau
> >> >> > >>>> > > <rmannibu...@gmail.com> wrote:
> >> >> > >>>> > > > Ok for all excepted last point (i was not clear i
> think).
> >> The
> >> >> > >>>> > > ProxyFactory
> >> >> > >>>> > > > impl using jdk proxy uses Invocationhandler like the asm
> >> >> > >>>> implementation
> >> >> > >>>> > > so
> >> >> > >>>> > > > it would be great to be able to share the handler
> classes
> >> >> > between
> >> >> > >>>> both
> >> >> > >>>> > > impl.
> >> >> > >>>> > > >
> >> >> > >>>> > > > *Romain Manni-Bucau*
> >> >> > >>>> > > > *Twitter: @rmannibucau <https://twitter.com/rmannibucau
> >*
> >> >> > >>>> > > > *Blog: **http://rmannibucau.wordpress.com/*<
> >> >> > >>>> > > http://rmannibucau.wordpress.com/>
> >> >> > >>>> > > > *LinkedIn: **http://fr.linkedin.com/in/rmannibucau*
> >> >> > >>>> > > > *Github: https://github.com/rmannibucau*
> >> >> > >>>> > > >
> >> >> > >>>> > > >
> >> >> > >>>> > > >
> >> >> > >>>> > > > 2013/8/1 James Carman <ja...@carmanconsulting.com>
> >> >> > >>>> > > >
> >> >> > >>>> > > >> On Thu, Aug 1, 2013 at 2:44 AM, Romain Manni-Bucau
> >> >> > >>>> > > >> <rmannibu...@gmail.com> wrote:
> >> >> > >>>> > > >> > ok,
> >> >> > >>>> > > >> >
> >> >> > >>>> > > >> > here it is:
> https://gist.github.com/rmannibucau/6128964
> >> >> > >>>> > > >> >
> >> >> > >>>> > > >>
> >> >> > >>>> > > >> Thanks!
> >> >> > >>>> > > >>
> >> >> > >>>> > > >> >
> >> >> > >>>> > > >> > 1) i didn't fully get the goal of stub module, any
> >> >> pointers?
> >> >> > >>>> > > >>
> >> >> > >>>> > > >> It provides features very similar to the mocking
> support
> >> in
> >> >> > >>>> libraries
> >> >> > >>>> > > >> like Mockito/EasyMock.  Basically, you can "train" a
> >> proxy to
> >> >> > do
> >> >> > >>>> what
> >> >> > >>>> > > >> you want in certain situations.
> >> >> > >>>> > > >>
> >> >> > >>>> > > >> > 2) in ProxyFactory methods have this kind of
> signature
> >> >> > >>>> > > >> >
> >> >> > >>>> > > >> > <T> T createDelegatorProxy( ClassLoader classLoader,
> >> >> > >>>> > ObjectProvider<?>
> >> >> > >>>> > > >> > delegateProvider,
> >> >> > >>>> > > >> >                                         Class<?>...
> >> >> > >>>> proxyClasses );
> >> >> > >>>> > > >> >
> >> >> > >>>> > > >> > why <T>if ObjectProvider is not ObjectProvider<T>
> (same
> >> for
> >> >> > >>>> Object
> >> >> > >>>> > for
> >> >> > >>>> > > >> > others method). basically T isn't matched.
> >> >> > >>>> > > >> >
> >> >> > >>>> > > >>
> >> >> > >>>> > > >> I'll have to take a look.  I believe the <T> is there
> for
> >> >> > >>>> "syntactic
> >> >> > >>>> > > >> sugar", since you can pass in any classes you want
> really.
> >> >> > >>>>  Hopefully
> >> >> > >>>> > > >> the user won't do something stupid and they'll actually
> >> pass
> >> >> > >>>> Class<T>
> >> >> > >>>> > > >> as one of the proxyClasses when they're asking for a
> >> return
> >> >> > type
> >> >> > >>>> of
> >> >> > >>>> > > >> <T> back.  Since you can have multiple proxy classes,
> the
> >> >> > >>>> > > >> ObjectProvider can't really match any one particular
> one
> >> (it
> >> >> > >>>> needs to
> >> >> > >>>> > > >> support all).
> >> >> > >>>> > > >>
> >> >> > >>>> > > >> > 3) the jdk implementation uses InvocationHandler for
> the
> >> >> > >>>> proxying,
> >> >> > >>>> > asm
> >> >> > >>>> > > >> > implementation has almost the same (i didn't check
> but i
> >> >> > started
> >> >> > >>>> > from
> >> >> > >>>> > > an
> >> >> > >>>> > > >> > exact copy), it would be great to get them in a
> common
> >> >> > module to
> >> >> > >>>> > > avoid to
> >> >> > >>>> > > >> > duplicate it
> >> >> > >>>> > > >> >
> >> >> > >>>> > > >>
> >> >> > >>>> > > >> We have our own interface for InvocationHander, it's
> >> called
> >> >> > >>>> Invoker.
> >> >> > >>>> > > >> Other libraries can be "adapted" to ours if you want to
> >> reuse
> >> >> > >>>> > > >> something.
> >> >> > >>>> > > >>
> >> >> > >>>> > > >>
> >> >> > >>>>
> >> >> ---------------------------------------------------------------------
> >> >> > >>>> > > >> To unsubscribe, e-mail:
> >> dev-unsubscr...@commons.apache.org
> >> >> > >>>> > > >> For additional commands, e-mail:
> >> dev-h...@commons.apache.org
> >> >> > >>>> > > >>
> >> >> > >>>> > > >>
> >> >> > >>>> > >
> >> >> > >>>> > >
> >> >> >
> ---------------------------------------------------------------------
> >> >> > >>>> > > To unsubscribe, e-mail:
> dev-unsubscr...@commons.apache.org
> >> >> > >>>> > > For additional commands, e-mail:
> dev-h...@commons.apache.org
> >> >> > >>>> > >
> >> >> > >>>> > >
> >> >> > >>>> >
> >> >> > >>>>
> >> >> > >>>
> >> >> > >>>
> >> >> >
> >> >> >
> ---------------------------------------------------------------------
> >> >> > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> >> > For additional commands, e-mail: dev-h...@commons.apache.org
> >> >> >
> >> >> >
> >> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> >> For additional commands, e-mail: dev-h...@commons.apache.org
> >>
> >>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> For additional commands, e-mail: dev-h...@commons.apache.org
>
>

Reply via email to