Java MappedByteBuffer.get () sorprendentemente lento

Estoy tratando de entender si el rendimiento que estoy obteniendo del método get () de la clase MappedByteBuffer es normal o no. Mi código es el siguiente:

private byte[] testBuffer = new byte[4194304]; private File sdcardDir, filepath; private FileInputStream inputStream; private FileChannel fileChannel; private MappedByteBuffer mappedByteBuffer; // Obtain the root folder of the external storage sdcardDir = Environment.getExternalStorageDirectory(); // Create the reference to the file to be read filepath = new File(sdcardDir, "largetest.avi"); inputStream = new FileInputStream(filepath); fileChannel = inputStream.getChannel(); mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, (4194304)); Log.d("GFXUnpack", "Starting to read"); mappedByteBuffer.position(0); mappedByteBuffer.get(testBuffer, 0, (4194304)); Log.d("GFXUnpack", "Ended to read"); mappedByteBuffer.rewind(); 

Ya que soy un principiante, y necesitaba la forma más rápida de leer los datos de la tarjeta SD, busqué documentación y encontré que la asignación de archivos se considera, en muchos casos, el método más rápido para leer de un archivo. Pero si ejecuto el código anterior, aunque el búfer esté correctamente lleno, el rendimiento es tan lento (o tal vez no? ¡Decide!) Que puedo leer esos 4194304 bytes en casi 5 segundos , es decir, menos de 1 MB por segundo . Estoy utilizando Eclipse directamente conectado a mi teléfono inteligente Optimus Dual; Al mismo tiempo se requiere para la lectura, incluso si pongo la operación de lectura en un bucle (tal vez la inicialización de cabecera no tendría lugar si se realizan varias lecturas … No es el caso).

Esta relación tamaño-tiempo de archivo no cambia si reduzco o hago el archivo más grande: 8 megas se leerán en casi 9 segundos, 2 megas en 2 segundos, y así sucesivamente. He leído que incluso una lenta tarjeta SD se puede leer a una velocidad de al menos 5 MB por segundo … Tenga en cuenta que 4194304 es una potencia de 2 valor, ya que he leído que esto aumentaría el rendimiento. Por favor dígame su opinión: ¿es 1MB por segundo el funcionamiento real en un smartphone moderno, o hay algo mal con mi código? Gracias

No puedo ver nada malo con tu código. Es probablemente sólo la velocidad del dispositivo y / o la implementación del sistema de archivos. Como lo dice Tom Hawtin , "la E / S asignada no hará que sus discos funcionen más rápido".

No vale nada que en el Hotspot JVM, MappedByteBuffer.get () utiliza una llamada intrínseca en lugar de una nativa. Al copiar grandes secciones de bloques de datos, copia varios bytes a la vez, por ejemplo, 8 bytes o más con las instrucciones de MMX.

AFAIK, Android no hace esto, lo que hace que esta llamada sea mucho más cara.

  • Androide. ¿Cómo mejorar el rendimiento de Eclipse para proyectos con muchos recursos?
  • CREOOrUpdate de ORMLite parece lento - ¿cuál es la velocidad normal?
  • Método de reflexión de Android M freeStorageAndNotify excepción
  • Eliminar Overdraw de CardView
  • Los valores de caché de SharedPreferences tienen sentido?
  • La almohadilla de firma es lenta en android
  • Vista web de Android lenta
  • Son los registros de depuración de Android realmente despojado en tiempo de ejecución?
  • Throwable: No se pudo crear la tarjeta SD
  • Android Studio es increíblemente lento y laggy
  • Múltiples declaraciones if
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.