рдХреНрдпрд╛ рджреЗрд╢реА рддрд░реАрдХрд╛ рдорд╣рдВрдЧрд╛ рд╣реИ? рдЬреЗрдПрдирдЖрдИ рд╕реАрдХреНрд░реЗрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди



рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореВрд▓ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рдХреНрдпреЛрдВ рд▓реЗрддреЗ рд╣реИрдВ? рдХрднреА-рдХрднреА, рддреГрддреАрдп-рдкрдХреНрд╖ DLL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрдиреБрдХреВрд▓рд┐рдд C рдпрд╛ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рдХрд╛рд░рдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдореАрдбрд┐рдпрд╛ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдкреАрдбрд╝рди, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЖрджрд┐ рдХреЗ рд▓рд┐рдПред



рд▓реЗрдХрд┐рди рдореВрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдореБрдлреНрдд рдирд╣реАрдВ рд╣реИред рдХрдИ рдмрд╛рд░, JNI рдХрд╛ рдУрд╡рд░рд╣реЗрдб рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  1. рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо рдмрдирд╛рдирд╛;
  2. рдПрдмреАрдЖрдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рддрд░реНрдХ;
  3. jobject



    рд╣реИрдВрдбрд▓ ( jobject



    ) рдореЗрдВ рд░реИрдкрд┐рдВрдЧ рд▓рд┐рдВрдХ;
  4. JNIEnv*



    рдФрд░ jclass



    рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдкрд╛рд░рд┐рдд jclass



    ;
  5. рдореЙрдирд┐рдЯрд░ рдХреА рдХрдмреНрдЬрд╛ рдФрд░ рд░рд┐рд╣рд╛рдИ рдЕрдЧрд░ synchronized



    рд╡рд┐рдзрд┐;
  6. рджреЗрд╢реА рдХрд╛рд░реНрдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ "рдЖрд▓рд╕реА";
  7. рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рд╡реЗрд╢ рдФрд░ рдирд┐рдХрд╛рд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛;
  8. in_Java



    рд░рд╛рдЬреНрдп рд╕реЗ in_native



    рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдПрдХ рдзрд╛рд░рд╛ рдХрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг;
  9. рд╕рдлрд╝рд╛рдИ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ;
  10. рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ред


рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рджреЗрд╢реА рддрд░реАрдХреЗ рд╕рд░рд▓ рд╣реЛрддреЗ рд╣реИрдВ: рд╡реЗ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрддреЗ рд╣реИрдВ, рдвреЗрд░ рдореЗрдВ рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдЯреИрдХ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣реИрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВред рдХреНрдпрд╛ рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреНрд░рд┐рдпрд╛рдПрдВ рди рдХрд░реЗрдВ?



рд╣рд╛рдВ, рдФрд░ рдЖрдЬ рдореИрдВ рд╕рд░рд▓ JNI рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рддреЗрдЬреА рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЙрдЯрд╕реНрдкреЙрдЯ JVM рдХреА рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдЬрд╛рд╡рд╛ 7 рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ, рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ, рдХрд┐рд╕реА рдиреЗ рднреА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣реАрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИред



рдЬреЗрдПрдирдЖрдИ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЙрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ byte[]



рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ byte[]



рд╕рд░рдгреА рдФрд░ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдпреЛрдЧ рджреЗрддрд╛ рд╣реИред JNI рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:



рдЧрдВрднреАрд░ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА



рдФрд░ рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рдЧреБрдкреНрдд рдЙрдкрдХрд░рдг рд╣реИред рдмрд╛рд╣реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд JNI рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ JavaCritical_



рдмрдЬрд╛рдп JavaCritical_



рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рдеред рддрд░реНрдХреЛрдВ рдХреЗ рдмреАрдЪ, JNIEnv*



рдФрд░ jclass



, рдФрд░ jbyteArray



рдмрдЬрд╛рдп, рджреЛ рддрд░реНрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ: jint length



- рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдФрд░ jbyte* data



- рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдЪреНрдЪрд╛ рд╕реВрдЪрдХред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдиреЗрдЯрд┐рд╡ рд╡рд┐рдзрд┐ рдХреЛ рдорд╣рдВрдЧреЗ GetArrayLength



рдлрд╝рдВрдХреНрд╢рди GetArrayLength



рдФрд░ GetByteArrayElements



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



 JNIEXPORT jint JNICALL JavaCritical_bench_Natives_javaCriticalImpl(jint length, jbyte* buf) { return sum(buf, length); }
      
      





рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдиреЗрдЯрд┐рд╡ рдмрдирдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╕рдЦреНрдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:



JDK рдХреЗ рдореВрд▓ рдореЗрдВ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдХреЙрд▓ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдиреЗрдЯрд┐рд╡реНрд╕ рдХреЛ рдПрдХ рдирд┐рдЬреА рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рдереАред рд╡рд┐рд╡рд░рдг рд╕реЗ рдЬреЛ рдЕрдзрд┐рдХрддрдо рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдмрдЧрдЯреНрд░реИрдХрд░ рдореЗрдВ рдХрд╛рд░реНрдп рдкрд░ рдЯрд┐рдкреНрдкрдгреА рд╣реИ ред рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛: JavaCritical_



рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рд╣реЙрдЯ (рд╕рдВрдХрд▓рд┐рдд) рдХреЛрдб рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, JavaCritical_



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ "рдлреЙрд▓рдмреИрдХ" рдкрд╛рд░рдВрдкрд░рд┐рдХ JavaCritical_



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреНрдп JVM рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реИред



рдЧреНрд░рд╛рдо рдореЗрдВ рдХрд┐рддрдиреЗ рд╣реЛрдВрдЧреЗ?



рдЖрдЗрдП рдорд╛рдкреЗрдВ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ рдмрдЪрдд рдХреНрдпрд╛ рд╣реИ: 16, 256, 4KB, 64KB рдФрд░ 1MBред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЬреЗрдПрдордПрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ред

рдмреЗрдВрдЪрдорд╛рд░реНрдХ
 @State(Scope.Benchmark) public class Natives { @Param({"16", "256", "4096", "65536", "1048576"}) int length; byte[] array; @Setup public void setup() { array = new byte[length]; } @GenerateMicroBenchmark public int arrayRegion() { return arrayRegionImpl(array); } @GenerateMicroBenchmark public int arrayElements() { return arrayElementsImpl(array); } @GenerateMicroBenchmark public int arrayElementsCritical() { return arrayElementsCriticalImpl(array); } @GenerateMicroBenchmark public int javaCritical() { return javaCriticalImpl(array); } static native int arrayRegionImpl(byte[] array); static native int arrayElementsImpl(byte[] array); static native int arrayElementsCriticalImpl(byte[] array); static native int javaCriticalImpl(byte[] array); static { System.loadLibrary("natives"); } }
      
      



рдкрд░рд┐рдгрд╛рдо
 Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode) Benchmark (length) Mode Samples Mean Mean error Units b.Natives.arrayElements 16 thrpt 5 7001,853 66,532 ops/ms b.Natives.arrayElements 256 thrpt 5 4151,384 89,509 ops/ms b.Natives.arrayElements 4096 thrpt 5 571,006 5,534 ops/ms b.Natives.arrayElements 65536 thrpt 5 37,745 2,814 ops/ms b.Natives.arrayElements 1048576 thrpt 5 1,462 0,017 ops/ms b.Natives.arrayElementsCritical 16 thrpt 5 14467,389 70,073 ops/ms b.Natives.arrayElementsCritical 256 thrpt 5 6088,534 218,885 ops/ms b.Natives.arrayElementsCritical 4096 thrpt 5 677,528 12,340 ops/ms b.Natives.arrayElementsCritical 65536 thrpt 5 44,484 0,914 ops/ms b.Natives.arrayElementsCritical 1048576 thrpt 5 2,788 0,020 ops/ms b.Natives.arrayRegion 16 thrpt 5 19057,185 268,072 ops/ms b.Natives.arrayRegion 256 thrpt 5 6722,180 46,057 ops/ms b.Natives.arrayRegion 4096 thrpt 5 612,198 5,555 ops/ms b.Natives.arrayRegion 65536 thrpt 5 37,488 0,981 ops/ms b.Natives.arrayRegion 1048576 thrpt 5 2,054 0,071 ops/ms b.Natives.javaCritical 16 thrpt 5 60779,676 234,483 ops/ms b.Natives.javaCritical 256 thrpt 5 9531,828 67,106 ops/ms b.Natives.javaCritical 4096 thrpt 5 707,566 13,330 ops/ms b.Natives.javaCritical 65536 thrpt 5 44,653 0,927 ops/ms b.Natives.javaCritical 1048576 thrpt 5 2,793 0,047 ops/ms
      
      







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



рдирд┐рд╖реНрдХрд░реНрд╖



рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдиреЗрдЯрд┐рд╡реНрд╕ рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдЬреЗрдПрдирдЖрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ JDK 7 рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЬреЗрдПрдирдЖрдИ рдЬреИрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ, рдЖрдк рдореВрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдореВрд▓ рдХреЛрдб рдореЗрдВ рдЬрд╛рд╡рд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬреАрд╕реА рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдиреЗрдЯрд┐рд╡ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЬреАрд╕реА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рдкрд╛рдПрдЧрд╛ред



All Articles