En un bash
script necesito varios valores de /proc/
archivos. Hasta ahora tengo docenas de líneas agrupando los archivos directamente así:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
En un esfuerzo por hacerlo más eficiente, guardé el contenido del archivo en una variable y seleccioné eso:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
En lugar de abrir el archivo varias veces, esto debería abrirlo una sola vez y seleccionar el contenido variable, que supuse sería más rápido, pero de hecho es más lento:
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
Lo mismo es cierto para dash
y zsh
. Sospeché el estado especial de los /proc/
archivos como una razón, pero cuando copio el contenido de /proc/meminfo
un archivo normal y uso que los resultados son los mismos:
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
El uso de una cadena here para guardar la tubería lo hace un poco más rápido, pero aún no tan rápido como con los archivos:
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
¿Por qué abrir un archivo más rápido que leer el mismo contenido de una variable?
/proc/
archivos como una razón, pero cuando copio el contenido de /proc/meminfo
un archivo normal y el uso que los resultados son los mismos:” Es no especial /proc/
archivos, ¡leer archivos normales también es más rápido!