Je me suis retrouvé avec mon appareil Android (Google Pixel 7a, sur AOSP 15) ayant accumulé environ ~14k fichiers vidéos/photos dans /sdcard/DCIM/Camera
. En conséquence, j'ai remarqué un délai très inattendu lors de la liste de ce répertoire dans ce dossier particulier, mais aussi en général.
Je lance les tests suivants
[user@archlinux-box ~] $ ## ayant le Pixle 7a connecté via un port USB-3 debugger USB
[user@archlinux-box ~] $ adb shell
lynx:/ $ ## chronométrer la liste de /sdcard/DCIM/Camera
lynx:/ $ (cd /sdcard/DCIM/Camera; time ls | wc)
13980 13980 398700
0m04.55s réel 0m00.07s utilisateur 0m00.31s système
lynx:/ $ ## exclure que ce soit une faute du binaire `ls` je vérifie également via `find`
lynx:/ $ (cd /sdcard/DCIM/Camera; time find | wc)
13981 13981 426662
0m05.25s réel 0m00.07s utilisateur 0m00.41s système
Soupçonnant que la liste de ~14k fichiers pourrait prendre un certain temps, mais pas ~5 secondes (et encore moins lors des lectures de liste de répertoires supplémentaires, étant donné que je suppose qu'une mise en cache se produit) j'ai testé si cela est lié au dossier spécifique /sdcard/DCIM/Camera
en le faisant
lynx:/ $ ## créer et entrer dans un répertoire de test pour contenir 14k fichiers
lynx:/ $ mkdir /sdcard/14k-files-dir
lynx:/ $ cd /sdcard/14k-files-dir
lynx:/sdcard/14k-files-dir $ ## créer 14k fichiers de manière assez efficace
lynx:/sdcard/14k-files-dir $ ## avoir des noms de fichiers de longueur comparable aux fichiers photo
lynx:/sdcard/14k-files-dir $ PREFIX='nom-de-fichier-similaire-aux-fichiers-photo-fichier-no-'
lynx:/sdcard/14k-files-dir $ seq 1 14000 | sed 's/^/'"$PREFIX"'/' | xargs sh -c 'touch "$@"' _
lynx:/sdcard/14k-files-dir $ ## rerun tests
130|lynx:/sdcard/14k-files-dir $ time ls | wc
14000 14000 618894
0m01.92s réel 0m00.10s utilisateur 0m00.28s système
lynx:/sdcard/14k-files-dir $ time find | wc
14001 14001 646896
0m00.72s réel 0m00.03s utilisateur 0m00.13s système
lynx:/sdcard/14k-files-dir $ time ls | wc
14000 14000 618894
0m00.80s réel 0m00.10s utilisateur 0m00.13s système
comme on peut le voir cette fois, la liste du répertoire est beaucoup plus rapide (surtout une fois qu'il semble être en cache).
Enfin, je voulais tester - Android étant basé sur le noyau Linux - à quel point mon ordinateur portable de plus de 10 ans se comparerait.
[user@archlinux-box ~] $ ## test sur un ordinateur portable de 10 ans
[user@archlinux-box ~] $ mkdir 14k-files-dir
[user@archlinux-box ~] $ cd 14k-files-dir
[user@archlinux-box 14k-files-dir ] $ ## créer 14k fichiers de manière assez efficace
[user@archlinux-box 14k-files-dir ] $ ## avoir des noms de fichiers de longueur comparable aux fichiers photo
[user@archlinux-box 14k-files-dir ] $ PREFIX='nom-de-fichier-similaire-aux-fichiers-photo-fichier-no-'
[user@archlinux-box 14k-files-dir ] $ seq 1 14000 | sed 's/^/'"$PREFIX"'/' | xargs sh -c 'touch "$@"' _
[user@archlinux-box 14k-files-dir ] $ ## exécuter les tests sur l'ordinateur portable
[user@archlinux-box 14k-files-dir]$ time ls | wc
14000 14000 632894
réel 0m0.025s
utilisateur 0m0.015s
système 0m0.014s
[user@archlinux-box 14k-files-dir]$ time find | wc
14001 14001 660896
réel 0m0.030s
utilisateur 0m0.019s
système 0m0.020s
[user@archlinux-box 14k-files-dir]$ time ls | wc
14000 14000 632894
réel 0m0.021s
utilisateur 0m0.009s
système 0m0.015s
Comme on peut le voir, la vitesse de liste des répertoires diffère grandement. Je suis perplexe pour déterminer les raisons.
- Il est surtout peu clair pourquoi la comparaison directe "sur l'appareil Android" des temps de liste des répertoires est si énorme (1-0.7 secondes contre 4-5 secondes pour
/sdcard/DCIM/Camera
) - C'est déconcertant car je m'attendrais à ce que les deux dossiers résident sur le même périphérique de bloc et le même système de fichiers en dessous de
/sdcard
? - Dans une perspective plus large, cependant, je ne peux pas comprendre (et cherche avec cette question les causes pour lesquelles un ordinateur portable Linux de 10 ans peut répertorier 14k fichiers en 0,02 secondes alors qu'un Google Pixel 7a plutôt récent a besoin de 0,7 à 5+ secondes, soit de manière évidente 250 fois plus longtemps ?
Mise à jour# J'ai trouvé ces informations sur Reddit qui mentionnent
Comme mentionné ci-dessous, il semble qu'avec Android 11, tout l'accès aux fichiers externes passe par SAF, même en ciblant l'API 29 et en utilisant les fonctions d'accès aux fichiers standard. C'est un changement par rapport à Android 10. Cela explique la différence de vitesse.
Je me demande donc (en ce qui concerne les causes que je recherche dans cette question ici) si c'est toujours la raison?
Avec ces nouvelles informations, je ne vois toujours pas pourquoi les deux dossiers ont des vitesses de recherche de répertoires différentes de 5 à 10 fois.