5 votes

Pourquoi [trouver] est incroyablement rapide, s'il est exécuté deux fois ?

Dans le Dash de mon système Ubuntu/Linux se trouvent deux versions du même programme.

Initial Problem

Pour trouver l'endroit où le .desktop sont situés, j'ai utilisé

find / -type f -name 'Sublime Text.desktop' 2> /dev/null

Je n'ai eu aucun résultat, alors j'ai fait (avec succès)

find / -type f -name '[s,S]ublime*.desktop' 2> /dev/null

J'ai été étonné de voir qu'elle s'est terminée au bout de trois secondes environ, car le terme recherché devait être nettement plus long que le premier. Comme je n'étais pas tranquille, j'ai relancé la première commande et, à ma grande surprise, elle s'est également terminée au bout de trois secondes.

Pour vérifier le comportement, j'ai mis sous tension une deuxième machine Linux et j'ai relancé la première commande, mais cette fois avec time

time find -type f -name 'Sublime Text.desktop' 2> /dev/null 

Proof


find n'accélère pas seulement la recherche du même terme de recherche, mais plutôt toutes les recherches (dans le même chemin ?). Même la recherche d'une chaîne "non reproduite" n'est pas ralentie.

time find / -type f -name 'Emilbus Txet.Potksed' 2> /dev/null

Analyse RAM while before and after using find

Que fait Find pour accélérer autant le processus de recherche ?

7voto

bennofs Points 231

La raison pour laquelle find est plus rapide la deuxième fois est que linux fait des fichiers mise en cache . Lors du premier accès à un fichier, le contenu du fichier est conservé en mémoire (bien entendu, il ne le fait que si vous disposez de RAM libre). Si le fichier est relu ultérieurement, il peut alors récupérer le contenu en mémoire sans avoir à relire le fichier. L'accès à la mémoire étant beaucoup plus rapide que l'accès au disque, cela augmente les performances globales.

Donc ce qui se passe, c'est que sur le premier find la plupart des fichiers ne sont pas encore en mémoire, donc linux doit faire beaucoup d'opérations sur le disque. C'est lent, donc ça prend du temps.

Lorsque vous exécutez find Encore une fois, la plupart des fichiers et des répertoires sont déjà en mémoire et c'est beaucoup plus rapide.


Vous pouvez le tester vous-même si vous vider le cache entre les deux exécutions de la découverte. Alors la deuxième recherche ne sera pas plus rapide que la première. Voici comment cela se présente sur mon système :

# This clears the cache. Be careful through, you might loose some data (Although this shouldn't happen, it's better to be sure)
$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3

$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,47s user 1,41s system 8% cpu 21,435 total

# Now the file names are in the cache. The next find is very fast:
$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,19s user 0,28s system 69% cpu 0,673 total

# If we clear the cache, the time goes back to the starting time again
$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,39s user 1,45s system 10% cpu 16,866 total

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X