jvm handling of long indexed for loops

Alexander Weld alexander.weld at oracle.com
Thu Jun 19 17:20:00 UTC 2014


Okay, that makes sense. The PrintAssembly flag is quite useful.

Are there plans for optimizing for loops that have a long counter in the
next releases of hotspot? I guess there is no flag to force the jvm to
unroll a long-loop.. Is there anything else I can do now, other than
unrolling the loop by hand? (what I want to avoid)

And for my second question: Do i understand it correctly, that the OSR
compilation performs better than the "normal" compilation for the
long-loop?

On 6/18/2014 5:15 PM, Vitaly Davidovich wrote:
>
> Yes, hotspot has a bunch of loop optimizations that only kick in when
> the counter is an int.  My hunch is that, given your code, the
> difference is that the int loop is unrolled and the long one isn't. 
> Checking the generated assembly should deny/confirm that, and
> generally shed light on the compiled differences.
>
> As an aside, System.nanoTime is more appropriate for timing execution;
> prefer that over System.currentTimeMillis.
>
> Sent from my phone
>
> On Jun 18, 2014 7:52 PM, "Alexander Weld" <alexander.weld at oracle.com
> <mailto:alexander.weld at oracle.com>> wrote:
>
>     Hi,
>
>     I have some questions on how the JVM handles long values,
>     especially as
>     index in for loops.
>
>     I have the following test class, which tracks the running time of two
>     versions of a simple for loop, one using an int-value as index and one
>     using a long-value as index:
>
>     public class Test {
>
>       public static long testInt(int maxIter) {
>         long x = 0;
>
>         for (int i = 0; i < maxIter; i++) {
>           x += i;
>         }
>
>         return x;
>       }
>       public static long testLong(long maxIter) {
>         long x = 0;
>
>         for (long l = 0; l < maxIter; l++) {
>           x += l;
>         }
>
>         return x;
>       }
>
>       public static void main(String[] args) {
>
>         final int MAX_ITER_INT = Integer.MAX_VALUE;
>         final long MAX_ITER_LONG = (long) MAX_ITER_INT;
>
>         long t1, t2;
>
>         for (int i = 0; i < 10; i++) {
>           long x = 0;
>
>           t1 = System.currentTimeMillis();
>           x = testInt(MAX_ITER_INT);
>           t2 = System.currentTimeMillis();
>
>           System.out.println("Iteration " + i + ": x = " + x + "  time(int
>     loop) = " + (t2 - t1));
>         }
>
>         for (int i = 0; i < 10; i++) {
>           long x = 0;
>
>           t1 = System.currentTimeMillis();
>           x = testLong(MAX_ITER_LONG);
>           t2 = System.currentTimeMillis();
>
>           System.out.println("Iteration " + i + ": x = " + x + " time(long
>     loop) = " + (t2 - t1));
>         }
>
>       }
>
>     }
>
>     When I run this on our cluster (*) I get the following results:
>
>     $ java Test
>     Iteration 0: x = 2305843005992468481  time(int loop) = 945
>     Iteration 1: x = 2305843005992468481  time(int loop) = 937
>     Iteration 2: x = 2305843005992468481  time(int loop) = 937
>     Iteration 3: x = 2305843005992468481  time(int loop) = 938
>     Iteration 4: x = 2305843005992468481  time(int loop) = 938
>     Iteration 5: x = 2305843005992468481  time(int loop) = 937
>     Iteration 6: x = 2305843005992468481  time(int loop) = 937
>     Iteration 7: x = 2305843005992468481  time(int loop) = 938
>     Iteration 8: x = 2305843005992468481  time(int loop) = 938
>     Iteration 9: x = 2305843005992468481  time(int loop) = 937
>     Iteration 0: x = 2305843005992468481 time(long loop) = 1510
>     Iteration 1: x = 2305843005992468481 time(long loop) = 1509
>     Iteration 2: x = 2305843005992468481 time(long loop) = 1799
>     Iteration 3: x = 2305843005992468481 time(long loop) = 1799
>     Iteration 4: x = 2305843005992468481 time(long loop) = 1799
>     Iteration 5: x = 2305843005992468481 time(long loop) = 1799
>     Iteration 6: x = 2305843005992468481 time(long loop) = 1799
>     Iteration 7: x = 2305843005992468481 time(long loop) = 1799
>     Iteration 8: x = 2305843005992468481 time(long loop) = 1799
>     Iteration 9: x = 2305843005992468481 time(long loop) = 1799
>
>     My questions are:
>
>       (1) Why is the long-version slower compared to the int-version?
>     Is it
>     the int to long conversion? Or are there some optimizations, that are
>     only applied to int loops?
>
>       (2) What is the reason for the long-version getting slower after
>     "Iteration 1"?
>
>     Thanks,
>     Alex
>
>     (*) System information:
>
>     Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
>
>     $ lsb_release -d
>     Description:    Oracle Linux Server release 6.5
>
>     $ java -version
>     java version "1.7.0_55"
>     Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
>     Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
>
>     (Let me know if you need more information)
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20140619/d2d9236f/attachment.html>


More information about the hotspot-compiler-dev mailing list