আমাকে একটি উদাহরণ দিতে দাও:
$ 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বাশ forএবং এবং ব্যবহার করে 5 সেকেন্ডের মধ্যে কেবল লাইন লিখতে পারি 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
এগুলি আমাদের এক সেকেন্ডে ৪০ হাজার লাইনে পৌঁছে দেয়। আরও ভাল, তবে এখনও একটি কান্না 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)সিস্টেম কলগুলিতে নয়, অন্যান্য সিস্টোলের নৌকা বোঝা, শেল ওভারহেড, এমনকি আপনার প্রথম উদাহরণে তৈরির প্রক্রিয়া করা (যা dateফাইলটিতে মুদ্রিত প্রতিটি লাইনের জন্য অপেক্ষা করে এবং অপেক্ষা করে)। প্রচুর র্যাম সহ একটি আধুনিক সিস্টেমে ডিস্ক I / O (সিপিইউ / মেমরির চেয়ে বরং) রচনার এক সেকেন্ড সবেই যথেষ্ট। যদি বেশি দিন চলার অনুমতি দেওয়া হয় তবে পার্থক্যটি আরও কম হবে। (আপনি যে কোনও বাশ প্রয়োগ করছেন তা কতটা খারাপ, এবং সিপিইউ এবং ডিস্কের আপেক্ষিক গতির উপর নির্ভর করে আপনি ব্যাশের সাথে ডিস্ক আই / ও পর্যন্ত পরিপূর্ণ করতে পারেন না)।