প্রতিধ্বনি> ফাইল ইকো | এর চেয়ে বেশি বাস্তব সময় কেন ব্যবহার করে? সেড> ফাইল?


28

নীচে উদাহরণটি আমাকে অবাক করে দিয়েছে। এটা সত্য একটি জুলপি বেশি যে সেখান থেকে পাল্টা স্বজ্ঞাত হতে ... সরাইয়া মনে হয় সময় পর্যন্ত ব্যবহারকারী জন্য echo | sedকম্বো।

যখন একা চলে তখন কেন echoএত বেশি সময় ব্যয় করা হয়, বা এই প্রশ্নটি হওয়া উচিত যে কীভাবে sedখেলার অবস্থা পরিবর্তন হয়? মনে হচ্ছে উভয় ক্ষেত্রে echoএকই প্রতিধ্বনি করা দরকার ...

time echo -n a\ {1..1000000}\ c$'\n' >file

# real    0m9.481s
# user    0m5.304s
# sys     0m4.172s

time echo -n a\ {1..1000000}\ c$'\n' |sed s/^\ // >file

# real    0m5.955s
# user    0m5.488s
# sys     0m1.580s

1
আমার অন্ত্রের প্রতিক্রিয়া হ'ল এটি বাফারিংয়ের সাথে সম্পর্কিত।
বাহামত

1
@ বাহাহাত আমি মনে করি আপনি ঠিক বলেছেন প্রতিধ্বনিটির জন্য প্রতিধ্বনি পৃথক লিখিত () করে। সেড তাদের বাফার করে। সুতরাং প্রথম সংস্করণটিতে একটি মিলিয়ন একটি নিয়মিত ফাইলের জন্য লেখেন, একটি ব্লক ডিভাইস স্তরটিতে একটি ফাইল সিস্টেম ড্রাইভারের মধ্য দিয়ে যায় এবং দ্বিতীয় সংস্করণে একটি মিলিয়নে একটি পাইপে যায় এবং কার্নেল কোডের আরও ব্যয়বহুল স্তরগুলির মধ্য দিয়ে কিছুটা কম লেখেন।
অ্যালান কারি

@ বাহাহাত অবশ্যই বাফার করছে। time echo ... |cat >fileএবং এমনকি সংস্করণ time echo ... |perl -ne 'print'একই সময় sed
স্টারনামার

4
ভাল ব্যাখ্যার জন্য প্রত্যেককে ধন্যবাদ ... সুতরাং বড় মাল্টি-লাইন লেখার জন্য (
ব্যাশে

উত্তর:


29

বাহামাত এবং অ্যালান কারি এটি সঠিকভাবে রয়েছে: এটি আপনার শেলটি আউটপুটটি যেভাবে বাফার করে তার কারণে এটি ঘটে echo। বিশেষত, আপনার শেলটি ব্যাশ, এবং এটি writeপ্রতি লাইনে একটি সিস্টেম কল দেয়। সুতরাং প্রথম স্নিপেটটি একটি ডিস্ক ফাইলে 1000000 লেখেন, যখন দ্বিতীয় স্নিপেট 1000000 একটি পাইপ এবং সেডকে লেখেন (মূলত সমান্তরালে, যদি আপনার একাধিক সিপিইউ থাকে) তার আউটপুটটির কারণে একটি ডিস্ক ফাইলে যথেষ্ট ছোট সংখ্যক লেখার কাজ করে বাফার উপলব্ধ।

স্ট্রেস চালিয়ে আপনি কী পর্যবেক্ষণ করতে পারেন ।

$ strace -f -e write bash -c 'echo -n a\ {1..2}\ c$'\'\\n\'' >file'
write(1, "a 1 c\n", 6)                  = 6
write(1, " a 2 c\n", 7)                 = 7
$ strace -f -e write bash -c 'echo -n a\ {1..2}\ c$'\'\\n\'' | sed "s/^ //" >file'
Process 28052 attached
Process 28053 attached
Process 28051 suspended
[pid 28052] write(1, "a 1 c\n", 6)      = 6
[pid 28052] write(1, " a 2 c\n", 7)     = 7
Process 28051 resumed
Process 28052 detached
Process 28051 suspended
[pid 28053] write(1, "a 1 c\na 2 c\n", 12) = 12
Process 28051 resumed
Process 28053 detached
--- SIGCHLD (Child exited) @ 0 (0) ---

অন্যান্য শেল যেমন ksh বাফারটি মাল্টিলাইন হয়ে echoগেলেও আউটপুটকে বাফার করে , তাই আপনি কোনও পার্থক্য দেখতে পাবেন না।

$ strace -f -e write ksh -c 'echo -n a\ {1..2}\ c$'\'\\n\'' >file'
write(1, "a 1 c\n a 2 c\n", 13)         = 13
$ strace -f -e write ksh -c 'echo -n a\ {1..2}\ c$'\'\\n\'' | sed "s/^ //" >file'
Process 28058 attached
[pid 28058] write(1, "a 1 c\n a 2 c\n", 13) = 13
Process 28058 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
write(1, "a 1 c\na 2 c\n", 12)          = 12

বাশ সহ আমি একই সময়ের অনুপাত পাই। Ksh সহ আমি দ্বিতীয় স্নিপেটটি ধীর গতিতে দেখছি।

ksh$ time echo -n a\ {1..1000000}\ c$'\n' >file

real    0m1.44s
user    0m1.28s
sys     0m0.06s
ksh$ time echo -n a\ {1..1000000}\ c$'\n' | sed "s/^ //" >file

real    0m2.38s
user    0m1.52s
sys     0m0.14s

ধন্যবাদ ... যে শেষ kshউদাহরণটি আমি প্রত্যাশা করেছিলাম তার
ধারাবাহিকতায় আরও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.