1 votos

¿Qué puede causar que "listar un directorio" en Android sea 50-250 veces más lento de lo esperado?

Terminé con mi dispositivo Android (Google Pixel 7a, en AOSP 15) habiendo acumulado alrededor de ~14k archivos de videos/fotos en /sdcard/DCIM/Camera. Como consecuencia, he notado cierto retraso muy incongruente al listar este directorio en esta carpeta en particular, pero también en general.

Ejecuté las siguientes pruebas

[user@archlinux-box ~] $ ## teniendo el Pixle 7a conectado a través de un puerto USB-3 con depuración USB
[user@archlinux-box ~] $ adb shell
lynx:/ $ ## cronometrar la lista de /sdcard/DCIM/Camera
lynx:/ $ (cd /sdcard/DCIM/Camera; time ls | wc)
  13980   13980  398700
    0m04.55s real     0m00.07s usuario     0m00.31s sistema
lynx:/ $ ## excluyo que sea un fallo del binario `ls` revisando también con `find`
lynx:/ $ (cd /sdcard/DCIM/Camera; time find | wc)
  13981   13981  426662
    0m05.25s real     0m00.07s usuario     0m00.41s sistema

Sospechando que listar ~14k archivos puede tomar algo de tiempo, pero no ~5 segundos (y menos en la segunda lectura de directorio, dado que asumiría que algo de caché ocurriría) probé si esto está relacionado con la carpeta específica /sdcard/DCIM/Camera haciendo esto

lynx:/ $ ## crear e ingresar a un directorio de prueba para contener 14k archivos
lynx:/ $ mkdir /sdcard/14k-files-dir
lynx:/ $ cd  /sdcard/14k-files-dir
lynx:/sdcard/14k-files-dir $ ## crear 14k archivos de manera eficiente
lynx:/sdcard/14k-files-dir $ ## tener nombres de archivo de longitud comparable a los archivos de fotos
lynx:/sdcard/14k-files-dir $ PREFIJO='nombre-de-archivo-similar-a-archivo-de-fotos-no-'
lynx:/sdcard/14k-files-dir $ seq 1 14000 | sed 's/^/'"$PREFIJO"'/' | xargs sh -c 'touch "$@"' _
lynx:/sdcard/14k-files-dir $ ## repetir pruebas
130|lynx:/sdcard/14k-files-dir $ time ls | wc
  14000   14000  618894
    0m01.92s real     0m00.10s usuario     0m00.28s sistema
lynx:/sdcard/14k-files-dir $ time find | wc
  14001   14001  646896
    0m00.72s real     0m00.03s usuario     0m00.13s sistema
lynx:/sdcard/14k-files-dir $ time ls | wc
  14000   14000  618894
    0m00.80s real     0m00.10s usuario     0m00.13s sistema

como se puede ver esta vez, la lista de directorios es mucho más rápida (especialmente una vez que parece estar en caché).

Finalmente quería probar - dado que Android está basado en el kernel de Linux - cómo se compararía mi computadora portátil de más de 10 años.

[user@archlinux-box ~] $ ## corriendo la prueba en una computadora portátil de 10 años
[user@archlinux-box ~] $ mkdir 14k-files-dir
[user@archlinux-box ~] $ cd 14k-files-dir
[user@archlinux-box 14k-files-dir ] $ ## crear 14k archivos de manera eficiente
[user@archlinux-box 14k-files-dir ] $ ## tener nombres de archivo de longitud comparable a los archivos de fotos
[user@archlinux-box 14k-files-dir ] $ PREFIJO='nombre-de-archivo-similar-a-archivo-de-fotos-no-'
[user@archlinux-box 14k-files-dir ] $ seq 1 14000 | sed 's/^/'"$PREFIJO"'/' | xargs sh -c 'touch "$@"' _
[user@archlinux-box 14k-files-dir ] $ ## correr pruebas en la computadora portátil
[user@archlinux-box 14k-files-dir]$ time ls | wc
  14000   14000  632894

real    0m0.025s
usuario    0m0.015s
sistema     0m0.014s
[user@archlinux-box 14k-files-dir]$ time find | wc
  14001   14001  660896

real    0m0.030s
usuario    0m0.019s
sistema     0m0.020s
[user@archlinux-box 14k-files-dir]$ time ls | wc
  14000   14000  632894

real    0m0.021s
usuario    0m0.009s
sistema     0m0.015s

Como se puede ver, la velocidad de listar los directorios difiere enormemente. Estoy desconcertado al determinar las razones.

  1. No está claro en su mayoría por qué la comparación directa "en el dispositivo Android" de los tiempos de lista de directorios es tan grande (1-0.7segundos vs 4-5segundos para /sdcard/DCIM/Camera)
  2. Es desconcertante ya que esperaría que ambas carpetas residieran en el mismo dispositivo de bloques y sistema de archivos debajo de /sdcard ?
  3. En un panorama más amplio, sin embargo, no puedo entender (y busco con esta pregunta las causas de que una computadora portátil de 10 años pueda listar 14k archivos en 0.02segundos mientras que un Google Pixel 7a bastante reciente necesita de 0.7 a 5+ segundos, ¡claramente 250 veces más tiempo?

Actualización# Encontré esta información en Reddit que menciona

Como se menciona a continuación, parece que en Android 11 TODO el acceso a archivos a almacenamiento externo pasa por SAF, incluso al apuntar a la API 29 y usar funciones estándar de acceso a archivos. Este es un cambio con respecto a Android 10. Esto explica la diferencia de velocidad.

Por lo tanto, me pregunto (con respecto a las causas que busco en esta pregunta) si esta sigue siendo la razón?

También con esta nueva información no puedo ver todavía por qué las dos carpetas siguen teniendo velocidades de búsqueda de directorio diferentes de 5-10 veces.

0voto

John Dallman Puntos 103

Respuesta parcial

No puedo explicarlo todo, pero puedo explicar partes de ello.

Laptop vs /sdcard

¿Esa computadora portátil con Linux está presumiblemente usando sistemas de archivos ext3 o ext4? Estos son mucho más eficientes que el simple sistema de archivos FAT32 que Android utiliza (en realidad, emula a través de sdcardfs) en /sdcard, y operan mucho más rápidamente.

¿Por qué Android usa FAT32?

Android necesita poder manejar el almacenamiento en tarjetas de memoria intercambiables (generalmente tarjetas micro-SD), y esas tarjetas necesitan ser legibles, escribibles y formateables en Windows, Linux y macOS. Todos esos sistemas operativos de escritorio/portátil pueden manejar FAT32, pero hacer que manejen los sistemas de archivos principales de los otros es mucho más difícil.

Android también tiene la capacidad de "adoptar" una tarjeta de memoria como parte del almacenamiento del dispositivo, y eso es mucho más simple si el almacenamiento del dispositivo utiliza el mismo tipo de sistema de archivos que una tarjeta de memoria.

Para mayor complejidad, el sistema de archivos interno nativo de Android es ext4, pero utiliza un controlador FUSE ("Filesystem in Userspace") para permitir que el almacenamiento interno se acceda como FAT32.

¿Por qué listar 14,000 archivos de cero bytes es más rápido que 14,000 fotos?

Esa es la parte que no conozco, pero el experimento obvio es crear 14,000 archivos, cada uno aproximadamente del mismo tamaño que sus fotos típicas, y ver si eso es tan lento como las fotos. Espero que lo sea.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X