Pregunta

En este momento estoy usando JNA para la comunicación de Java-natal y estoy satisfecho con su simplicidad. Sin embargo, yo necesito para optimizar el rendimiento y estoy considerando el uso de otros enlaces.

Mi pregunta es la siguiente: ¿qué parte de la comunicación de Java nativo es la "cara" parte? Es el paso de datos entre ellos?

Permítanme decirlo de otra manera. En este momento las funciones de la interfaz de mi JNA está llamando no deje pasar los datos a Java en absoluto, y las funciones ni siquiera se llaman a menudo. En otras palabras, Java llama a una función de biblioteca y luego la llamada a la librería hace su propia cosa por un tiempo y devuelve un tipo primitivo. Será JNI / trago / etc ser más rápido que JNA en ese tipo de situación?

¿Fue útil?

Solución

Dada su caso de uso de JNI no será más rápido que JNA.

Lo que es caro sobre la interacción Java nativo es la transferencia de grandes cantidades de memoria. En particular, puede ser muy costoso hacer memoria de Java a disposición del código nativo; IIRC esto es en parte debido a Java puede optar por segmento de la memoria sin embargo, le gusta, pero el código nativo esperará trozos contiguos de memoria -. El movimiento / copia de la memoria lleva algún tiempo

Si usted está preocupado por el rendimiento que debe asegurarse de que su código JNA utiliza el acceso "directo" de estilo en lugar del original estilo de la interfaz de acceso.

Además, si usted necesita transferir grandes cantidades de memoria entre Java y código nativo que debe considerar el uso de una única asignación directa inicial (si es posible) y evitar la reasignación de que la memoria en una base regular. De esta manera usted paga el costo de asignación de una sola vez, y al principio, por lo que durante un gran número de llamadas que el costo se vuelve insignificante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top