2009-04-08 2 views
9

Какой самый быстрый способ вызова родной библиотеки из Java?Каков самый быстрый способ доступа к собственному коду с Java?

Те, которые я знаю, о которых

  • NativeCall - то, что мы в настоящее время используют
  • JNA - не использовали его, но выглядит разумным
  • JNI - выглядит ужасающим писать, но мы сделаем это, если получим скорость

ответ

12

Swig делает JNI проще.

С точки зрения скорости, я подозреваю, что будут тонкие вариации - я настоятельно рекомендую вам выбрать звонок, который, как вы знаете, вы будете делать много, и сравните все предлагаемые решения.

+6

Downvoters: пожалуйста, объясните, или downvote бессмысленно ... –

10

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

Я не уверен, где NativeCall подходит к спектру.

2

This blog entry утверждает, что из-за механизмов самоанализа, используемых JNA, он будет значительно медленнее, чем JNI. Я подозреваю, что NativeCall будет использовать аналогичные механизмы и, таким образом, будет работать аналогичным образом.

Однако вы должны, вероятно, тест основан на конкретных объектах вы ссылающийся и/или сортировочных между Java и C.

Я второй рекомендации SWIG. Это делает жизнь особенно легкой (проще) для интерфейса Java/C.

+0

JNI не сортирует. Я не думаю, что JNA тоже. Нативный и Java-код работают с одними и теми же данными в памяти. – erickson

+0

Вы должны пройти некоторую форму передачи объекта - даже если это только ссылка указателя. –

+0

Правильно, я просто не хотел, чтобы людей путали, что происходит какая-то сериализация; это просто указатели. Первичные накладные расходы находятся в интроспекции. – erickson

3

Достаточно несколько параметров влияют на характеристики интерфейсов между программирующими языками: на каком устройстве работает JVM, кто его разработал (в случае, если это не обычный Sun JVM), нужно ли вам перевести код Java из собственного кода , модель поточной передачи JVM на вашей операционной системе и то, как асинхронный будет иметь собственный код ...

Возможно, вы не можете найти надежный бенчмарк, который точно измеряет то, что вам нужно.