¿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() .

  • Cómo obtener el tiempo de computación en NDK
  • GetItem vs. getItemAtPosition
  • Alto uso de la CPU con el emulador de Android (qemu-system-i386.exe)
  • Android - Declarativa vs interfaz de usuario programática
  • Google Maps v2 Projection.toScreenLocation (...) muy lento
  • Por qué getSpeed ​​() siempre devuelve 0 en android
  • Una forma más eficiente de actualizar la interfaz de usuario del servicio que las intenciones?
  • Cómo trabajar alrededor de la demora / lento WebView representación que se produce en algunos dispositivos?
  • Mejorar el rendimiento de webView (debe tener el mismo rendimiento que el navegador web nativo)
  • Coracteres corrompidos o desaparecidos después de ejecutar Proguard
  • Android HTTP Publicar en una URL sin parámetros
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.