Yes, the JIT has intrinsic knowledge of some JDK classes and their methods,
and emits optimized code - Integer has several intrinsics.  Look at
src/share/vm/opto/library_call.cpp

Cheers

Sent from my phone
On Sep 28, 2012 10:51 AM, "Raffaello Giulietti" <
raffaello.giulie...@gmail.com> wrote:

> Hello,
>
> are java.lang classes better served by the JVM than other classes?
>
> Here's a small experiment.
>
> I created a MyInteger class that exposes the very same implementation
> of Integer.numberOfTrailingZeros(int), copied verbatim.
>
> And here is a test that, on my JVM, shows that the implementation in
> Integer is about 5 times faster. I tried several JVM flags, e.g.,
> -server, -XX:+AggressiveOpts, -Xshare:off, unsatisfactorily. Similar
> results with factor of about 3-5 are observed on other platforms.
>
> Why the big performance difference? I know, micro-benchmarks are evil,
> etc, etc, ... But this is hard to understand, except if Integer were
> already super-optimized "a priori", intrinsically, while building the
> JVM. Is this the case?
>
>
>
> Greetings
> Raffaello
>
>
>
> ---------------
>
> public class Trailing {
>
>     private static int COUNT = 1 << 30;
>
>     public static void main(String[] args) {
>         warmup();
>         my();
>         their();
>     }
>
>     private static void warmup() {
>         int t = 0;
>         for (int i = 0; i < COUNT; ++i) {
>             t += MyInteger.numberOfTrailingZeros(i);
>         }
>         System.out.println("warmup, t=" + t);
>     }
>
>     private static void their() {
>         int t = 0;
>         long begin = System.nanoTime();
>         for (int i = 0; i < COUNT; ++i) {
>             t += Integer.numberOfTrailingZeros(i);
>         }
>         System.out.println((System.nanoTime() - begin) / 1000000 +
> "ms, t=" + t);
>     }
>
>     private static void my() {
>         int t = 0;
>         long begin = System.nanoTime();
>         for (int i = 0; i < COUNT; ++i) {
>             t += MyInteger.numberOfTrailingZeros(i);
>         }
>         System.out.println((System.nanoTime() - begin) / 1000000 +
> "ms, t=" + t);
>     }
>
> }
>
> ------------------
>
> public class MyInteger {
>
>     public static int numberOfTrailingZeros(int i) {
>         // HD, Figure 5-14
>         int y;
>         if (i == 0) return 32;
>         int n = 31;
>         y = i <<16; if (y != 0) { n = n -16; i = y; }
>         y = i << 8; if (y != 0) { n = n - 8; i = y; }
>         y = i << 4; if (y != 0) { n = n - 4; i = y; }
>         y = i << 2; if (y != 0) { n = n - 2; i = y; }
>         return n - ((i << 1) >>> 31);
>     }
>
> }
> _______________________________________________
> 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