198 votes

Ce qui rend les appels JNI lent ?

Je sais que « franchissement de frontières » lorsque faisant un appel JNI dans Java est plus lent.

Cependant je veux savoir ce qu’est-ce qui le rend lent ? Que fait-il l’implémentation sous-jacente de la jvm pour passer un appel JNI qui le rend si lent ?

182voto

Andy Thomas Points 30979

Tout d'abord, il est intéressant de noter que par "ralentir" nous parlons de quelque chose qui peut prendre plusieurs dizaines de nanosecondes. Pour trivial des méthodes indigènes, en 2010, j'ai mesuré les appels à une moyenne de 40 ns sur mon bureau Windows, et 11 ns sur mon Mac de bureau. Sauf si vous faites beaucoup d' appels, vous n'allez pas à l'avis.

Cela dit, l'appel d'une méthode native peut être plus lent que d'en faire une Java normal de l'appel de méthode. Les Causes sont:

  • Des méthodes indigènes ne seront pas intégrées par la JVM. Ils ne seront juste-à-temps compilé pour cette machine, ils sont déjà compilées.
  • Java tableau peut être copié pour l'accès en code natif, et plus tard copiés. Le coût peut être linéaire en la taille de la matrice. J'ai mesuré la JNI de la copie d'un tableau de 100 000 en moyenne à environ 75 microsecondes sur mon bureau Windows, et 82 microsecondes sur Mac. Heureusement, un accès direct peuvent être obtenues via GetPrimitiveArrayCritical ou NewDirectByteBuffer.
  • Si la méthode est passé d'un objet, ou a besoin de faire un rappel, puis la méthode native est susceptible de rendre ses propres appels à la JVM. L'accès Java champs, des méthodes et des types de code natif exige quelque chose de similaire à la réflexion. Les Signatures sont spécifiés dans les cordes et interrogée à partir de la JVM. C'est à la fois lente et sujette à erreur.
  • Java, les Chaînes de caractères sont des objets, ont une longueur et sont codés. L'accès ou la création d'une chaîne de caractères peut exiger un O(n) copie.

Quelques autres discussions, peut-être datée, peut être trouvé dans "Java¿ Performances de la Plateforme: Stratégies et Tactiques", 2000, par Steve Wilson et Jeff Kesselman, dans la section "9.2: l'Examen JNI coûts". C'est environ un tiers du chemin vers le bas de cette page, à condition que dans le commentaire de @Philip ci-dessous.

L'2009 IBM developerWorks livre "les Meilleures pratiques pour l'utilisation de Java Native Interface" fournit quelques suggestions sur la façon d'éviter de performance pièges avec JNI.

25voto

Tema Points 1154

Il est à noter que pas toutes les méthodes Java marqués de sont « lents ». Certains d'entre eux sont des [éléments intrinsèques](http://en.wikipedia.org/wiki/Intrinsic_function) qui les rend extrêmement rapide. Pour vérifier quels sont ceux qui est intrinsèques et ceux qui ne sont pas, vous pouvez examiner à vmSymbols.hpp.

23voto

dmck Points 3790

Fondamentalement, la JVM construit pour les paramètres C pour chaque appel JNI et le code n’est pas optimisé.

Il y a beaucoup plus de détails dans ce document

Si vous êtes intéressés par l’analyse comparative JNI vs code natif, ce projet a le code pour l’exécution des points de repère.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X