Java优化器和冗余阵列评估

Java优化器和冗余阵列评估,java,performance,optimization,compiler-optimization,Java,Performance,Optimization,Compiler Optimization,这是关于Java优化的一个非常基本的问题 如果您有一个简单的for循环来迭代一个数组,并在循环的头中使用array.length,而不是在之前对其求值,以便只执行一次(我几乎总是这样做): for(int i=0;i 如果另一个线程不同时修改数组,array.length是否只会有效计算一次 更重要的是,除非字段是volatile,否则JVM会做出这样的假设,不管它是真是假。Java中的数组是固定长度的。在创建数组后,长度不能更改。首先获取长度并将其分配给局部变量没有任何好处。在花费太多的时间后

这是关于Java优化的一个非常基本的问题

如果您有一个简单的for循环来迭代一个数组,并在循环的头中使用array.length,而不是在之前对其求值,以便只执行一次(我几乎总是这样做):

for(int i=0;i
如果另一个线程不同时修改数组,array.length是否只会有效计算一次


更重要的是,除非字段是volatile,否则JVM会做出这样的假设,不管它是真是假。

Java中的数组是固定长度的。在创建数组后,长度不能更改。首先获取长度并将其分配给局部变量没有任何好处。

在花费太多的时间后窃听这个,我得到:

A:

B字节码:

 static java.lang.String test(java.lang.String[]);
  Code:
   0:   ldc #2; //String 
   2:   astore_1
   3:   iconst_0
   4:   istore_2
   5:   aload_0
   6:   arraylength
   7:   istore_3
   8:   iload_2
   9:   iload_3
   10:  if_icmpge   36
   13:  aload_0
   14:  iload_2
   15:  aaload
   16:  invokevirtual   #3; //Method java/lang/String.length:()I
   19:  aload_1
   20:  invokevirtual   #3; //Method java/lang/String.length:()I
   23:  if_icmple   30
   26:  aload_0
   27:  iload_2
   28:  aaload
   29:  astore_1
   30:  iinc    2, 1
   33:  goto    8
   36:  aload_1
   37:  areturn
 static java.lang.String test(java.lang.String[]);
  Code:
   0:   ldc #2; //String 
   2:   astore_1
   3:   iconst_0
   4:   istore_2
   5:   iload_2
   6:   aload_0
   7:   arraylength
   8:   if_icmpge   34
   11:  aload_0
   12:  iload_2
   13:  aaload
   14:  invokevirtual   #3; //Method java/lang/String.length:()I
   17:  aload_1
   18:  invokevirtual   #3; //Method java/lang/String.length:()I
   21:  if_icmple   28
   24:  aload_0
   25:  iload_2
   26:  aaload
   27:  astore_1
   28:  iinc    2, 1
   31:  goto    5
   34:  aload_1
   35:  areturn
重要的区别是第33/31行,其中goto跳到第8行或第5行。在(A)之后和(B)之前调用arraylength

因此,在不缓存长度的情况下,字节码实际上会在每次迭代中调用arraylength

当然,javac不会优化,只有JIT会优化。 那么JIT做什么呢

通常看起来什么都没有。它没有列在编译方法的-XX:+printcomilation列表中

仅在调用函数100万次后,它才通过展开循环来激活并完全删除长度检查(如果我正确阅读):

A拆卸:

# parm0:    rsi:rsi   = '[Ljava/lang/String;'
  #           [sp+0x30]  (sp of caller)
  0x00007fdc296b30a0: mov    %eax,-0x6000(%rsp)
  0x00007fdc296b30a7: push   %rbp
  0x00007fdc296b30a8: sub    $0x20,%rsp         ;*synchronization entry
                                                ; - Acminesimple::test@-1 (line 3)
  0x00007fdc296b30ac: mov    0xc(%rsi),%ebp     ;*arraylength
                                                ; - Acminesimple::test@6 (line 4)
                                                ; implicit exception: dispatches to 0x00007fdc296b31ad
  0x00007fdc296b30af: movabs $0xeb8b7168,%rax   ;   {oop("")}
  0x00007fdc296b30b9: test   %ebp,%ebp
  0x00007fdc296b30bb: jle    0x00007fdc296b312e  ;*if_icmpge
                                                ; - Acminesimple::test@10 (line 4)
  0x00007fdc296b30bd: test   %ebp,%ebp
  0x00007fdc296b30bf: jbe    0x00007fdc296b3177
  0x00007fdc296b30c5: mov    %ebp,%ecx
  0x00007fdc296b30c7: dec    %ecx
  0x00007fdc296b30c9: cmp    %ebp,%ecx
  0x00007fdc296b30cb: jae    0x00007fdc296b3177
  0x00007fdc296b30d1: xor    %r8d,%r8d          ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
  0x00007fdc296b30d4: mov    0x10(%rsi,%r8,4),%edi  ;*aaload
                                                ; - Acminesimple::test@15 (line 5)
  0x00007fdc296b30d9: mov    0x14(%rdi),%r11d   ; implicit exception: dispatches to 0x00007fdc296b318d
  0x00007fdc296b30dd: mov    0x14(%rax),%r10d   ; implicit exception: dispatches to 0x00007fdc296b319d
  0x00007fdc296b30e1: cmp    %r10d,%r11d
  0x00007fdc296b30e4: jg     0x00007fdc296b30e9  ;*if_icmple
                                                ; - Acminesimple::test@23 (line 5)
  0x00007fdc296b30e6: mov    %rax,%rdi
  0x00007fdc296b30e9: inc    %r8d               ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b30ec: cmp    $0x1,%r8d
  0x00007fdc296b30f0: jge    0x00007fdc296b30f7  ;*if_icmpge
                                                ; - Acminesimple::test@10 (line 4)
  0x00007fdc296b30f2: mov    %rdi,%rax          ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b30f5: jmp    0x00007fdc296b30d4
  0x00007fdc296b30f7: cmp    %ecx,%r8d
  0x00007fdc296b30fa: jl     0x00007fdc296b3163
  0x00007fdc296b30fc: mov    %edi,%r10d
  0x00007fdc296b30ff: cmp    %ebp,%r8d
  0x00007fdc296b3102: jl     0x00007fdc296b310f
  0x00007fdc296b3104: mov    %r10d,%r9d
  0x00007fdc296b3107: jmp    0x00007fdc296b312b
  0x00007fdc296b3109: data32 xchg %ax,%ax
  0x00007fdc296b310c: mov    %r9d,%r10d         ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
  0x00007fdc296b310f: mov    0x10(%rsi,%r8,4),%r9d  ;*aaload
                                                ; - Acminesimple::test@15 (line 5)
  0x00007fdc296b3114: mov    0x14(%r9),%r11d    ; implicit exception: dispatches to 0x00007fdc296b318d
  0x00007fdc296b3118: mov    0x14(%r10),%ebx    ; implicit exception: dispatches to 0x00007fdc296b319d
  0x00007fdc296b311c: cmp    %ebx,%r11d
  0x00007fdc296b311f: cmovle %r10d,%r9d
  0x00007fdc296b3123: inc    %r8d               ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b3126: cmp    %ebp,%r8d
  0x00007fdc296b3129: jl     0x00007fdc296b310c
  0x00007fdc296b312b: mov    %r9,%rax           ;*if_icmpge
                                                ; - Acminesimple::test@10 (line 4)
  0x00007fdc296b312e: add    $0x20,%rsp
  0x00007fdc296b3132: pop    %rbp
  0x00007fdc296b3133: test   %eax,0x5766ec7(%rip)        # 0x00007fdc2ee1a000
                                                ;   {poll_return}
  0x00007fdc296b3139: retq   
  0x00007fdc296b313a: mov    %r11d,%edi
  0x00007fdc296b313d: data32 xchg %ax,%ax       ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b3140: movslq %r8d,%r10
  0x00007fdc296b3143: mov    0x14(%rsi,%r10,4),%r10d  ;*aaload
                                                ; - Acminesimple::test@15 (line 5)
  0x00007fdc296b3148: mov    0x14(%r10),%r9d    ; implicit exception: dispatches to 0x00007fdc296b318d
  0x00007fdc296b314c: mov    0x14(%rdi),%r11d   ; implicit exception: dispatches to 0x00007fdc296b319d
  0x00007fdc296b3150: cmp    %r11d,%r9d
  0x00007fdc296b3153: cmovle %edi,%r10d
  0x00007fdc296b3157: add    $0x2,%r8d          ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b315b: cmp    %ecx,%r8d
  0x00007fdc296b315e: jge    0x00007fdc296b30ff  ;*if_icmpge
                                                ; - Acminesimple::test@10 (line 4)
  0x00007fdc296b3160: mov    %r10d,%edi         ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
  0x00007fdc296b3163: mov    0x10(%rsi,%r8,4),%r11d  ;*aaload
                                                ; - Acminesimple::test@15 (line 5)
  0x00007fdc296b3168: mov    0x14(%r11),%r10d   ; implicit exception: dispatches to 0x00007fdc296b318d
  0x00007fdc296b316c: mov    0x14(%rdi),%r9d    ; implicit exception: dispatches to 0x00007fdc296b319d
  0x00007fdc296b3170: cmp    %r9d,%r10d
                                                ; - Acminesimple::test@23 (line 5)
  0x00007fdc296b3175: jmp    0x00007fdc296b3140
  0x00007fdc296b3177: mov    %rsi,(%rsp)
  0x00007fdc296b317b: mov    $0xffffff86,%esi
  0x00007fdc296b3180: data32 xchg %ax,%ax
  0x00007fdc296b3183: callq  0x00007fdc29620320  ; OopMap{[0]=Oop off=232}
                                                ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b3188: callq  0x00007fdc2de8b7c0  ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b318d: mov    $0xfffffff6,%esi
  0x00007fdc296b3192: nop
  0x00007fdc296b3193: callq  0x00007fdc29620320  ; OopMap{off=248}
                                                ;*invokevirtual length
                                                ; - Acminesimple::test@16 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b3198: callq  0x00007fdc2de8b7c0  ;*invokevirtual length
                                                ; - Acminesimple::test@16 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b319d: mov    $0xfffffff6,%esi
  0x00007fdc296b31a2: nop
  0x00007fdc296b31a3: callq  0x00007fdc29620320  ; OopMap{off=264}
                                                ;*invokevirtual length
                                                ; - Acminesimple::test@20 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b31a8: callq  0x00007fdc2de8b7c0  ;*invokevirtual length
                                                ; - Acminesimple::test@20 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b31ad: mov    $0xfffffff6,%esi
  0x00007fdc296b31b2: nop
  0x00007fdc296b31b3: callq  0x00007fdc29620320  ; OopMap{off=280}
                                                ;*arraylength
                                                ; - Acminesimple::test@6 (line 4)
                                                ;   {runtime_call}
  0x00007fdc296b31b8: callq  0x00007fdc2de8b7c0  ;*arraylength
                                                ; - Acminesimple::test@6 (line 4)
                                                ;   {runtime_call}
  0x00007fdc296b31bd: hlt    
  0x00007fdc296b31be: hlt    
  0x00007fdc296b31bf: hlt    
[Exception Handler]
# parm0:    rsi:rsi   = '[Ljava/lang/String;'
  #           [sp+0x20]  (sp of caller)
  0x00007fc749ebcf20: mov    %eax,-0x6000(%rsp)
  0x00007fc749ebcf27: push   %rbp
  0x00007fc749ebcf28: sub    $0x10,%rsp         ;*synchronization entry
                                                ; - Acfoamsimple::test@-1 (line 3)
  0x00007fc749ebcf2c: mov    0xc(%rsi),%r9d     ;*arraylength
                                                ; - Acfoamsimple::test@7 (line 4)
                                                ; implicit exception: dispatches to 0x00007fc749ebd029
  0x00007fc749ebcf30: movabs $0xeb8b7168,%rax   ;   {oop("")}
  0x00007fc749ebcf3a: test   %r9d,%r9d
  0x00007fc749ebcf3d: jle    0x00007fc749ebcfad  ;*if_icmpge
                                                ; - Acfoamsimple::test@8 (line 4)
  0x00007fc749ebcf3f: test   %r9d,%r9d
  0x00007fc749ebcf42: jbe    0x00007fc749ebcff5
  0x00007fc749ebcf48: mov    %r9d,%ebx
  0x00007fc749ebcf4b: dec    %ebx
  0x00007fc749ebcf4d: cmp    %r9d,%ebx
  0x00007fc749ebcf50: jae    0x00007fc749ebcff5
  0x00007fc749ebcf56: xor    %ecx,%ecx          ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
  0x00007fc749ebcf58: mov    0x10(%rsi,%rcx,4),%edx  ;*aaload
                                                ; - Acfoamsimple::test@13 (line 5)
  0x00007fc749ebcf5c: mov    0x14(%rdx),%r10d   ; implicit exception: dispatches to 0x00007fc749ebd009
  0x00007fc749ebcf60: mov    0x14(%rax),%r8d    ; implicit exception: dispatches to 0x00007fc749ebd019
  0x00007fc749ebcf64: cmp    %r8d,%r10d
  0x00007fc749ebcf67: jg     0x00007fc749ebcf6c  ;*if_icmple
                                                ; - Acfoamsimple::test@21 (line 5)
  0x00007fc749ebcf69: mov    %rax,%rdx
  0x00007fc749ebcf6c: inc    %ecx               ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcf6e: cmp    $0x1,%ecx
  0x00007fc749ebcf71: jge    0x00007fc749ebcf78  ;*if_icmpge
                                                ; - Acfoamsimple::test@8 (line 4)
  0x00007fc749ebcf73: mov    %rdx,%rax          ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcf76: jmp    0x00007fc749ebcf58
  0x00007fc749ebcf78: cmp    %ebx,%ecx
  0x00007fc749ebcf7a: jl     0x00007fc749ebcfe1
  0x00007fc749ebcf7c: mov    %edx,%r10d
  0x00007fc749ebcf7f: cmp    %r9d,%ecx
  0x00007fc749ebcf82: jl     0x00007fc749ebcf8f
  0x00007fc749ebcf84: mov    %r10d,%r8d
  0x00007fc749ebcf87: jmp    0x00007fc749ebcfaa
  0x00007fc749ebcf89: data32 xchg %ax,%ax
  0x00007fc749ebcf8c: mov    %r8d,%r10d         ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
  0x00007fc749ebcf8f: mov    0x10(%rsi,%rcx,4),%r8d  ;*aaload
                                                ; - Acfoamsimple::test@13 (line 5)
  0x00007fc749ebcf94: mov    0x14(%r8),%r11d    ; implicit exception: dispatches to 0x00007fc749ebd009
  0x00007fc749ebcf98: mov    0x14(%r10),%edi    ; implicit exception: dispatches to 0x00007fc749ebd019
  0x00007fc749ebcf9c: cmp    %edi,%r11d
  0x00007fc749ebcf9f: cmovle %r10d,%r8d
  0x00007fc749ebcfa3: inc    %ecx               ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcfa5: cmp    %r9d,%ecx
  0x00007fc749ebcfa8: jl     0x00007fc749ebcf8c
  0x00007fc749ebcfaa: mov    %r8,%rax           ;*if_icmpge
                                                ; - Acfoamsimple::test@8 (line 4)
  0x00007fc749ebcfad: add    $0x10,%rsp
  0x00007fc749ebcfb1: pop    %rbp
  0x00007fc749ebcfb2: test   %eax,0x5766048(%rip)        # 0x00007fc74f623000
                                                ;   {poll_return}
  0x00007fc749ebcfb8: retq   
  0x00007fc749ebcfb9: mov    %r10d,%edx
  0x00007fc749ebcfbc: nopl   0x0(%rax)          ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcfc0: movslq %ecx,%r10
  0x00007fc749ebcfc3: mov    0x14(%rsi,%r10,4),%r10d  ;*aaload
                                                ; - Acfoamsimple::test@13 (line 5)
  0x00007fc749ebcfc8: mov    0x14(%r10),%r8d    ; implicit exception: dispatches to 0x00007fc749ebd009
  0x00007fc749ebcfcc: mov    0x14(%rdx),%r11d   ; implicit exception: dispatches to 0x00007fc749ebd019
  0x00007fc749ebcfd0: cmp    %r11d,%r8d
  0x00007fc749ebcfd3: cmovle %edx,%r10d
  0x00007fc749ebcfd7: add    $0x2,%ecx          ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcfda: cmp    %ebx,%ecx
  0x00007fc749ebcfdc: jge    0x00007fc749ebcf7f  ;*if_icmpge
                                                ; - Acfoamsimple::test@8 (line 4)
  0x00007fc749ebcfde: mov    %r10d,%edx         ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
  0x00007fc749ebcfe1: mov    0x10(%rsi,%rcx,4),%r10d  ;*aaload
                                                ; - Acfoamsimple::test@13 (line 5)
  0x00007fc749ebcfe6: mov    0x14(%r10),%r8d    ; implicit exception: dispatches to 0x00007fc749ebd009
  0x00007fc749ebcfea: mov    0x14(%rdx),%r11d   ; implicit exception: dispatches to 0x00007fc749ebd019
  0x00007fc749ebcfee: cmp    %r11d,%r8d
  0x00007fc749ebcff1: jg     0x00007fc749ebcfb9  ;*if_icmple
                                                ; - Acfoamsimple::test@21 (line 5)
  0x00007fc749ebcff3: jmp    0x00007fc749ebcfc0
  0x00007fc749ebcff5: mov    %rsi,%rbp
  0x00007fc749ebcff8: mov    $0xffffff86,%esi
  0x00007fc749ebcfff: callq  0x00007fc749e29320  ; OopMap{rbp=Oop off=228}
                                                ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd004: callq  0x00007fc74e6947c0  ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd009: mov    $0xfffffff6,%esi
  0x00007fc749ebd00e: nop
  0x00007fc749ebd00f: callq  0x00007fc749e29320  ; OopMap{off=244}
                                                ;*invokevirtual length
                                                ; - Acfoamsimple::test@14 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd014: callq  0x00007fc74e6947c0  ;*invokevirtual length
                                                ; - Acfoamsimple::test@14 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd019: mov    $0xfffffff6,%esi
  0x00007fc749ebd01e: nop
  0x00007fc749ebd01f: callq  0x00007fc749e29320  ; OopMap{off=260}
                                                ;*invokevirtual length
                                                ; - Acfoamsimple::test@18 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd024: callq  0x00007fc74e6947c0  ;*invokevirtual length
                                                ; - Acfoamsimple::test@18 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd029: mov    $0xfffffff6,%esi
  0x00007fc749ebd02e: nop
  0x00007fc749ebd02f: callq  0x00007fc749e29320  ; OopMap{off=276}
                                                ;*arraylength
                                                ; - Acfoamsimple::test@7 (line 4)
                                                ;   {runtime_call}
  0x00007fc749ebd034: callq  0x00007fc74e6947c0  ;*arraylength
                                                ; - Acfoamsimple::test@7 (line 4)
                                                ;   {runtime_call}
  0x00007fc749ebd039: hlt    
  0x00007fc749ebd03a: hlt    
  0x00007fc749ebd03b: hlt    
  0x00007fc749ebd03c: hlt    
  0x00007fc749ebd03d: hlt    
  0x00007fc749ebd03e: hlt    
  0x00007fc749ebd03f: hlt    
B拆卸:

# parm0:    rsi:rsi   = '[Ljava/lang/String;'
  #           [sp+0x30]  (sp of caller)
  0x00007fdc296b30a0: mov    %eax,-0x6000(%rsp)
  0x00007fdc296b30a7: push   %rbp
  0x00007fdc296b30a8: sub    $0x20,%rsp         ;*synchronization entry
                                                ; - Acminesimple::test@-1 (line 3)
  0x00007fdc296b30ac: mov    0xc(%rsi),%ebp     ;*arraylength
                                                ; - Acminesimple::test@6 (line 4)
                                                ; implicit exception: dispatches to 0x00007fdc296b31ad
  0x00007fdc296b30af: movabs $0xeb8b7168,%rax   ;   {oop("")}
  0x00007fdc296b30b9: test   %ebp,%ebp
  0x00007fdc296b30bb: jle    0x00007fdc296b312e  ;*if_icmpge
                                                ; - Acminesimple::test@10 (line 4)
  0x00007fdc296b30bd: test   %ebp,%ebp
  0x00007fdc296b30bf: jbe    0x00007fdc296b3177
  0x00007fdc296b30c5: mov    %ebp,%ecx
  0x00007fdc296b30c7: dec    %ecx
  0x00007fdc296b30c9: cmp    %ebp,%ecx
  0x00007fdc296b30cb: jae    0x00007fdc296b3177
  0x00007fdc296b30d1: xor    %r8d,%r8d          ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
  0x00007fdc296b30d4: mov    0x10(%rsi,%r8,4),%edi  ;*aaload
                                                ; - Acminesimple::test@15 (line 5)
  0x00007fdc296b30d9: mov    0x14(%rdi),%r11d   ; implicit exception: dispatches to 0x00007fdc296b318d
  0x00007fdc296b30dd: mov    0x14(%rax),%r10d   ; implicit exception: dispatches to 0x00007fdc296b319d
  0x00007fdc296b30e1: cmp    %r10d,%r11d
  0x00007fdc296b30e4: jg     0x00007fdc296b30e9  ;*if_icmple
                                                ; - Acminesimple::test@23 (line 5)
  0x00007fdc296b30e6: mov    %rax,%rdi
  0x00007fdc296b30e9: inc    %r8d               ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b30ec: cmp    $0x1,%r8d
  0x00007fdc296b30f0: jge    0x00007fdc296b30f7  ;*if_icmpge
                                                ; - Acminesimple::test@10 (line 4)
  0x00007fdc296b30f2: mov    %rdi,%rax          ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b30f5: jmp    0x00007fdc296b30d4
  0x00007fdc296b30f7: cmp    %ecx,%r8d
  0x00007fdc296b30fa: jl     0x00007fdc296b3163
  0x00007fdc296b30fc: mov    %edi,%r10d
  0x00007fdc296b30ff: cmp    %ebp,%r8d
  0x00007fdc296b3102: jl     0x00007fdc296b310f
  0x00007fdc296b3104: mov    %r10d,%r9d
  0x00007fdc296b3107: jmp    0x00007fdc296b312b
  0x00007fdc296b3109: data32 xchg %ax,%ax
  0x00007fdc296b310c: mov    %r9d,%r10d         ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
  0x00007fdc296b310f: mov    0x10(%rsi,%r8,4),%r9d  ;*aaload
                                                ; - Acminesimple::test@15 (line 5)
  0x00007fdc296b3114: mov    0x14(%r9),%r11d    ; implicit exception: dispatches to 0x00007fdc296b318d
  0x00007fdc296b3118: mov    0x14(%r10),%ebx    ; implicit exception: dispatches to 0x00007fdc296b319d
  0x00007fdc296b311c: cmp    %ebx,%r11d
  0x00007fdc296b311f: cmovle %r10d,%r9d
  0x00007fdc296b3123: inc    %r8d               ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b3126: cmp    %ebp,%r8d
  0x00007fdc296b3129: jl     0x00007fdc296b310c
  0x00007fdc296b312b: mov    %r9,%rax           ;*if_icmpge
                                                ; - Acminesimple::test@10 (line 4)
  0x00007fdc296b312e: add    $0x20,%rsp
  0x00007fdc296b3132: pop    %rbp
  0x00007fdc296b3133: test   %eax,0x5766ec7(%rip)        # 0x00007fdc2ee1a000
                                                ;   {poll_return}
  0x00007fdc296b3139: retq   
  0x00007fdc296b313a: mov    %r11d,%edi
  0x00007fdc296b313d: data32 xchg %ax,%ax       ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b3140: movslq %r8d,%r10
  0x00007fdc296b3143: mov    0x14(%rsi,%r10,4),%r10d  ;*aaload
                                                ; - Acminesimple::test@15 (line 5)
  0x00007fdc296b3148: mov    0x14(%r10),%r9d    ; implicit exception: dispatches to 0x00007fdc296b318d
  0x00007fdc296b314c: mov    0x14(%rdi),%r11d   ; implicit exception: dispatches to 0x00007fdc296b319d
  0x00007fdc296b3150: cmp    %r11d,%r9d
  0x00007fdc296b3153: cmovle %edi,%r10d
  0x00007fdc296b3157: add    $0x2,%r8d          ;*iinc
                                                ; - Acminesimple::test@30 (line 4)
  0x00007fdc296b315b: cmp    %ecx,%r8d
  0x00007fdc296b315e: jge    0x00007fdc296b30ff  ;*if_icmpge
                                                ; - Acminesimple::test@10 (line 4)
  0x00007fdc296b3160: mov    %r10d,%edi         ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
  0x00007fdc296b3163: mov    0x10(%rsi,%r8,4),%r11d  ;*aaload
                                                ; - Acminesimple::test@15 (line 5)
  0x00007fdc296b3168: mov    0x14(%r11),%r10d   ; implicit exception: dispatches to 0x00007fdc296b318d
  0x00007fdc296b316c: mov    0x14(%rdi),%r9d    ; implicit exception: dispatches to 0x00007fdc296b319d
  0x00007fdc296b3170: cmp    %r9d,%r10d
                                                ; - Acminesimple::test@23 (line 5)
  0x00007fdc296b3175: jmp    0x00007fdc296b3140
  0x00007fdc296b3177: mov    %rsi,(%rsp)
  0x00007fdc296b317b: mov    $0xffffff86,%esi
  0x00007fdc296b3180: data32 xchg %ax,%ax
  0x00007fdc296b3183: callq  0x00007fdc29620320  ; OopMap{[0]=Oop off=232}
                                                ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b3188: callq  0x00007fdc2de8b7c0  ;*aload_0
                                                ; - Acminesimple::test@13 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b318d: mov    $0xfffffff6,%esi
  0x00007fdc296b3192: nop
  0x00007fdc296b3193: callq  0x00007fdc29620320  ; OopMap{off=248}
                                                ;*invokevirtual length
                                                ; - Acminesimple::test@16 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b3198: callq  0x00007fdc2de8b7c0  ;*invokevirtual length
                                                ; - Acminesimple::test@16 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b319d: mov    $0xfffffff6,%esi
  0x00007fdc296b31a2: nop
  0x00007fdc296b31a3: callq  0x00007fdc29620320  ; OopMap{off=264}
                                                ;*invokevirtual length
                                                ; - Acminesimple::test@20 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b31a8: callq  0x00007fdc2de8b7c0  ;*invokevirtual length
                                                ; - Acminesimple::test@20 (line 5)
                                                ;   {runtime_call}
  0x00007fdc296b31ad: mov    $0xfffffff6,%esi
  0x00007fdc296b31b2: nop
  0x00007fdc296b31b3: callq  0x00007fdc29620320  ; OopMap{off=280}
                                                ;*arraylength
                                                ; - Acminesimple::test@6 (line 4)
                                                ;   {runtime_call}
  0x00007fdc296b31b8: callq  0x00007fdc2de8b7c0  ;*arraylength
                                                ; - Acminesimple::test@6 (line 4)
                                                ;   {runtime_call}
  0x00007fdc296b31bd: hlt    
  0x00007fdc296b31be: hlt    
  0x00007fdc296b31bf: hlt    
[Exception Handler]
# parm0:    rsi:rsi   = '[Ljava/lang/String;'
  #           [sp+0x20]  (sp of caller)
  0x00007fc749ebcf20: mov    %eax,-0x6000(%rsp)
  0x00007fc749ebcf27: push   %rbp
  0x00007fc749ebcf28: sub    $0x10,%rsp         ;*synchronization entry
                                                ; - Acfoamsimple::test@-1 (line 3)
  0x00007fc749ebcf2c: mov    0xc(%rsi),%r9d     ;*arraylength
                                                ; - Acfoamsimple::test@7 (line 4)
                                                ; implicit exception: dispatches to 0x00007fc749ebd029
  0x00007fc749ebcf30: movabs $0xeb8b7168,%rax   ;   {oop("")}
  0x00007fc749ebcf3a: test   %r9d,%r9d
  0x00007fc749ebcf3d: jle    0x00007fc749ebcfad  ;*if_icmpge
                                                ; - Acfoamsimple::test@8 (line 4)
  0x00007fc749ebcf3f: test   %r9d,%r9d
  0x00007fc749ebcf42: jbe    0x00007fc749ebcff5
  0x00007fc749ebcf48: mov    %r9d,%ebx
  0x00007fc749ebcf4b: dec    %ebx
  0x00007fc749ebcf4d: cmp    %r9d,%ebx
  0x00007fc749ebcf50: jae    0x00007fc749ebcff5
  0x00007fc749ebcf56: xor    %ecx,%ecx          ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
  0x00007fc749ebcf58: mov    0x10(%rsi,%rcx,4),%edx  ;*aaload
                                                ; - Acfoamsimple::test@13 (line 5)
  0x00007fc749ebcf5c: mov    0x14(%rdx),%r10d   ; implicit exception: dispatches to 0x00007fc749ebd009
  0x00007fc749ebcf60: mov    0x14(%rax),%r8d    ; implicit exception: dispatches to 0x00007fc749ebd019
  0x00007fc749ebcf64: cmp    %r8d,%r10d
  0x00007fc749ebcf67: jg     0x00007fc749ebcf6c  ;*if_icmple
                                                ; - Acfoamsimple::test@21 (line 5)
  0x00007fc749ebcf69: mov    %rax,%rdx
  0x00007fc749ebcf6c: inc    %ecx               ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcf6e: cmp    $0x1,%ecx
  0x00007fc749ebcf71: jge    0x00007fc749ebcf78  ;*if_icmpge
                                                ; - Acfoamsimple::test@8 (line 4)
  0x00007fc749ebcf73: mov    %rdx,%rax          ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcf76: jmp    0x00007fc749ebcf58
  0x00007fc749ebcf78: cmp    %ebx,%ecx
  0x00007fc749ebcf7a: jl     0x00007fc749ebcfe1
  0x00007fc749ebcf7c: mov    %edx,%r10d
  0x00007fc749ebcf7f: cmp    %r9d,%ecx
  0x00007fc749ebcf82: jl     0x00007fc749ebcf8f
  0x00007fc749ebcf84: mov    %r10d,%r8d
  0x00007fc749ebcf87: jmp    0x00007fc749ebcfaa
  0x00007fc749ebcf89: data32 xchg %ax,%ax
  0x00007fc749ebcf8c: mov    %r8d,%r10d         ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
  0x00007fc749ebcf8f: mov    0x10(%rsi,%rcx,4),%r8d  ;*aaload
                                                ; - Acfoamsimple::test@13 (line 5)
  0x00007fc749ebcf94: mov    0x14(%r8),%r11d    ; implicit exception: dispatches to 0x00007fc749ebd009
  0x00007fc749ebcf98: mov    0x14(%r10),%edi    ; implicit exception: dispatches to 0x00007fc749ebd019
  0x00007fc749ebcf9c: cmp    %edi,%r11d
  0x00007fc749ebcf9f: cmovle %r10d,%r8d
  0x00007fc749ebcfa3: inc    %ecx               ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcfa5: cmp    %r9d,%ecx
  0x00007fc749ebcfa8: jl     0x00007fc749ebcf8c
  0x00007fc749ebcfaa: mov    %r8,%rax           ;*if_icmpge
                                                ; - Acfoamsimple::test@8 (line 4)
  0x00007fc749ebcfad: add    $0x10,%rsp
  0x00007fc749ebcfb1: pop    %rbp
  0x00007fc749ebcfb2: test   %eax,0x5766048(%rip)        # 0x00007fc74f623000
                                                ;   {poll_return}
  0x00007fc749ebcfb8: retq   
  0x00007fc749ebcfb9: mov    %r10d,%edx
  0x00007fc749ebcfbc: nopl   0x0(%rax)          ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcfc0: movslq %ecx,%r10
  0x00007fc749ebcfc3: mov    0x14(%rsi,%r10,4),%r10d  ;*aaload
                                                ; - Acfoamsimple::test@13 (line 5)
  0x00007fc749ebcfc8: mov    0x14(%r10),%r8d    ; implicit exception: dispatches to 0x00007fc749ebd009
  0x00007fc749ebcfcc: mov    0x14(%rdx),%r11d   ; implicit exception: dispatches to 0x00007fc749ebd019
  0x00007fc749ebcfd0: cmp    %r11d,%r8d
  0x00007fc749ebcfd3: cmovle %edx,%r10d
  0x00007fc749ebcfd7: add    $0x2,%ecx          ;*iinc
                                                ; - Acfoamsimple::test@28 (line 4)
  0x00007fc749ebcfda: cmp    %ebx,%ecx
  0x00007fc749ebcfdc: jge    0x00007fc749ebcf7f  ;*if_icmpge
                                                ; - Acfoamsimple::test@8 (line 4)
  0x00007fc749ebcfde: mov    %r10d,%edx         ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
  0x00007fc749ebcfe1: mov    0x10(%rsi,%rcx,4),%r10d  ;*aaload
                                                ; - Acfoamsimple::test@13 (line 5)
  0x00007fc749ebcfe6: mov    0x14(%r10),%r8d    ; implicit exception: dispatches to 0x00007fc749ebd009
  0x00007fc749ebcfea: mov    0x14(%rdx),%r11d   ; implicit exception: dispatches to 0x00007fc749ebd019
  0x00007fc749ebcfee: cmp    %r11d,%r8d
  0x00007fc749ebcff1: jg     0x00007fc749ebcfb9  ;*if_icmple
                                                ; - Acfoamsimple::test@21 (line 5)
  0x00007fc749ebcff3: jmp    0x00007fc749ebcfc0
  0x00007fc749ebcff5: mov    %rsi,%rbp
  0x00007fc749ebcff8: mov    $0xffffff86,%esi
  0x00007fc749ebcfff: callq  0x00007fc749e29320  ; OopMap{rbp=Oop off=228}
                                                ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd004: callq  0x00007fc74e6947c0  ;*aload_0
                                                ; - Acfoamsimple::test@11 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd009: mov    $0xfffffff6,%esi
  0x00007fc749ebd00e: nop
  0x00007fc749ebd00f: callq  0x00007fc749e29320  ; OopMap{off=244}
                                                ;*invokevirtual length
                                                ; - Acfoamsimple::test@14 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd014: callq  0x00007fc74e6947c0  ;*invokevirtual length
                                                ; - Acfoamsimple::test@14 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd019: mov    $0xfffffff6,%esi
  0x00007fc749ebd01e: nop
  0x00007fc749ebd01f: callq  0x00007fc749e29320  ; OopMap{off=260}
                                                ;*invokevirtual length
                                                ; - Acfoamsimple::test@18 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd024: callq  0x00007fc74e6947c0  ;*invokevirtual length
                                                ; - Acfoamsimple::test@18 (line 5)
                                                ;   {runtime_call}
  0x00007fc749ebd029: mov    $0xfffffff6,%esi
  0x00007fc749ebd02e: nop
  0x00007fc749ebd02f: callq  0x00007fc749e29320  ; OopMap{off=276}
                                                ;*arraylength
                                                ; - Acfoamsimple::test@7 (line 4)
                                                ;   {runtime_call}
  0x00007fc749ebd034: callq  0x00007fc74e6947c0  ;*arraylength
                                                ; - Acfoamsimple::test@7 (line 4)
                                                ;   {runtime_call}
  0x00007fc749ebd039: hlt    
  0x00007fc749ebd03a: hlt    
  0x00007fc749ebd03b: hlt    
  0x00007fc749ebd03c: hlt    
  0x00007fc749ebd03d: hlt    
  0x00007fc749ebd03e: hlt    
  0x00007fc749ebd03f: hlt    
使用
Math.min(args.length,20)
而不是像中那样使用
args.length
,其行为类似:

A-with-min:

 static java.lang.String test(java.lang.String[]);
  Code:
   0:   ldc #2; //String 
   2:   astore_1
   3:   iconst_0
   4:   istore_2
   5:   aload_0
   6:   arraylength
   7:   bipush  20
   9:   invokestatic    #3; //Method java/lang/Math.min:(II)I
   12:  istore_3
   13:  iload_2
   14:  iload_3
   15:  if_icmpge   41
   18:  aload_0
   19:  iload_2
   20:  aaload
   21:  invokevirtual   #4; //Method java/lang/String.length:()I
   24:  aload_1
   25:  invokevirtual   #4; //Method java/lang/String.length:()I
   28:  if_icmple   35
   31:  aload_0
   32:  iload_2
   33:  aaload
   34:  astore_1
   35:  iinc    2, 1
   38:  goto    13
   41:  aload_1
   42:  areturn
static java.lang.String test(java.lang.String[]);
  Code:
   0:   ldc #2; //String 
   2:   astore_1
   3:   iconst_0
   4:   istore_2
   5:   iload_2
   6:   aload_0
   7:   arraylength
   8:   bipush  20
   10:  invokestatic    #3; //Method java/lang/Math.min:(II)I
   13:  if_icmpge   39
   16:  aload_0
   17:  iload_2
   18:  aaload
   19:  invokevirtual   #4; //Method java/lang/String.length:()I
   22:  aload_1
   23:  invokevirtual   #4; //Method java/lang/String.length:()I
   26:  if_icmple   33
   29:  aload_0
   30:  iload_2
   31:  aaload
   32:  astore_1
   33:  iinc    2, 1
   36:  goto    5
   39:  aload_1
   40:  areturn
B-with-min:

 static java.lang.String test(java.lang.String[]);
  Code:
   0:   ldc #2; //String 
   2:   astore_1
   3:   iconst_0
   4:   istore_2
   5:   aload_0
   6:   arraylength
   7:   bipush  20
   9:   invokestatic    #3; //Method java/lang/Math.min:(II)I
   12:  istore_3
   13:  iload_2
   14:  iload_3
   15:  if_icmpge   41
   18:  aload_0
   19:  iload_2
   20:  aaload
   21:  invokevirtual   #4; //Method java/lang/String.length:()I
   24:  aload_1
   25:  invokevirtual   #4; //Method java/lang/String.length:()I
   28:  if_icmple   35
   31:  aload_0
   32:  iload_2
   33:  aaload
   34:  astore_1
   35:  iinc    2, 1
   38:  goto    13
   41:  aload_1
   42:  areturn
static java.lang.String test(java.lang.String[]);
  Code:
   0:   ldc #2; //String 
   2:   astore_1
   3:   iconst_0
   4:   istore_2
   5:   iload_2
   6:   aload_0
   7:   arraylength
   8:   bipush  20
   10:  invokestatic    #3; //Method java/lang/Math.min:(II)I
   13:  if_icmpge   39
   16:  aload_0
   17:  iload_2
   18:  aaload
   19:  invokevirtual   #4; //Method java/lang/String.length:()I
   22:  aload_1
   23:  invokevirtual   #4; //Method java/lang/String.length:()I
   26:  if_icmple   33
   29:  aload_0
   30:  iload_2
   31:  aaload
   32:  astore_1
   33:  iinc    2, 1
   36:  goto    5
   39:  aload_1
   40:  areturn

(jit分解的函数太长,无法在应答中发布)

数组具有固定长度。但是
Array
可以重新分配到循环中具有不同长度的不同数组。您可能要求
ArrayList
。正确,我已编辑。谢谢。也就是说,
Array
不一定具有固定长度,如果它在循环中或被其他线程修改。那么您在说什么呢ng是,除非
易失性
,否则性能差异不大是的,但除非代码被迭代10000次,否则不会编译为本机代码,这将产生更大的差异。长话短说,为了安全起见,请在循环之前将其计算为int。thanks@PeterLawrey数组的
长度如何计算de>字段被标记为
volatile
?您是如何获得所有这些输出的?非常慢,这就是一直吃的东西。字节码部分很简单:
javap-c classname
,jit反汇编程序就像
java-server-XX:+UnlockDiagnosticVMOptions'-XX:CompileCommand=print,*classname.methodname'-XX:CompileThreshold=10-cp.classname
。但是它只打印一些东西,如果它确实被编译过的话。你应该安装hsdis插件。这只是确认
arraylength
只是引用了数组中的一个字段。在这两种情况下,将数组长度转换为
mov
指令。