JNI Performance - PullRequest
       24

JNI Performance

2 голосов
/ 13 октября 2009

Наша основная программа на Java, но код, который извлекает наши данные из хранилища, написан на C. Мне нужно создать файл HDF5 из извлеченных данных. Было бы лучше использовать JNI для вызова кода C, чтобы получить данные, а затем собрать файл HDF5 из Java или построить HDF5 из кода C?

У меня мало опыта с JNI или C.

Также одним из наших основных критериев является производительность. Насколько сильно снижается производительность при использовании JNI?

Ответы [ 3 ]

6 голосов
/ 13 октября 2009

Граница вызова функции "медленная", поэтому, если вы делаете много вызовов своей собственной подпрограмме, производительность будет снижаться.

Примером того, что может выиграть от перехода на JNI (я подчеркиваю , может , потому что Java более чем достаточно быстр для многих целей), будет процедура для сделать какую-то обработку изображения на большом растровом изображении. Но вызывать подпрограмму JNI для каждого пикселя было бы намного, намного медленнее, чем делать это в цикле в чистой Java.

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

1 голос
/ 13 октября 2009

Считаю, что, поскольку у вас мало опыта работы с C, ваш лучший выбор - сделать это с помощью Java. JNI на самом деле не так уж и плох.

0 голосов
/ 20 октября 2009

Я совсем не знаком с интерфейсами HDF, кроме C, поэтому я не могу сравнивать их для вас.

Я хотел бы отметить, что это API, который используют все остальные интерфейсы, поэтому, если вы обнаружите, что вам нужно добиться максимальной производительности, тогда C API будет лучшим.

Существует также вопрос о том, какие части API доступны для вас. Например, я изначально начал с интерфейса C ++. Некоторые API все еще были доступны только в C API. Это не проблема, когда вы используете C & C ++, но она может быть проблемой, если необходимый вам API не доступен для вас.

Сказав это, вам нужно завинтить голову в терминах объектной модели C: например. использование указателей, ручек и т. д.

...