FFM은 JNI를 대체하려는 새로운 API이며 jep이 여기에 있습니다. 기본적으로 JVM 외부에서 함수를 호출하거나 JVM에서 관리하지 않는 메모리에 액세스합니다. 저는 FFM이 일반 Java API를 이길 수 있는지 테스트하고 싶었습니다. 아래에서 FFM 및 일반 Math.sin을 사용하여 수학 죄를 수행하는 간단한 테스트를 찾을 수 있습니다
import java.lang.foreign.FunctionDescriptor; import java.lang.foreign.Linker; import java.lang.foreign.MemorySegment; import java.lang.foreign.SymbolLookup; import java.lang.foreign.ValueLayout; public class FFMSinTest { public static void main(String[] args) throws Throwable { Linker linker = Linker.nativeLinker(); SymbolLookup stdlib = linker.defaultLookup(); // Locate the "sin" function in the C math library MemorySegment sinAddress = stdlib.find("sin").orElseThrow(); FunctionDescriptor descriptor = FunctionDescriptor.of(ValueLayout.JAVA_DOUBLE, ValueLayout.JAVA_DOUBLE); var sinHandle = linker.downcallHandle(sinAddress, descriptor); double angle = Math.PI / 4; // 45 degrees in radians // Timing Java's Math.sin() long javaStartTime = System.nanoTime(); for (int i = 0; i < 1_000_000; i++) { double result = Math.sin(angle); } long javaEndTime = System.nanoTime(); long javaDuration = javaEndTime - javaStartTime; // Timing C sin via FFM long ffmStartTime = System.nanoTime(); for (int i = 0; i < 1_000_000; i++) { double result = (double) sinHandle.invoke(angle); } long ffmEndTime = System.nanoTime(); long ffmDuration = ffmEndTime - ffmStartTime; System.out.println("Java Math.sin() took: " + javaDuration / 1_000_000.0 + " ms"); System.out.println("C sin (FFM) took: " + ffmDuration / 1_000_000.0 + " ms"); } }
결과는
Java Math.sin() took: 4.8677 ms C sin (FFM) took: 78.9172 ms
내 노트북에서는 "JVM 외부에서 호출하는 것은 비용이 많이 드는 프로세스가 아니다"라는 교훈을 얻습니다.
위 내용은 FFM(외부 함수 및 메모리) Stdlib 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!