Я знаю, что «пересечение границ» при вызове JNI в Java происходит медленно.
Однако я хочу знать, что делает его медленным? Что делает базовая реализация jvm при выполнении вызова JNI, который делает его таким медленным?
Я знаю, что «пересечение границ» при вызове JNI в Java происходит медленно.
Однако я хочу знать, что делает его медленным? Что делает базовая реализация jvm при выполнении вызова JNI, который делает его таким медленным?
Ответы:
Во-первых, стоит отметить, что под «медленным» мы говорим о чем-то, что может занять десятки наносекунд. Что касается простых нативных методов, в 2010 году я измерял вызовы в среднем на 40 нс на моем рабочем столе Windows и 11 нс на моем рабочем столе Mac. Если вы не делаете много звонков, вы не будете замечать.
Тем не менее, вызов нативного метода может быть медленнее, чем обычный вызов метода Java. Причины включают в себя:
Некоторое дополнительное обсуждение, возможно, датированное, может быть найдено в «Производительности платформы Java: стратегии и тактики», 2000, Стивом Уилсоном и Джеффом Кессельманом, в разделе «9.2: Изучение затрат JNI». Это примерно треть пути вниз по этой странице , предоставленная в комментарии @Philip ниже.
В документе IBM developerWorks 2009 года "Лучшие практики использования собственного интерфейса Java" содержатся некоторые предложения по предотвращению ошибок производительности при использовании JNI.
sun.misc.Unsafe
и многие другие вещи System.currentTimeMillis/nanoTime
обрабатываются JVM с помощью «магии». Они не являются JNI, и у них вообще нет надлежащих файлов .c / .h, за исключением самого JVM. Подход не может быть использован, если вы не пишете / не взламываете JVM.
Стоит отметить, что не все методы Java, помеченные native
как «медленные». Некоторые из них являются внутренними, что делает их чрезвычайно быстрыми. Чтобы проверить, какие из них являются внутренними, а какие нет, вы можете посмотреть do_intrinsic
на vmSymbols.hpp .
По сути, JVM интерпретирует параметры C для каждого вызова JNI, и код не оптимизируется.
Есть много других деталей, изложенных в этой статье
Если вы заинтересованы в бенчмаркинге JNI по сравнению с собственным кодом, у этого проекта есть код для запуска бенчмарков.