¿Android NDK da aceleración para enviar int sobre sockets?

Necesito enviar una matriz de 500.000 entradas en un socket entre dos dispositivos Android. Actualmente, estoy pasando mucho tiempo convirtiendo el int [] en un byte [] para que el zócalo de Java lo acepte (vea mi pregunta anterior Eficientemente envía int [] sobre sockets en Java , donde determinamos que no hay manera más rápida Para hacer el typecasting en Java).

Mi pregunta ahora es, si tomo el int [] y lo pasamos a través de JNI al Android NDK, ¿puedo esperar que el typecasting a byte [] vaya más rápido en código nativo? Sé typecasting int * to char * es bastante simple en C llano-viejo, sin embargo me estoy preguntando si el JNI anulará cualquier aumento de rendimiento.

Además, una vez que tengo un byte [] en mi código nativo, ¿puedo pasarlo eficientemente de nuevo a mi código Java o necesito implementar el socket en C también?

Editar 1: Las personas han estado publicando muchas respuestas sin hacer clic en el enlace. Usar ByteBuffers no es una buena opción , su manera realmente más lenta que mask-and-shift, que es todavía manera más lenta que mi código crítico del funcionamiento necesita! Es por eso que estoy preguntando por el NDK.

Editar 2: Cambié el texto anterior para decir que el código C puede emitir desde int * a char * en lugar de int [] a byte []. Esperemos que aclare la pregunta.

Editar 3: Para aclarar mi caso de uso, este es un problema de investigación en el que distribuyo una gran variedad de ints a través de múltiples dispositivos y ordenar la lista en paralelo. Supongamos que tengo 500.000 ints en Java (no importa de dónde vienen) y necesito sacarlos del dispositivo a través de un socket lo más rápido posible. Las respuestas que dicen "no empiecen con una matriz de ints" no son útiles. Además, mi código de aplicación debe estar lo más cerca posible del 100% de Java. Si typecasting nativo y sockets mejorar el rendimiento, que está bien, pero no puedo hacer nada más (es decir, el tipo) de forma nativa.

3 Solutions collect form web for “¿Android NDK da aceleración para enviar int sobre sockets?”

Utilice un SocketChannel y puede utilizar ByteBuffer s en su lugar.

 buffer.asIntBuffer().put(ints); do { channel.write(buffer); } while (buffer.hasRemaining()); 

No, el uso de JNI / NDK no le dará un impulso de rendimiento. Primero de todo cuando intenta obtener la matriz sobre el código nativo tendrá que copiarlo o utilizar un ByteBuffer asignado directamente . Resulta que la implementación de Dalvik VM siempre devuelve el puntero directo de Get * ArrayElements (). Dudo que usted obtendrá un golpe de rendimiento porque las llamadas a través de JNI tienen gastos generales. Finalmente, C ++ y Java tienen un rendimiento muy cercano en este escenario (vea el rendimiento de C ++ frente a Java / C # ).

Echa un vistazo a esta pregunta y la primera respuesta para una manera rápida de convertir el int [] a un byte [] de Java Cómo convertir int [] a byte []

¿Hay alguna razón por la que utilice un int [] en lugar de byte [] para empezar? Si se trata de una imagen, podríamos recomendar formas de evitar la conversión.

Si el código Java necesita un acceso eficiente a int[] , entonces existe una buena probabilidad de que el envío / recepción nativo con sockets valga la pena.

Pero a menudo es bueno usar IntBuffer en lugar de int []. En este caso, puede asignar un ByteBuffer y obtener un IntBuffer de él:

 ByteBuffer bb = ByteBuffer.allocate(500000*4); IntBuffer ib = bb.asIntBuffer(); 

Debe experimentar con allocate () y allocateDirect (), consulte " ByteBuffer.allocate () vs. ByteBuffer.allocateDirect () " y http://objectissues.blogspot.co.il/2005/10/java-nio-allocate -vs-assignedirect.html .

¡Importante! En este caso, obtendrá UnsupportedOperationException si intenta utilizar ib.array() .

  • (Dis-) Ventajas de tener varios módulos en un proyecto de Android Studio?
  • Android webview rendimiento, ¿qué me falta?
  • Android triple buffering - comportamiento esperado?
  • Android: ¿Cuánto sobrecarga se genera ejecutando un método vacío?
  • ¿Por qué la adición de una instrucción If dentro de este método lo ralentiza tan drásticamente?
  • Rendimiento en Android Juego
  • GetItem vs. getItemAtPosition
  • Cómo limitar la velocidad de la red del dispositivo Android para propósitos de prueba
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.