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).
- Falta el puerto reenviado en el Visor de jerarquía: Uso de Android Studio
- Android: Mejora de la frecuencia de muestreo del sensor mediante el uso de NDK y de sondeo
- Cómo detectar la velocidad de la CPU android?
- FrameLayout + bg-image vs. ImageView
- Mi aplicación se desplaza muy mal después de importar la fuente roboto en la carpeta assets / fonts
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
- Android Map Rendimiento pobre debido a muchas superposiciones?
- La mejor manera de poblar las vistas
- ¿Por qué la aplicación diseñada por el material es más lenta que la aplicación diseñada por holo?
- ¿Por qué son las anotaciones bajo Android un problema de rendimiento (lento)?
- Acelerar gradle build en la aplicación multidex
- Android: FPS bajo que dibuja muchos mapas de bits en una vista de superficie
- ¿Cómo puede el código nativo de Android dirigirse a múltiples tipos de procesadores?
- ¿Cómo actualizar Android ListView con datos dinámicos en tiempo real?
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.
- Haga que los envases de RadioButtons horizontales sean demasiado largos para la pantalla.
- Agregar un botón de conversión a ActionBar utilizando la biblioteca CastCompanionLibrary