एक 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/
फ़ाइलें, नियमित रूप से फ़ाइलों को पढ़ने के रूप में अच्छी तरह से तेजी से है!