интерпретация Java-нативной производительности связи - PullRequest
4 голосов
/ 14 февраля 2010

Прямо сейчас я использую JNA для нативного общения с Java и доволен его простотой. Однако мне нужно оптимизировать производительность, и я рассматриваю возможность использования других привязок.

У меня такой вопрос: какая часть Java-общения является «дорогой»? Это передача данных между ними?

Позвольте мне сказать по-другому. Прямо сейчас функции, которые вызывает мой интерфейс JNA, вообще не передают данные в Java, и функции даже не вызываются так часто. Другими словами, Java вызывает библиотечный вызов, а затем библиотечный вызов некоторое время делает свое дело и возвращает примитивный тип. Будет ли JNI / Swig / etc быстрее, чем JNA в такой ситуации?

1 Ответ

6 голосов
/ 14 февраля 2010

Учитывая ваш вариант использования, JNI не будет работать быстрее, чем JNA.

Что дорого в Java-нативном взаимодействии, так это передача большого объема памяти. В частности, сделать Java-память доступной для собственного кода может быть очень дорого; IIRC это отчасти потому, что Java может выбрать сегментирование памяти по своему усмотрению, но нативный код будет ожидать смежные куски памяти - перемещение / копирование памяти занимает некоторое время.

Если вы беспокоитесь о производительности, убедитесь, что в вашем коде JNA используется доступ в «прямом» стиле, а не в исходном доступе в стиле интерфейса.

Кроме того, если вам нужно передавать большие объемы памяти между Java и собственным кодом, вам следует рассмотреть возможность использования единственного начального прямого выделения (если возможно) и избегать перераспределения этой памяти на регулярной основе. Таким образом, вы оплачиваете стоимость распределения только один раз и в начале, поэтому при большом количестве вызовов эта стоимость становится незначительной.

...