मुझे एक उदाहरण देने दें:
$ timeout 1 yes "GNU" > file1
$ wc -l file1
11504640 file1
$ for ((sec0=`date +%S`;sec<=$(($sec0+5));sec=`date +%S`)); do echo "GNU" >> file2; done
$ wc -l file2
1953 file2
यहाँ आप उस आदेश को देख सकते हैं yes
लिखते हैं 11504640
एक दूसरे में लाइनों, जबकि मैं केवल लिख सकते हैं 1953
bash का उपयोग 5 सेकंड में लाइनों for
और echo
।
जैसा कि टिप्पणियों में सुझाव दिया गया है, इसे और अधिक कुशल बनाने के लिए विभिन्न तरकीबें हैं लेकिन कोई भी इसकी गति के मिलान के करीब नहीं है yes
:
$ ( while :; do echo "GNU" >> file3; done) & pid=$! ; sleep 1 ; kill $pid
[1] 3054
$ wc -l file3
19596 file3
$ timeout 1 bash -c 'while true; do echo "GNU" >> file4; done'
$ wc -l file4
18912 file4
ये एक सेकंड में 20 हजार लाइन तक लिख सकते हैं। और उन्हें और बेहतर बनाया जा सकता है:
$ timeout 1 bash -c 'while true; do echo "GNU"; done >> file5'
$ wc -l file5
34517 file5
$ ( while :; do echo "GNU"; done >> file6 ) & pid=$! ; sleep 1 ; kill $pid
[1] 5690
$ wc -l file6
40961 file6
ये हमें एक सेकंड में 40 हजार लाइन तक मिलती हैं। बेहतर है, लेकिन अभी भी एक बहुत रोना है yes
जिसमें से एक सेकंड में लगभग 11 मिलियन लाइनें लिख सकते हैं!
तो, इतनी जल्दी फाइल कैसे yes
लिखता है?
date
कुछ भारी-भारी है, साथ ही शेल को echo
प्रत्येक लूप पुनरावृत्ति के लिए आउटपुट स्ट्रीम को फिर से खोलना है । पहले उदाहरण में, एकल आउटपुट पुनर्निर्देशन के साथ केवल एक ही कमांड मंगलाचरण है, और कमांड बेहद हल्का है। दोनों किसी भी तरह से तुलनीय नहीं हैं।
date
हो भारी हो सकता है, मेरे सवाल को संपादित देखें।
timeout 1 $(while true; do echo "GNU">>file2; done;)
कमांड प्रतिस्थापन के समाप्त होने के timeout
बाद से ही timeout
कमांड का उपयोग करने का गलत तरीका है। का उपयोग करें timeout 1 sh -c 'while true; do echo "GNU">>file2; done'
।
write(2)
सिस्टम कॉल पर केवल CPU समय खर्च करके , अन्य syscalls, शेल ओवरहेड के बोटलोड पर नहीं, या यहां तक कि अपने पहले उदाहरण में निर्माण की प्रक्रिया करें (जो date
फ़ाइल में छपी प्रत्येक पंक्ति के लिए चलाता है और इंतजार करता है )। लेखन का एक सेकंड बमुश्किल इसके लिए डिस्क आई / ओ (सीपीयू / मेमोरी के बजाय) पर बहुत सारे रैम के साथ एक आधुनिक सिस्टम पर टोंटी के लिए पर्याप्त है। यदि अधिक समय तक चलने दिया जाए, तो अंतर छोटा होगा। (आपके द्वारा उपयोग किए जाने वाले बैश कार्यान्वयन कितना बुरा है, और सीपीयू और डिस्क की सापेक्ष गति के आधार पर, आप बैश के साथ डिस्क I / O को संतृप्त भी नहीं कर सकते हैं)।