Wiem, że „przekraczanie granic” podczas wykonywania wywołania JNI w Javie jest powolne.
Jednak chcę wiedzieć, co powoduje, że jest wolny? Co robi podstawowa implementacja jvm podczas wykonywania wywołania JNI, które powoduje, że jest tak wolny?
Wiem, że „przekraczanie granic” podczas wykonywania wywołania JNI w Javie jest powolne.
Jednak chcę wiedzieć, co powoduje, że jest wolny? Co robi podstawowa implementacja jvm podczas wykonywania wywołania JNI, które powoduje, że jest tak wolny?
Odpowiedzi:
Po pierwsze, warto zauważyć, że przez „powolne” mówimy o czymś, co może zająć dziesiątki nanosekund. W przypadku trywialnych metod natywnych w 2010 r. Mierzyłem połączenia średnio 40 ns na pulpicie Windows i 11 ns na pulpicie Mac. Chyba że wykonujesz wiele połączeń, nie zauważysz.
To powiedziawszy, wywołanie metody rodzimej może być wolniejsze niż normalne wywołanie metody Java. Przyczyny obejmują:
Niektóre dodatkowe dyskusje, być może datowane, można znaleźć w „Wydajność platformy Java”: strategie i taktyki ”, 2000, Steve Wilson i Jeff Kesselman, w sekcji„ 9.2: Badanie kosztów JNI ”. To około jedna trzecia drogi w dół tej strony , podana w komentarzu @Philip poniżej.
W artykule dla deweloperów IBM z 2009 r. „Najlepsze praktyki korzystania z macierzystego interfejsu Java” podano sugestie dotyczące unikania pułapek wydajności w JNI.
sun.misc.Unsafei całkiem sporo innych rzeczy takich jak System.currentTimeMillis/nanoTimeJVM obsługuje za pomocą „magii”. Nie są one JNI i nie mają w ogóle odpowiednich plików .c / .h, co wyklucza samą implementację JVM. Nie można zastosować tego podejścia, chyba że piszesz / hakujesz JVM.
Warto wspomnieć, że nie wszystkie metody Java oznaczone znakiem nativesą „wolne”. Niektóre z nich są nieodłączne, co czyni je niezwykle szybkimi. Aby sprawdzić, które są właściwe, a które nie, możesz poszukać do_intrinsicna vmSymbols.hpp .
Zasadniczo JVM konstruuje interpretacyjnie parametry C dla każdego wywołania JNI, a kod nie jest zoptymalizowany.
W tym dokumencie jest wiele innych szczegółów
Jeśli jesteś zainteresowany porównaniem JNI do kodu natywnego, ten projekt ma kod do uruchamiania testów porównawczych.