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?
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?
Réponses:
Tout d'abord, 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, en 2010, j'ai mesuré les appels à une moyenne de 40 ns sur mon bureau Windows et 11 ns sur mon bureau Mac. À moins de passer de nombreux appels, vous ne le remarquerez pas.
Cela dit, appeler une méthode native peut être plus lent que faire un appel de méthode Java normal. Les causes incluent:
Une discussion supplémentaire, peut-être datée, peut être trouvée dans "Java¿ Platform Performance: Strategies and Tactics", 2000, par Steve Wilson et Jeff Kesselman, dans la section "9.2: Examiner les coûts JNI". C'est environ un tiers de la descente de cette page , fourni dans le commentaire de @Philip ci-dessous.
Le document IBM developerWorks 2009 "Meilleures pratiques pour l'utilisation de l'interface native Java" fournit quelques suggestions pour éviter les pièges de performances avec JNI.
sun.misc.Unsafe
et beaucoup d'autres choses comme System.currentTimeMillis/nanoTime
sont gérées via «magie» par la JVM. Ce ne sont pas des JNI et ils n'ont pas du tout de fichiers .c / .h corrects, à l'exception de l'implément JVM lui-même. L'approche ne peut être suivie que si vous écrivez / piratez la JVM.
Il est à noter que toutes les méthodes Java marquées d'un ne native
sont pas "lentes". Certains d'entre eux sont intrinsèques qui les rendent extrêmement rapides. Pour vérifier lesquels sont intrinsèques et lesquels ne le sont pas, vous pouvez rechercher do_intrinsic
sur vmSymbols.hpp .
Fondamentalement, la JVM construit de manière interprétative 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 cet article
Si vous êtes intéressé par l'analyse comparative JNI par rapport au code natif, ce projet a du code pour exécuter des tests de performance.