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.Unsafe
i całkiem sporo innych rzeczy takich jak System.currentTimeMillis/nanoTime
JVM 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 native
są „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_intrinsic
na 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.