Em um bash
script, preciso de vários valores dos /proc/
arquivos. Até agora, tenho dezenas de linhas cumprindo os arquivos diretamente assim:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Em um esforço para tornar isso mais eficiente, salvei o conteúdo do arquivo em uma variável e confirmei que:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Em vez de abrir o arquivo várias vezes, basta abri-lo uma vez e cumprimentar o conteúdo da variável, que presumi ser mais rápido - mas, na verdade, é mais 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
O mesmo vale para dash
e zsh
. Suspeitei do estado especial dos /proc/
arquivos como motivo, mas quando copio o conteúdo de /proc/meminfo
um arquivo normal e uso os resultados são os mesmos:
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
O uso de uma string here para salvar o pipe o torna um pouco mais rápido, mas ainda não tão rápido quanto nos arquivos:
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 que abrir um arquivo mais rápido do que ler o mesmo conteúdo de uma variável?
/proc/
arquivos como uma razão, mas quando eu copiar o conteúdo de /proc/meminfo
um arquivo regular e uso que os resultados são os mesmos:” É não especial para /proc/
arquivos, a leitura de arquivos regulares também é mais rápida!