рдЕрднреА рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдкреНрд░рд┐рдп
рд▓рд╛рди рдиреЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд рдкреЛрд╕реНрдЯ рд▓рд┐рдЦреА:
http://habrahabr.ru/post/151887/рдЙрдирдХреЗ рдкреЛрд╕реНрдЯ рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ, рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рдпрджрд┐ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдЖрдк рд░реИрдкрд░ рдХреЛ рдПрдХ рдПрдХрд▓-рддрддреНрд╡ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд░рдгреА рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдлрд╝реАрд▓реНрдб рд╕реЗ рдорд╛рди рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╣реЛрддреА рд╣реИред
рдореБрдЭреЗ рдПрдХ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рд╢реНрд╡реЗрдд рдкрддреНрд░ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╕реВрд░реНрдп рд╕реЗ рдпрд╣ рд╕реНрдЯреАрд░рд┐рдпреЛрдЯрд╛рдЗрдк рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ред рд╡рд╣рд╛рдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╕рдмрд╕реЗ рддреЗрдЬреА рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рд╕реНрдерд┐рд░ рдлрд╝реАрд▓реНрдб, рдлрд┐рд░ рдПрдХ рдПрд░реЗ рддрддреНрд╡ рдФрд░ рдЗрд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдлрд╝реАрд▓реНрдб рд╕реВрдЪреА рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗ рдореЗрд░реЗ рд╢рдмреНрдж рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдпрд╣реА рдХрд╛рд░рдг рдерд╛ред
рд▓реЗрдЦ рдЬреВрдирд┐рдпрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИ, рдкрд╛рдардХ рдХреЛ рдЬрд╛рд╡рд╛, рдПрдПрд╕рдПрдо x86 рдФрд░ рдмрд╛рдпрдЯреЗрдХреЛрдб рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдБрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рд╕реА рдРрд░реЗ рддрддреНрд╡ рддрдХ рдкрд╣реБрдБрдЪ рддреЗрдЬрд╝ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдПрдХ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВ
- рд╕рдордЭреЗрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рдгреА рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рд╣реИ [0] рдФрд░ рдпрд╣
рдореИрдВрдиреЗ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдЪреБрдирд╛, рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреАрдорд╛рд░ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдлреЗрдВрдХреЗрдВрдЧреЗред
package numbers; public class TestNumbers { public static void main(String[] args) { test(new IntNumField()); test(IntNumArray.create()); } private static final void test(int[] mutableInt2) { for (int index = 10000; index-- > 0;) { IntNumArray.inc(mutableInt2); } } private static final void test(IntNumField mutableInt1) { for (int index = 10000; index-- > 0;) { mutableInt1.inc(); } } public static final class IntNumField { protected int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } public final void inc() { this.value++; } } public static final class IntNumArray { public static final int[] create() { return new int[1]; } public static final int get(int[] array) { return array[0]; } public static final void set(int[] array, int value) { array[0] = value; } public static final void inc(int[] array) { array[0]++; } } }
IntNumField рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ IntNumArray, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рдПрдХ рдПрдХрд▓ рд╕рд░рдгреА рдХреЗ рд╕рд╛рдеред рдкреНрд░рддреНрдпреЗрдХ рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЗрдВрдХ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рджреНрд╡рд╛рд░рд╛ рд╡реГрджреНрдзрд┐ рдХрд░рддреА рд╣реИред рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ, inc рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 10,000 рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рддрд╛рдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реЛред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдмрд╛рдпреЛрдЯреЗрдХ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
~$ javap -c numbers/TestNumbers$IntNumField public int getValue(); Code: 0: aload_0 1: getfield #18;
рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдЗрд╕реЗ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рдореВрд▓реНрдп рдорд╛рди рдХреЛ рдзрдХреНрдХрд╛ рджреЗрдВред рдмрд╛рдХреА рд╕рдм рдЙрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ inc рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреБрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ IntNumArray рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╣рдорд╛рд░рд╛ рдХреНрдпрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ:
~$ javap -c numbers/TestNumbers$IntNumArray public static final int get(int[]); Code: 0: aload_0 1: iconst_0 2: iaload 3: ireturn public static final void set(int[], int); Code: 0: aload_0 1: iconst_0 2: iload_1 3: iastore 4: return public static final void inc(int[]); Code: 0: aload_0 1: iconst_0 2: dup2 3: iaload 4: iconst_1 5: iadd 6: iastore 7: return
рдЙрд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ getfield рдХреЛ iconst_0 рдФрд░ iaload рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЦреИрд░, рдпрд╣ рдЕрднреА рднреА рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдХ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛:
~$ java -XX:+UnlockDiagnosticVMOptions -XX:CompileThreshold=10000 -XX:+PrintAssembly numbers.TestNumbers # {method} 'inc' '()V' in 'numbers/TestNumbers$IntNumField' # [sp+0x20] (sp of caller) 0x02141a87: cmp 0x4(%ecx),%eax 0x02141a8a: jne 0x020dd100 ; {runtime_call} [Verified Entry Point] 0x02141a90: mov %eax,0xffffc000(%esp) 0x02141a97: push %ebp 0x02141a98: sub $0x18,%esp ;*aload_0 ; - numbers.TestNumbers$IntNumField::inc@0 (line 50) 0x02141a9b: mov 0x8(%ecx),%esi ;*getfield value ; - numbers.TestNumbers$IntNumField::inc@2 (line 50) 0x02141a9e: inc %esi 0x02141a9f: mov %esi,0x8(%ecx) ;*putfield value ; - numbers.TestNumbers$IntNumField::inc@7 (line 50) 0x02141aa2: add $0x18,%esp 0x02141aa5: pop %ebp 0x02141aa6: test %eax,0x1b0100 ; {poll_return} 0x02141aac: ret # {method} 'inc' '([I)V' in 'numbers/TestNumbers$IntNumArray' # parm0: ecx = '[I' # [sp+0x20] (sp of caller) 0x02141c80: mov %eax,0xffffc000(%esp) 0x02141c87: push %ebp 0x02141c88: sub $0x18,%esp ;*aload_0 ; - numbers.TestNumbers$IntNumArray::inc@0 (line 71) 0x02141c8b: cmpl $0x0,0x8(%ecx) ; implicit exception: dispatches to 0x02141cb7 0x02141c92: jbe 0x02141cc1 0x02141c98: mov 0xc(%ecx),%esi ;*iaload ; - numbers.TestNumbers$IntNumArray::inc@3 (line 71) 0x02141c9b: inc %esi 0x02141c9c: cmpl $0x0,0x8(%ecx) 0x02141ca3: jbe 0x02141ccd 0x02141ca9: mov %esi,0xc(%ecx) ;*iastore ; - numbers.TestNumbers$IntNumArray::inc@6 (line 71) 0x02141cac: add $0x18,%esp 0x02141caf: pop %ebp 0x02141cb0: test %eax,0x1b0100 ; {poll_return} 0x02141cb6: ret
рдореБрдЭреЗ рдХреЛрдб рд╕рдВрд░реЗрдЦрдг рдФрд░ [рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░] рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдлреЗрдВрдХрдХрд░ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЛ рдХрд╛рдЯрдирд╛ рдкрдбрд╝рд╛ред
рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реНрдЯреИрдХ рдкрд░ рдорд╛рди рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП inc% esi рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдХреЗрд╡рд▓ рдЕрд▓рдЧ
mov 0x8(%ecx),%esi ;*getfield value
рдФрд░
cmpl $0x0,0x8(%ecx) ; implicit exception: dispatches to 0x02141cb7 jbe 0x02141cc1 mov 0xc(%ecx),%esi ;*iaload
рдХреЛрдб рдХреЗ рджреВрд╕рд░реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдкрд╣рд▓реА рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдПрдХ рдЬрд╛рдБрдЪ рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ 0 рд╕рд░рдгреА рдХреА рд╕реАрдорд╛ рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ (0 <array.length)ред рдпрд╣ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рд╣реИ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧрд▓рдд рдерд╛, рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдПрдХ рд╣реА рдЪреЗрдХ рдиреАрдЪреЗ рджреЛ рд▓рд╛рдЗрдиреЗрдВ рд╣реЛрддреА рд╣реИ ... рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдзреАрдорд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╕реЗ рддреЗрдЬ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╕рдВрджреЗрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рди рдХреЗрд╡рд▓ рд╣рдо рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд░реИрдкрд░ рд╡рд░реНрдЧ рдФрд░ рдУрдУрдкреА рдХреЗ рд╕рднреА рдЖрдХрд░реНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
PS рдореИрдВрдиреЗ рдЕрднреА рднреА рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рд╣реИ, рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред