jvm handling of long indexed for loops

Alexander Weld alexander.weld at oracle.com
Wed Jun 18 23:51:49 UTC 2014


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)


More information about the hotspot-compiler-dev mailing list