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

рдПрдХ рддреНрд╡рд░рд┐рдд рд╣рд╛рде рдХреЗ рд╕рд╛рде, рдЬреЗрдПрдордПрдЪ рдореЗрдВ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдмреЗрдирдЪрдорд╛рд░реНрдХ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред рдорд╛рдЗрдХреНрд░реЛрдмреЗрдирдорд╛рд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдХреГрддрдШреНрди рд╕рдВрдмрдВрдз рд╣реИ, рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗ рдЙрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХреБрдЫ рдорд╛рдкрдиреЗ рдХреЗ рдПрдХ рд▓рд╛рдЦ рддрд░реАрдХреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдореБрдХреНрдХреЗрдмрд╛рдЬреА-рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдорд╛рдкрд╛, рди рдХрд┐ рд╡рд┐рдзрд┐ рдХреЛ рд╣реА рдХреЙрд▓ рдХрд┐рдпрд╛ред рдФрд░ рдореБрдЭреЗ рдЕрдкрдиреА рдЧрд▓рддреА рддрднреА рдорд┐рд▓реА рдЬрдм рдореИрдВрдиреЗ PrintAssembly рдХреЛ рджреЗрдЦрд╛ред
рдкрд░рд┐рдгрд╛рдо рджрд┐рд▓рдЪрд╕реНрдк рдереЗ, рд▓реЗрдХрд┐рди рд╣рдм рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рд▓реЗрдЦ рдереЗ рдЬреЛ рддреБрд▓рдирд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдмреЗрд╣рддрд░ рд╕рдордп рддрдХ рдПрдХ рдмреЙрдХреНрд╕ рдореЗрдВ рд░рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ рд░рд╛рдЬрдиреАрддрд┐ рд╕реЗ рднрд░рд╛ рдЯреНрд╡рд┐рдЯрд░ рдлреАрдб рдЬрд╛рд╡рд╛ рдХреЗ рдЯреНрд╡реАрдЯреНрд╕ рд╕реЗ рдкрддрд▓рд╛ рд╣реЛ рдЧрдпрд╛ред рдЕрдкрдиреА рдЦреБрд╢реА рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ JDK7 рдФрд░ JDK8 рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ JMH рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕рдВрдХреЗрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
- рдмреЗрдВрдЪрдорд╛рд░реНрдХ - рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдЪрд┐рд╣реНрдирд┐рдд @GenerateMicroBenchmark
- рдореЛрдб - рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЛрдб, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд░реЛрдорд╛рдВрдЪрд┐рдд - рдереНрд░реВрдкреБрдЯ, рд╕рдордп рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 1
- рдирдореВрдиреЗ - рдорд╛рдк рдХреА рд╕рдВрдЦреНрдпрд╛
- рдФрд╕рдд - рд╕рдордп рдХреА рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЕрд╡рдзрд┐ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреА рдФрд╕рдд рд╕рдВрдЦреНрдпрд╛
- рдорд╛рдзреНрдп рддреНрд░реБрдЯрд┐ - рдорд╛рдирдХ рддреНрд░реБрдЯрд┐
- рдЗрдХрд╛рдЗрдпрд╛рдВ - рдорд╛рдк рдХреА рдЗрдХрд╛рдИ - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди / рджреВрд╕рд░рд╛
рдореИрдВрдиреЗ рдЬреЛ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдорд╛рдкреА, рд╡рд╣ рд╕реАрдзреЗ рдХрдХреНрд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рд░рд╣реА рдереА:
- testFieldSaveAccessible - рдлрд╝реАрд▓реНрдб рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ (рд╕рддреНрдп) рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдВрдЪ
- testFieldSaveNotAccessible - рдХреЗрд╡рд▓ рдПрдХ рдЙрднрд░реЗ рд╣реБрдП рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪреЗрдВ
- testFieldStraighforward - рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ
рдЗрд╕реА рддрд░рд╣ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдПред
рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдЯреЗрд╕реНрдЯ@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) {
рд╕реНрдереИрддрд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ @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) {
JDK7 рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо:

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

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


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ:
- рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдлрд▓ (рд╕рддреНрдп) рд╣рдореЗрдВ рдЕрдзрд┐рдХрд╛рд░ рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ
- рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ
- рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд░реНрд╢рди jdk8 рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ
рдЪрд▓реЛ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдзреНрдпрдпрди рдХреЗ рддрд╣рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЪрдпрди рд╣реИред
рдореЗрдердбрд╛рдВрдбрд▓ рдПрдкреАрдЖрдИ, рдЬреЗрдПрд╕рдЖрд░ 292 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛, рдЬреЗрдбреАрдХреЗ 7 рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рджреЛ рдкрд░реАрдХреНрд╖рдгред
- testFastMethod - CGLIB рд╕реЗ FastMethod рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдзрд┐ рдХреЙрд▓
- testMethodNotAccessible - рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рд░рд▓ рдХреЙрд▓
- testMethodAccessible - рдореЗрдердб рдСрди рд╕реЗрдЯреИрдЯрд┐рдмрд▓ (рдЯреНрд░реВ) рдЯреВ рдХреЙрд▓ рд╡рд┐рде рдореЗрдердб
- testMethodHandle - MethodHandle.invoke рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ
- testMethodHandleExact - MethodHandle.invokeExact рдХреЛ рд╕рдЯреАрдХ рдЯрд╛рдЗрдк рдорд┐рд▓рд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓
рдЗрд╕реА рддрд░рд╣ рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдПред
рддрд░реАрдХреЛрдВ рдХреЛ рдорд╛рдкрдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг @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) {
рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ @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) {
MethodHandle рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╕реБрдиреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдЗрд╡рд╛рдиреЛрд╡ рдХреА рдПрдХ
рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЗрдирд╡реЛрдХреЗрдВрдбрд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВJDK7 рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо:

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

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


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