ในbash
สคริปต์ฉันต้องการค่าต่าง ๆ จาก/proc/
ไฟล์ จนถึงตอนนี้ฉันมีหลายสิบบรรทัด grepping ไฟล์โดยตรงเช่นนั้น:
grep -oP '^MemFree: *\K[0-9]+' /proc/meminfo
ในความพยายามที่จะทำให้มีประสิทธิภาพมากขึ้นฉันบันทึกเนื้อหาของไฟล์ไว้ในตัวแปรแล้วทำสิ่งต่อไปนี้:
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
การใช้สตริงที่นี่เพื่อบันทึกไปป์ทำให้เร็วขึ้นเล็กน้อย แต่ก็ยังไม่เร็วเท่ากับไฟล์:
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/
ไฟล์การอ่านไฟล์ปกติก็เร็วขึ้นเช่นกัน!