2009-10-13 8 views
2

Notre programme principal est en Java, mais le code qui extrait les données de stockage est écrit en C. Je dois construire un fichier HDF5 à partir des données extraites. Serait-il préférable d'utiliser JNI pour appeler le code C pour obtenir les données, puis générer le fichier HDF5 à partir de Java ou pour construire le HDF5 à partir du code C?JNI Performance

J'ai peu d'expérience avec JNI ou C.

également l'un de nos principaux critères est la performance. Quel est le niveau de performance lors de l'utilisation de JNI?

Répondre

6

La limite d'appel de fonction est « lent », donc si vous faites beaucoup d'appels à votre routine native, la performance souffrira.

Un exemple du genre de chose que peut avantage de se déplacer à JNI (je souligne peut, parce que Java est plus assez rapide pour beaucoup de buts) serait une routine pour faire une sorte de traitement d'image sur un grand bitmap. Mais appeler une routine JNI pour chaque pixel serait beaucoup, beaucoup plus lent que de le faire dans une boucle en Java pur. L'extraction de données d'un format à l'autre est, franchement, le genre de chose la mieux faite dans un langage de "script" comme Python, et ne sera jamais lié par le CPU. Au contraire, la vitesse du disque va être bien plus lente que n'importe quel interpréteur de langage.

1

me semble que, puisque vous avez peu d'expérience avec C, votre meilleur choix est de le faire à partir withing Java .. JNI est vraiment pas si mal que ça.

0

Je ne connais pas du tout avec les interfaces HDF autres que celui C, donc je ne peux pas vraiment comparer pour vous.

Je tiens à souligner que c'est l'API que toutes les autres interfaces utilisent, donc si vous trouvez que vous avez besoin de tirer le maximum de performances, l'API C va être le meilleur.

Il y a aussi une question sur quelles parties de l'API sont disponibles pour vous. Par exemple, j'ai commencé à l'origine avec l'interface C++. Certaines API étaient toujours disponibles uniquement dans l'API C. Ce n'est pas un problème lorsque vous utilisez C & C++ mais cela peut poser un problème si une API dont vous avez besoin n'est pas disponible.

Cela dit, vous avez besoin d'avoir votre tête sur les épaules en termes de modèle d'objet de C: par exemple. utilisation de pointeurs, de poignées, etc.