Je sais que «franchir les frontières» lors d’un appel JNI en Java est lent.
Cependant, je veux savoir ce qui le ralentit? Que fait l’implémentation JVM sous-jacente lors d’un appel JNI qui le rend si lent?
Tout d’abord, il convient de noter que “slow” parle de quelque chose qui peut prendre des dizaines de nanosecondes. Pour les méthodes natives sortingviales, en 2010, j’ai mesuré les appels en moyenne 40 ns sur mon bureau Windows et 11 ns sur mon bureau Mac. À moins que vous ne fassiez beaucoup d’ appels, vous ne remarquerez pas.
Cela dit, appeler une méthode native peut être plus lent que de faire un appel de méthode Java normal. Les causes comprennent:
Des discussions supplémentaires, éventuellement datées, peuvent être trouvées dans “Performance de la plate-forme Java: stratégies et tactiques”, 2000, par Steve Wilson et Jeff Kesselman, dans la section “9.2: Examen des coûts JNI”. C’est à peu près le tiers de cette page , fourni dans le commentaire de @Philip ci-dessous.
Le document IBM developerWorks 2009 intitulé «Meilleures pratiques d’utilisation de l’interface Java native» fournit des suggestions pour éviter les problèmes de performances avec JNI.
Fondamentalement, la JVM construit de manière interprétative les parameters C pour chaque appel JNI et le code n’est pas optimisé.
Il y a beaucoup plus de détails décrits dans cet article
Si vous êtes intéressé par l’parsing comparative entre le code JNI et le code natif, ce projet a du code pour exécuter des tests de performances.
Il convient de mentionner que toutes les méthodes Java marquées avec native
sont pas “lentes”. Certains d’entre eux sont insortingnsèques, ce qui les rend extrêmement rapides. Pour vérifier ceux qui sont insortingnsèques et ceux qui ne le sont pas, vous pouvez rechercher do_insortingnsic
dans vmSymbols.hpp .