Dans un bash
script, j'ai besoin de différentes valeurs provenant de /proc/
fichiers. Jusqu'à présent, j'ai des dizaines de lignes qui attrapent les fichiers directement comme ça:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Afin de rendre cela plus efficace, j’ai sauvegardé le contenu du fichier dans une variable et ai ajouté que:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Au lieu d'ouvrir le fichier plusieurs fois, cela devrait simplement l'ouvrir une fois et grep le contenu variable, ce qui, je suppose, serait plus rapide - mais en réalité, il est plus lent:
bash 4.4.19 $ time for i in {1..1000};do grep ^MemFree /proc/meminfo;done >/dev/null
real 0m0.803s
user 0m0.619s
sys 0m0.232s
bash 4.4.19 $ a=$(</proc/meminfo)
bash 4.4.19 $ time for i in {1..1000};do echo "$a"|grep ^MemFree; done >/dev/null
real 0m1.182s
user 0m1.425s
sys 0m0.506s
La même chose est vraie pour dash
et zsh
. Je soupçonnais l’état particulier des /proc/
fichiers comme raison, mais lorsque je copie le contenu de /proc/meminfo
dans un fichier normal et que je l’ utilise, les résultats sont les mêmes:
bash 4.4.19 $ cat </proc/meminfo >meminfo
bash 4.4.19 $ time for i in $(seq 1 1000);do grep ^MemFree meminfo; done >/dev/null
real 0m0.790s
user 0m0.608s
sys 0m0.227s
L'utilisation d'une chaîne here pour enregistrer le canal le rend légèrement plus rapide, mais pas aussi rapide qu'avec les fichiers:
bash 4.4.19 $ time for i in $(seq 1 1000);do <<<"$a" grep ^MemFree; done >/dev/null
real 0m0.977s
user 0m0.758s
sys 0m0.268s
Pourquoi l'ouverture d'un fichier est-elle plus rapide que la lecture du même contenu à partir d'une variable?
/proc/
fichiers était une raison, mais lorsque je copie le contenu de /proc/meminfo
dans un fichier normal et que les résultats sont les mêmes:" Cela n'a rien de spécial /proc/
fichiers, la lecture de fichiers normaux est également plus rapide!