JNI 和 Panama 哪个调用更快?传数组时怎么传?MethodHandle 放在哪里会影响多少?这篇用同一个 C 函数、同一个循环,把两条路径量出来(只是本机的一次观察,不是严格基准)。
第 1 次运行:
1 add(long, long) 每次调用(ns):Java 方法 0.38;JNI 3.74;Panama(局部变量里的 MethodHandle)6.69;Panama(static final MethodHandle)4.50;Panama static final + critical(false) 3.64
2 求和 int[16](ns/次):JNI GetIntArrayElements 56;JNI GetPrimitiveArrayCritical 38;JNI DirectByteBuffer 25;Panama(static final 句柄)堆外 MemorySegment 7;Panama critical(true) 直接传堆上的 int[] 5;纯 Java 循环 6
2 求和 int[1024](ns/次):JNI GetIntArrayElements 394;JNI GetPrimitiveArrayCritical 74;JNI DirectByteBuffer 50;Panama(static final 句柄)堆外 MemorySegment 35;Panama critical(true) 直接传堆上的 int[] 38;纯 Java 循环 105
2 求和 int[262144](ns/次):JNI GetIntArrayElements 87123;JNI GetPrimitiveArrayCritical 11523;JNI DirectByteBuffer 11399;Panama(static final 句柄)堆外 MemorySegment 11428;Panama critical(true) 直接传堆上的 int[] 11471;纯 Java 循环 37693
第 2 次运行:
1 add(long, long) 每次调用(ns):Java 方法 0.35;JNI 3.73;Panama(局部变量里的 MethodHandle)6.69;Panama(static final MethodHandle)4.51;Panama static final + critical(false) 3.59
2 求和 int[16](ns/次):JNI GetIntArrayElements 57;JNI GetPrimitiveArrayCritical 38;JNI DirectByteBuffer 25;Panama(static final 句柄)堆外 MemorySegment 7;Panama critical(true) 直接传堆上的 int[] 5;纯 Java 循环 6
2 求和 int[1024](ns/次):JNI GetIntArrayElements 398;JNI GetPrimitiveArrayCritical 75;JNI DirectByteBuffer 50;Panama(static final 句柄)堆外 MemorySegment 36;Panama critical(true) 直接传堆上的 int[] 39;纯 Java 循环 105
2 求和 int[262144](ns/次):JNI GetIntArrayElements 87442;JNI GetPrimitiveArrayCritical 11476;JNI DirectByteBuffer 11398;Panama(static final 句柄)堆外 MemorySegment 11372;Panama critical(true) 直接传堆上的 int[] 11419;纯 Java 循环 37436