Are java.lang classes better served by the JVM?

Ben Evans benjamin.john.evans at gmail.com
Fri Sep 28 11:53:58 PDT 2012


Please include a link to your entire project, including the test harness.

Microbenchmarks are tricky things, and it will be easier to have a good
discussion if others can independently reproduce your results.

Thanks,

Ben
On 28 Sep 2012 11:42, "Raffaello Giulietti" <raffaello.giulietti at gmail.com>
wrote:

> On Fri, Sep 28, 2012 at 8:15 PM, Charles Oliver Nutter
> <headius at headius.com> wrote:
> > On Fri, Sep 28, 2012 at 10:21 AM, Raffaello Giulietti
> > <raffaello.giulietti at gmail.com> wrote:
> >> I'm not sure that we are speaking about the same thing.
> >>
> >> The Java source code of numberOfTrailingZeros() is exactly the same in
> >> Integer as it is in MyInteger. But, as far as I understand, what
> >> really runs on the metal upon invocation of the Integer method is not
> >> JITted code but something else that probably makes use of CPU specific
> >> instructions. This code is built directly into the JVM and need not
> >> bear any resemblance with the code that would have been produced by
> >> JITting the bytecode.
> >
> > Regardless of whether the method is implemented in Java or not, the
> > JVM "knows" native/intrinsic/optimized versions of many java.lang core
> > methods. numberOfTrailingZeros is one such method.
> >
> > Here, the JVM is using its intrinsified version rather than the JITed
> > version, presumably because the intrinsified version is pre-optimized
> > and faster than what the JVM JIT can do for the JVM bytecode version.
> >
> > system ~/projects/jruby-ruby $ java -XX:+PrintCompilation
> > -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining Blah
> >      65    1             java.lang.String::hashCode (55 bytes)
> >      78    2             Blah::doIt (5 bytes)
> >      78    3             java.lang.Integer::numberOfTrailingZeros (79
> bytes)
> >                             @ 1
> > java.lang.Integer::numberOfTrailingZeros (79 bytes)   (intrinsic)
> >      79    1 %           Blah::main @ 2 (29 bytes)
> >                             @ 9   Blah::doIt (5 bytes)   inline (hot)
> >                               @ 1
> > java.lang.Integer::numberOfTrailingZeros (79 bytes)   (intrinsic)
> >                             @ 15   Blah::doIt (5 bytes)   inline (hot)
> >                               @ 1
> > java.lang.Integer::numberOfTrailingZeros (79 bytes)   (intrinsic)
> >
> > system ~/projects/jruby-ruby $ cat Blah.java
> > public class Blah {
> > public static int value = 0;
> > public static void main(String[] args) {
> >   for (int i = 0; i < 10_000_000; i++) {
> >     value = doIt(i) + doIt(i * 2);
> >   }
> > }
> >
> > public static int doIt(int i) {
> >   return Integer.numberOfTrailingZeros(i);
> > }
> > }
> > _______________________________________________
>
>
> Yes, this is what Vitaly stated and what happens behind the curtains.
>
> In the end, this means there are no chances for the rest of us to
> implement better Java code as a replacement for the intrinsified
> methods.
>
> For example, the following variant is about 2.5 times *faster*,
> averaged over all integers, than the JITted original method, the one
> copied verbatim! (Besides, everybody would agree that it is more
> readable, I hope.)
>
> But since the Integer version is intrinsified, it still runs about 2
> times slower than that (mysterious) code.
>
>     public static int numberOfTrailingZeros(int i) {
>         int n = 0;
>         for (; n < 32 && (i & 1 << n) == 0; ++n);
>         return n;
>     }
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20120928/93c4617b/attachment.html 


More information about the mlvm-dev mailing list