Я знаю, что "пересечение границ" при вызове 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.
Следует отметить, что не все Java-методы, отмеченные native
, являются "медленными". Некоторые из них intrinsics, что делает их чрезвычайно быстрыми. Чтобы проверить, какие из них являются внутренними, а какие нет, вы можете искать do_intrinsic
в vmSymbols.hpp.
В принципе, JVM интерпретирует C-параметры для каждого вызова JNI, и код не оптимизирован.
В содержится более подробная информация
Если вы заинтересованы в бенчмаркинге JNI по сравнению с собственным кодом этот проект имеет код для запуска тестов.