JDK8 рдФрд░ JDK7 рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ

рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдЕрдкрдиреЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛рддреНрд░рд╛ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рдПрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд░реА рд╣реБрдИ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреАрди рднрд░ рдЖрдпрд╛ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ (рдХрднреА-рдХрднреА рдордХреНрдЦреА рдкрд░ рдЙрддреНрдкрдиреНрди рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╡рд╕реНрддреБрдПрдВ) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреЗрдЯрд░реНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╕ рдЬрд╛рддрд╛ рд╣реИред рдЧреЗрдирд░ рдХреИрд╢ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЗрдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд┐рддрдирд╛ рддреЗрдЬ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред




рдПрдХ рддреНрд╡рд░рд┐рдд рд╣рд╛рде рдХреЗ рд╕рд╛рде, рдЬреЗрдПрдордПрдЪ рдореЗрдВ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдмреЗрдирдЪрдорд╛рд░реНрдХ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрдмреЗрдирдорд╛рд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдХреГрддрдШреНрди рд╕рдВрдмрдВрдз рд╣реИ, рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗ рдЙрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХреБрдЫ рдорд╛рдкрдиреЗ рдХреЗ рдПрдХ рд▓рд╛рдЦ рддрд░реАрдХреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдореБрдХреНрдХреЗрдмрд╛рдЬреА-рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдорд╛рдкрд╛, рди рдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ рд╣реА рдХреЙрд▓ рдХрд┐рдпрд╛ред рдФрд░ рдореБрдЭреЗ рдЕрдкрдиреА рдЧрд▓рддреА рддрднреА рдорд┐рд▓реА рдЬрдм рдореИрдВрдиреЗ PrintAssembly рдХреЛ рджреЗрдЦрд╛ред

рдкрд░рд┐рдгрд╛рдо рджрд┐рд▓рдЪрд╕реНрдк рдереЗ, рд▓реЗрдХрд┐рди рд╣рдм рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рд▓реЗрдЦ рдереЗ рдЬреЛ рддреБрд▓рдирд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдмреЗрд╣рддрд░ рд╕рдордп рддрдХ рдПрдХ рдмреЙрдХреНрд╕ рдореЗрдВ рд░рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ рд░рд╛рдЬрдиреАрддрд┐ рд╕реЗ рднрд░рд╛ рдЯреНрд╡рд┐рдЯрд░ рдлреАрдб рдЬрд╛рд╡рд╛ рдХреЗ рдЯреНрд╡реАрдЯреНрд╕ рд╕реЗ рдкрддрд▓рд╛ рд╣реЛ рдЧрдпрд╛ред рдЕрдкрдиреА рдЦреБрд╢реА рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ JDK7 рдФрд░ JDK8 рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ JMH рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕рдВрдХреЗрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:


рдореИрдВрдиреЗ рдЬреЛ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдорд╛рдкреА, рд╡рд╣ рд╕реАрдзреЗ рдХрдХреНрд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рд░рд╣реА рдереА:

рдЗрд╕реА рддрд░рд╣ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдПред

рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдЯреЗрд╕реНрдЯ
@BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @State(Scope.Thread) public class ReflectionFieldAccess { private static final Class<TestedClass> clazz = TestedClass.class; private TestedClass testedObject; Field simpleField; Field fieldAccessible; @Setup public void init() { try { testedObject = new TestedClass(); simpleField = clazz.getField("a"); Field Field = clazz.getField("b"); Field.setAccessible(true); fieldAccessible = Field; } catch (Exception e) { // do nothing } } @GenerateMicroBenchmark public Object testFieldSaveAccessible() throws Exception { return fieldAccessible.get(testedObject); } @GenerateMicroBenchmark public Object testFieldSaveNotAccessible() throws Exception { return simpleField.get(testedObject); } @GenerateMicroBenchmark public Object testFieldStraighforward() throws Exception { return testedObject.c; } } 


рд╕реНрдереИрддрд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
 @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @State(Scope.Thread) public class ReflectionFieldStaticAccess { private static final Class<TestedClass> clazz = TestedClass.class; Field simpleField; Field fieldAccessible; @Setup public void init() { try { simpleField = clazz.getField("aStat"); Field Field = clazz.getField("bStat"); Field.setAccessible(true); fieldAccessible = Field; } catch (Exception e) { // do nothing } } @GenerateMicroBenchmark public Object testFieldSaveAccessible() throws Exception { return fieldAccessible.get(null); } @GenerateMicroBenchmark public Object testFieldSaveNotAccessible() throws Exception { return simpleField.get(null); } @GenerateMicroBenchmark public Object testFieldStraighforward() throws Exception { return TestedClass.cStat; } } 



JDK7 рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо:


JDK8 рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо:


рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо:



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ:
  1. рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ (рд╕рддреНрдп) рд╣рдореЗрдВ рдЕрдзрд┐рдХрд╛рд░ рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ
  2. рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ
  3. рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд░реНрд╢рди jdk8 рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ


рдЪрд▓реЛ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдзреНрдпрдпрди рдХреЗ рддрд╣рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЪрдпрди рд╣реИред
рдореЗрдердбрд╛рдВрдбрд▓ рдПрдкреАрдЖрдИ, рдЬреЗрдПрд╕рдЖрд░ 292 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛, рдЬреЗрдбреАрдХреЗ 7 рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рджреЛ рдкрд░реАрдХреНрд╖рдгред

рдЗрд╕реА рддрд░рд╣ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдПред

рддрд░реАрдХреЛрдВ рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг
 @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @State(Scope.Thread) public class ReflectionMethodAccess { private static final Class<TestedClass> clazz = TestedClass.class; private TestedClass testedObject; Method simpleMethod; Method methodAccessible; FastMethod fastMethod; MethodHandle methodHandle; @Setup public void init() { try { testedObject = new TestedClass(); simpleMethod = clazz.getMethod("getA", null); Method method = clazz.getMethod("getB", null); method.setAccessible(true); methodAccessible = method; fastMethod = FastClass.create(clazz).getMethod("getC", null); methodHandle = MethodHandles.lookup().findVirtual(clazz, "getD", MethodType.methodType(Integer.class)); } catch (Exception e) { // do nothing } } @GenerateMicroBenchmark public Object testFastMethod() throws Throwable { return fastMethod.invoke(testedObject, null); } @GenerateMicroBenchmark public Object testMethodAccessible() throws Throwable { return methodAccessible.invoke(testedObject, null); } @GenerateMicroBenchmark public Object testMethodNotAccessible() throws Throwable { return simpleMethod.invoke(testedObject, null); } @GenerateMicroBenchmark public Object testMethodHandleExact() throws Throwable { return (Integer)methodHandle.invokeExact(testedObject); } @GenerateMicroBenchmark public Object testMethodHandle() throws Throwable { return (Integer)methodHandle.invoke(testedObject); } @GenerateMicroBenchmark public Object testMethodDirect() throws Throwable { return testedObject.getA(); } } 


рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
 @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @State(Scope.Thread) public class ReflectionMethodStaticAccess { private static final Class<TestedClass> clazz = TestedClass.class; Method simpleMethod; Method methodAccessible; MethodHandle methodHandle; FastMethod fastMethod; @Setup public void init() { try { simpleMethod = clazz.getMethod("getAStatic", null); Method method = clazz.getMethod("getBStatic", null); method.setAccessible(true); methodAccessible = method; fastMethod = FastClass.create(clazz).getMethod("getCStatic", null); methodHandle = MethodHandles.lookup().findStatic(clazz, "getDStatic", MethodType.methodType(Integer.class)); } catch (Exception e) { // do nothing } } @GenerateMicroBenchmark public Object testFastMethod() throws Throwable { return fastMethod.invoke(null, null); } @GenerateMicroBenchmark public Object testMethodAccessible() throws Throwable { return methodAccessible.invoke(null, null); } @GenerateMicroBenchmark public Object testMethodNotAccessible() throws Throwable { return simpleMethod.invoke(null, null); } @GenerateMicroBenchmark public Object testMethodHandleExact() throws Throwable { return (Integer)methodHandle.invokeExact(); } @GenerateMicroBenchmark public Object testMethodHandle() throws Throwable { return (Integer)methodHandle.invoke(); } @GenerateMicroBenchmark public Object testMethodDirect() throws Throwable { return TestedClass.getAStatic(); } } 



MethodHandle рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╕реБрдиреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдЗрд╡рд╛рдиреЛрд╡ рдХреА рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЗрдирд╡реЛрдХреЗрдВрдбрд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

JDK7 рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо:


JDK8 рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо:


рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо:



рдЧреНрд░рд╛рдлрд╝ рд╕реЗ, рдХрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
  1. рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╛рд╕реНрдЯрдореЗрдереЛрдб рдиреЗ jdk7 рдкрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд┐рдпрд╛, jdk8 рдкрд░ рдпрд╣ 2 рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЗрд╕реА рддрд░рд╣ рд╕реЗ рд╕реЗрдЯреИрдмрд┐рд▓ (рд╕рдЪ) (рдЕрдВрддрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рд░реНрдЬрд┐рди рдХреЗ рднреАрддрд░ рд╣реИ)
  2. Jdk8 рдореЗрдВ, MethodHandle.invoke рдХрд╛ рдХрд╛рдо рдмрд╣реБрдд рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ
  3. рдХреНрд╖реЗрддреНрд░ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде, рд╕рдордЧреНрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдкреНрд░рджрд░реНрд╢рди рдмрдврд╝рд╛ рд╣реИред


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд┐рд╖реНрдХрд░реНрд╖ рд╕рд░рд▓ рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рд▓рд┐рдП jdk8 рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░рдг рд╣реИред

рдпрджрд┐ рдЖрдк рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкреЗрдВ рдпрд╛ рдмрдЧ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ, рдлрд┐рд░ рдЬреАрдердм рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ ред

PS рдореБрдЭреЗ рдЙрди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

Source: https://habr.com/ru/post/In216435/


All Articles