Trong một bash
kịch bản tôi cần các giá trị khác nhau từ /proc/
các tập tin. Cho đến bây giờ tôi có hàng tá dòng grepping trực tiếp như thế:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
Trong một nỗ lực để làm cho hiệu quả hơn, tôi đã lưu nội dung tệp trong một biến và ghi lại rằng:
a=$(</proc/meminfo)
echo "$a" | grep -oP '^MemFree: *\K[0-9]+'
Thay vì mở tệp nhiều lần, bạn chỉ nên mở một lần và grep nội dung biến, mà tôi giả sử sẽ nhanh hơn - nhưng thực tế thì nó chậm hơn:
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
Điều này cũng đúng với dash
và zsh
. Tôi nghi ngờ trạng thái đặc biệt của /proc/
các tệp là một lý do, nhưng khi tôi sao chép nội dung của /proc/meminfo
tệp thông thường và sử dụng thì kết quả là như nhau:
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
Sử dụng một chuỗi ở đây để lưu đường ống làm cho nó nhanh hơn một chút, nhưng vẫn không nhanh như với các tệp:
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
Tại sao mở tệp nhanh hơn đọc cùng một nội dung từ một biến?
/proc/
các files dưới dạng lý do, nhưng khi tôi sao chép nội dung của /proc/meminfo
một tập tin và thường xuyên sử dụng các kết quả đều giống nhau:” Thật là không đặc biệt để /proc/
tập tin, đọc tập tin thường xuyên là nhanh hơn là tốt!