Question

En ce moment je suis en utilisant la JNA pour la communication Java native et je suis heureux avec sa simplicité. Cependant, je ne dois d'optimiser les performances et je envisage d'utiliser d'autres liaisons.

Ma question est la suivante: quelle partie de la communication Java native est la partie « coûteux »? Est-ce le passage des données entre eux?

Permettez-moi d'une autre façon. En ce moment les fonctions de mon interface JNA appelle ne passent pas de données à Java du tout, et les fonctions ne sont même pas appelé souvent. En d'autres termes, Java appelle un appel de la bibliothèque et l'appel bibliothèque fait sa propre chose pendant un certain temps et retourne un type primitif. Est-ce JNI / Swig / etc être plus vite que la JNA dans ce genre de situation?

Était-ce utile?

La solution

Compte tenu de votre cas d'utilisation JNI ne sera pas plus vite que la JNA.

Ce qui est cher à propos de l'interaction Java natif est le transfert de grandes quantités de mémoire. En particulier, il peut être très coûteux de faire mémoire Java à la disposition du code natif; IIRC cela est en partie parce que Java peut choisir de segmenter la mémoire mais il aime, mais le code natif attendre des morceaux de mémoire contigus -. Le mouvement / copie de la mémoire prend un certain temps

Si vous êtes préoccupé par la performance que vous devez vous assurer que votre code utilise JNA l'accès style « direct » plutôt que l'accès original de style d'interface.

En outre, si vous avez besoin de transférer de grandes quantités de mémoire entre Java et du code natif, vous devriez envisager d'utiliser une seule allocation initiale directe (si possible) et d'éviter réaffectant que la mémoire sur une base régulière. De cette façon, vous ne payez qu'une fois le coût d'allocation, et au début, donc sur un grand nombre d'appels que le coût devient négligeable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top