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.
- 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
) - Es desconcertante ya que esperaría que ambas carpetas residieran en el mismo dispositivo de bloques y sistema de archivos debajo de
/sdcard
? - 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.