<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <br>
    <div class="moz-cite-prefix">On 06/19/2014 02:15 AM, Vitaly
      Davidovich wrote:<br>
    </div>
    <blockquote
cite="mid:CAHjP37EMdyN4vWDFQKSgj0d8MSoAwqaZN=dDgamDLp6=GBpjmw@mail.gmail.com"
      type="cite">
      <p dir="ltr">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.</p>
      <p dir="ltr">As an aside, System.nanoTime is more appropriate for
        timing execution; prefer that over System.currentTimeMillis.</p>
      <p dir="ltr">Sent from my phone</p>
    </blockquote>
    <br>
    yes, I can see that with PrintAssembly,<br>
    also each method test* is compiled twice, first as OSR then as a
    normal method.<br>
    <br>
    I've discover something worst, this benchmark is weird on my haswell
    laptop<br>
    (I see the same kind of result as Alexander on my sandy bridge
    laptop),<br>
    <br>
    Here is the execution on my haswell:<br>
    Iteration 0: x = 2305843005992468481  time(int loop) = 722<br>
    Iteration 1: x = 2305843005992468481  time(int loop) = 722<br>
    Iteration 2: x = 2305843005992468481  time(int loop) = 712<br>
    Iteration 3: x = 2305843005992468481  time(int loop) = 710<br>
    Iteration 4: x = 2305843005992468481  time(int loop) = 711<br>
    Iteration 5: x = 2305843005992468481  time(int loop) = 740<br>
    Iteration 6: x = 2305843005992468481  time(int loop) = 711<br>
    Iteration 7: x = 2305843005992468481  time(int loop) = 713<br>
    Iteration 8: x = 2305843005992468481  time(int loop) = 712<br>
    Iteration 9: x = 2305843005992468481  time(int loop) = 716<br>
    Iteration 0: x = 2305843005992468481 time(long loop) = 658<br>
    Iteration 1: x = 2305843005992468481 time(long loop) = 656<br>
    Iteration 2: x = 2305843005992468481 time(long loop) = 666<br>
    Iteration 3: x = 2305843005992468481 time(long loop) = 663<br>
    Iteration 4: x = 2305843005992468481 time(long loop) = 667<br>
    Iteration 5: x = 2305843005992468481 time(long loop) = 662<br>
    Iteration 6: x = 2305843005992468481 time(long loop) = 662<br>
    Iteration 7: x = 2305843005992468481 time(long loop) = 662<br>
    Iteration 8: x = 2305843005992468481 time(long loop) = 681<br>
    Iteration 9: x = 2305843005992468481 time(long loop) = 665<br>
    <br>
    The long version is faster despite the fact that the generated code
    is a simple loop with no unrolling,<br>
    I've copy/pasted the code generated for testLong (non-OSR) below.<br>
    As you can see, the code is very straighforward,<br>
    there is even no removing of the safepoint check in the body of the
    loop (at 0x00007fbc7d06c967).<br>
    <br>
      # {method} {0x00007fbc7cc005c8} 'testLong' '(J)J' in 'Test'<br>
      # parm0:    rsi:rsi   = long<br>
      #           [sp+0x20]  (sp of caller)<br>
      0x00007fbc7d06c940: sub    $0x18,%rsp<br>
      0x00007fbc7d06c947: mov    %rbp,0x10(%rsp)    ;*synchronization
    entry<br>
                                                    ; -
    Test::testLong@-1 (line 13)<br>
    <br>
      0x00007fbc7d06c94c: xor    %eax,%eax<br>
      0x00007fbc7d06c94e: test   %rsi,%rsi<br>
      0x00007fbc7d06c951: jle    0x00007fbc7d06c972  ;*iflt<br>
                                                    ; -
    Test::testLong@23 (line 15)<br>
    <br>
      0x00007fbc7d06c953: mov    $0x1,%r10d<br>
      0x00007fbc7d06c959: jmp    0x00007fbc7d06c967<br>
      0x00007fbc7d06c95b: nopl   0x0(%rax,%rax,1)<br>
      0x00007fbc7d06c960: add    %r10,%rax          ;*ladd<br>
                                                    ; -
    Test::testLong@11 (line 16)<br>
    <br>
      0x00007fbc7d06c963: add    $0x1,%r10          ; OopMap{off=39}<br>
                                                    ;*lcmp<br>
                                                    ; -
    Test::testLong@22 (line 15)<br>
    <br>
      0x00007fbc7d06c967: test   %eax,0xb6e9693(%rip)        #
    0x00007fbc88756000<br>
                                                    ;*lcmp<br>
                                                    ; -
    Test::testLong@22 (line 15)<br>
                                                    ;   {poll}<br>
      0x00007fbc7d06c96d: cmp    %rsi,%r10<br>
      0x00007fbc7d06c970: jl     0x00007fbc7d06c960  ;*lload_2<br>
                                                    ; -
    Test::testLong@26 (line 19)<br>
    <br>
      0x00007fbc7d06c972: add    $0x10,%rsp<br>
      0x00007fbc7d06c976: pop    %rbp<br>
      0x00007fbc7d06c977: test   %eax,0xb6e9683(%rip)        #
    0x00007fbc88756000<br>
                                                    ;   {poll_return}<br>
      0x00007fbc7d06c97d: retq   <br>
      0x00007fbc7d06c97e: hlt    <br>
      0x00007fbc7d06c97f: hlt    <br>
    <br>
    it seems that the Haswell prefers plain old loop ??<br>
    <br>
    cheers,<br>
    Rémi<br>
    <br>
    <blockquote
cite="mid:CAHjP37EMdyN4vWDFQKSgj0d8MSoAwqaZN=dDgamDLp6=GBpjmw@mail.gmail.com"
      type="cite">
      <div class="gmail_quote">On Jun 18, 2014 7:52 PM, "Alexander Weld"
        <<a moz-do-not-send="true"
          href="mailto:alexander.weld@oracle.com">alexander.weld@oracle.com</a>>
        wrote:<br type="attribution">
        <blockquote class="gmail_quote" style="margin:0 0 0
          .8ex;border-left:1px #ccc solid;padding-left:1ex">
          Hi,<br>
          <br>
          I have some questions on how the JVM handles long values,
          especially as<br>
          index in for loops.<br>
          <br>
          I have the following test class, which tracks the running time
          of two<br>
          versions of a simple for loop, one using an int-value as index
          and one<br>
          using a long-value as index:<br>
          <br>
          public class Test {<br>
          <br>
            public static long testInt(int maxIter) {<br>
              long x = 0;<br>
          <br>
              for (int i = 0; i < maxIter; i++) {<br>
                x += i;<br>
              }<br>
          <br>
              return x;<br>
            }<br>
            public static long testLong(long maxIter) {<br>
              long x = 0;<br>
          <br>
              for (long l = 0; l < maxIter; l++) {<br>
                x += l;<br>
              }<br>
          <br>
              return x;<br>
            }<br>
          <br>
            public static void main(String[] args) {<br>
          <br>
              final int MAX_ITER_INT = Integer.MAX_VALUE;<br>
              final long MAX_ITER_LONG = (long) MAX_ITER_INT;<br>
          <br>
              long t1, t2;<br>
          <br>
              for (int i = 0; i < 10; i++) {<br>
                long x = 0;<br>
          <br>
                t1 = System.currentTimeMillis();<br>
                x = testInt(MAX_ITER_INT);<br>
                t2 = System.currentTimeMillis();<br>
          <br>
                System.out.println("Iteration " + i + ": x = " + x + "
           time(int<br>
          loop) = " + (t2 - t1));<br>
              }<br>
          <br>
              for (int i = 0; i < 10; i++) {<br>
                long x = 0;<br>
          <br>
                t1 = System.currentTimeMillis();<br>
                x = testLong(MAX_ITER_LONG);<br>
                t2 = System.currentTimeMillis();<br>
          <br>
                System.out.println("Iteration " + i + ": x = " + x + "
          time(long<br>
          loop) = " + (t2 - t1));<br>
              }<br>
          <br>
            }<br>
          <br>
          }<br>
          <br>
          When I run this on our cluster (*) I get the following
          results:<br>
          <br>
          $ java Test<br>
          Iteration 0: x = 2305843005992468481  time(int loop) = 945<br>
          Iteration 1: x = 2305843005992468481  time(int loop) = 937<br>
          Iteration 2: x = 2305843005992468481  time(int loop) = 937<br>
          Iteration 3: x = 2305843005992468481  time(int loop) = 938<br>
          Iteration 4: x = 2305843005992468481  time(int loop) = 938<br>
          Iteration 5: x = 2305843005992468481  time(int loop) = 937<br>
          Iteration 6: x = 2305843005992468481  time(int loop) = 937<br>
          Iteration 7: x = 2305843005992468481  time(int loop) = 938<br>
          Iteration 8: x = 2305843005992468481  time(int loop) = 938<br>
          Iteration 9: x = 2305843005992468481  time(int loop) = 937<br>
          Iteration 0: x = 2305843005992468481 time(long loop) = 1510<br>
          Iteration 1: x = 2305843005992468481 time(long loop) = 1509<br>
          Iteration 2: x = 2305843005992468481 time(long loop) = 1799<br>
          Iteration 3: x = 2305843005992468481 time(long loop) = 1799<br>
          Iteration 4: x = 2305843005992468481 time(long loop) = 1799<br>
          Iteration 5: x = 2305843005992468481 time(long loop) = 1799<br>
          Iteration 6: x = 2305843005992468481 time(long loop) = 1799<br>
          Iteration 7: x = 2305843005992468481 time(long loop) = 1799<br>
          Iteration 8: x = 2305843005992468481 time(long loop) = 1799<br>
          Iteration 9: x = 2305843005992468481 time(long loop) = 1799<br>
          <br>
          My questions are:<br>
          <br>
            (1) Why is the long-version slower compared to the
          int-version? Is it<br>
          the int to long conversion? Or are there some optimizations,
          that are<br>
          only applied to int loops?<br>
          <br>
            (2) What is the reason for the long-version getting slower
          after<br>
          "Iteration 1"?<br>
          <br>
          Thanks,<br>
          Alex<br>
          <br>
          (*) System information:<br>
          <br>
          Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz<br>
          <br>
          $ lsb_release -d<br>
          Description:    Oracle Linux Server release 6.5<br>
          <br>
          $ java -version<br>
          java version "1.7.0_55"<br>
          Java(TM) SE Runtime Environment (build 1.7.0_55-b13)<br>
          Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed
          mode)<br>
          <br>
          (Let me know if you need more information)<br>
        </blockquote>
      </div>
    </blockquote>
    <br>
  </body>
</html>