在bash
脚本中,我需要/proc/
文件中的各种值。到目前为止,我有数十行代码直接像这样对文件进行grep:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
为了提高效率,我将文件内容保存在一个变量中并对其进行grep化:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
与其多次打开文件,不如将其打开一次并grep变量内容,我认为这会更快-但实际上它更慢:
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
使用here字符串保存管道会使它稍快一些,但仍不如文件快:
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/
文件,读取常规文件也更快!