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