>Java >java지도 시간 >FFM(외부 함수 및 메모리) Stdlib 예

FFM(외부 함수 및 메모리) Stdlib 예

Susan Sarandon
Susan Sarandon원래의
2024-11-14 13:36:021099검색

FFM (Foreign Function and Memory) Stdlib Example

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.