W bash
skrypcie potrzebuję różnych wartości z /proc/
plików. Do tej pory mam kilkadziesiąt wierszy bezpośrednio w plikach:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Aby uczynić to bardziej wydajnym, zapisałem zawartość pliku w zmiennej i grep, że:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Zamiast otwierać plik wiele razy, powinno to po prostu otworzyć go raz i grepować zawartość zmiennej, co, jak zakładam, będzie szybsze - ale w rzeczywistości jest wolniejsze:
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
To samo dotyczy dash
i zsh
. Podejrzewałem specjalny stan /proc/
plików jako przyczynę, ale kiedy kopiuję zawartość /proc/meminfo
do zwykłego pliku i używam, że wyniki są takie same:
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
Użycie ciągu tutaj do zapisania potoku sprawia, że jest on nieco szybszy, ale nadal nie tak szybki jak w przypadku plików:
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
Dlaczego otwieranie pliku jest szybsze niż czytanie tej samej treści ze zmiennej?
/proc/
plików jako powód, ale kiedy skopiować zawartość /proc/meminfo
do pliku regularnego i stosowania, że wyniki są takie same:” To nie specjalny do /proc/
plików, czytanie zwykłych plików jest również szybsze!