Je sais que "franchir les limites" lors d’un appel JNI Java est lent.
Cependant, je veux savoir quoi est-ce qui le ralentit? Que fait l'implémentation JVM sous-jacente lors d'un appel JNI qui le ralentit?
Premièrement, il convient de noter que par "lent", nous parlons de quelque chose qui peut prendre des dizaines de nanosecondes. Pour les méthodes natives triviales, j'ai mesuré en 2010 les appels à une moyenne de 40 ns sur mon bureau Windows et de 11 ns sur mon bureau Mac. Sauf si vous passez de nombreux appels , vous ne le remarquerez pas.
Cela dit, appeler une méthode native peut être plus lent que de faire un appel de méthode normal Java. Les causes incluent:
Des informations supplémentaires, éventuellement datées, sont disponibles dans "Performances de la plate-forme Java: stratégies et tactiques", 2000, de Steve Wilson et Jeff Kesselman, dans la section "9.2: Examen des coûts JNI". C'est à peu près au tiers de la descente cette page , fournie dans le commentaire de @Philip ci-dessous.
Le document IBM developerWorks 2009 "Meilleures pratiques pour l’utilisation de Java Native Interface" fournit des suggestions sur la manière d’éviter les pièges en matière de performances avec JNI.
Il est à noter que toutes les Java marquées native
ne sont pas "lentes". Certaines d'entre elles sont intrinsèques , ce qui les rend extrêmement rapides. vérifiez lesquels sont intrinsèques et lesquels ne le sont pas, vous pouvez rechercher do_intrinsic
à vmSymbols.hpp .
Fondamentalement, la machine virtuelle Java construit interprétativement les paramètres C pour chaque appel JNI et le code n'est pas optimisé.
Il y a beaucoup plus de détails décrits dans ce document
Si vous êtes intéressé par l'analyse comparative de JNI par rapport au code natif ce projet a du code pour l'exécution de tests de performance.