Eu sei que 'ultrapassar fronteiras' ao fazer uma chamada JNI em Java é lento.
No entanto, eu quero saber o que é que torna mais lento? O que a implementação subjacente da jvm faz ao fazer uma chamada JNI que a torna tão lenta?
Eu sei que 'ultrapassar fronteiras' ao fazer uma chamada JNI em Java é lento.
No entanto, eu quero saber o que é que torna mais lento? O que a implementação subjacente da jvm faz ao fazer uma chamada JNI que a torna tão lenta?
Respostas:
Primeiro, vale a pena notar que, "devagar", estamos falando de algo que pode levar dezenas de nanossegundos. Para métodos nativos triviais, em 2010 medi as chamadas em uma média de 40 ns na área de trabalho do Windows e 11 ns na área de trabalho do Mac. A menos que você esteja fazendo muitas ligações, você não notará.
Dito isto, chamar um método nativo pode ser mais lento do que fazer uma chamada de método Java normal. As causas incluem:
Alguma discussão adicional, possivelmente datada, pode ser encontrada em "Desempenho da plataforma Java¿: estratégias e táticas", 2000, por Steve Wilson e Jeff Kesselman, na seção "9.2: Examinando custos JNI". É cerca de um terço do caminho nesta página , fornecido no comentário por @Philip abaixo.
O documento IBM developerWorks de 2009 "Práticas recomendadas para usar a Java Native Interface" fornece algumas sugestões sobre como evitar armadilhas de desempenho com a JNI.
sun.misc.Unsafe
e muitas outras coisas System.currentTimeMillis/nanoTime
são tratadas via 'magic' pela JVM. Eles não são JNI e não possuem arquivos .c / .h adequados, exceto o implemento da JVM. A abordagem não pode ser seguida, a menos que você esteja gravando / hackeando a JVM.
Vale ressaltar que nem todos os métodos Java marcados com native
são "lentos". Alguns deles são intrínsecos, o que os torna extremamente rápidos. Para verificar quais são intrínsecos e quais não, você pode procurar do_intrinsic
em vmSymbols.hpp .
Basicamente, a JVM interpreta interpretativamente os parâmetros C para cada chamada JNI e o código não é otimizado.
Existem muitos outros detalhes descritos neste documento
Se você estiver interessado em comparar JNI versus código nativo, este projeto possui código para executar benchmarks.