2010-02-14 3 views
4

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

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

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

ответ

6

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

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

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

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

Смежные вопросы