У bash
сценарії мені потрібні різні значення з /proc/
файлів. Дотепер у мене є десятки рядків, що чіпляють файли прямо так:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Намагаючись зробити це більш ефективним, я зберегла вміст файлу в змінній і перехопила, що:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Замість того, щоб відкривати файл декілька разів, слід просто відкрити його один раз та зв'язати змістовий вміст, який я припустив, що це буде швидше - але насправді це повільніше:
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
Те саме стосується dash
і zsh
. Я підозрював особливий стан /proc/
файлів як причину, але коли я копіюю вміст у /proc/meminfo
звичайний файл і використовую, що результати однакові:
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
Використання ряду тут для збереження труби робить її трохи швидше, але все ж не так швидко, як у файлах:
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
Чому відкриття файлу швидше, ніж читання одного змісту зі змінної?
/proc/
файлів як причину, але коли я копіюю вміст у /proc/meminfo
звичайний файл і використовую, щоб результати були однаковими:" Це не особливо /proc/
файли, читання звичайних файлів також швидше!