For things like this, it's better to grab hsdis and look at the generated
assembly - it'll answer most of these types of questions.

Sent from my phone
On Sep 28, 2012 2:54 PM, "Ben Evans" <benjamin.john.ev...@gmail.com> wrote:

> 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.giulie...@gmail.com>
> wrote:
>
>> On Fri, Sep 28, 2012 at 8:15 PM, Charles Oliver Nutter
>> <head...@headius.com> wrote:
>> > On Fri, Sep 28, 2012 at 10:21 AM, Raffaello Giulietti
>> > <raffaello.giulie...@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@openjdk.java.net
>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>>
>
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev@openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>
>
_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to