কিভাবে এত দ্রুত ksh93?


9

সুতরাং, সাধারণভাবে, আমি sedটেক্সট প্রসেসিংয়ের দিকে ঝুঁকছি - বিশেষত বড় ফাইলগুলির জন্য - এবং সাধারণত শেল নিজেই এই ধরণের জিনিসগুলি এড়ানো যায় না।

আমি মনে করি, যদিও এটি পরিবর্তন হতে পারে। আমি কাছাকাছি ছিল man kshএবং আমি এটি লক্ষ্য:

<#pattern     Seeks forward to the beginning of the
              next line containing pattern.

<##pattern    The same as <# except that  the  por
              tion  of  the file that is skipped is
              copied to standard output.

বাস্তব-জগতের উপযোগিতা সম্পর্কে সন্দেহজনক, আমি এটি চেষ্টা করার সিদ্ধান্ত নিয়েছি। আমি করেছিলাম:

seq -s'foo bar
' 1000000 >file

... এমন এক মিলিয়ন লাইনের ডেটার জন্য যা দেখতে:

1foo bar
...
999999foo bar
1000000

... এবং এটিকে sedপছন্দ করার মতো করে দিয়েছে:

p='^[^0-8]99999.*bar'
for c in "sed '/$p/q'" "ksh -c ':<##@(~(E)$p)'"    
do </tmp/file eval "time ( $c )"
done | wc -l

সুতরাং উভয় কমান্ডই 999999foo বার পর্যন্ত উঠা উচিত এবং তাদের প্যাটার্নের সাথে মেলে এমন প্রয়োগের জন্য প্রতিটি লাইনের কমপক্ষে শুরু এবং শেষের মূল্যায়ন করতে হবে। এগুলি অবহেলিত প্যাটার্নের বিপরীতে প্রথম চরটিও যাচাই করতে হবে। এটি একটি সাধারণ জিনিস, তবে ... ফলাফলগুলি আমার প্রত্যাশা মতো ছিল না:

( sed '/^[^0-8]99999.*bar/q' ) \
    0.40s user 0.01s system 99% cpu 0.419 total
( ksh -c ':<##@(~(E)^[^0-8]99999.*bar)' ) \
    0.02s user 0.01s system 91% cpu 0.033 total
1999997

kshএখানে আগে এবং sedএকটি BRE ব্যবহার করে। আমি একই জিনিসটি kshআগে এবং একটি শেল প্যাটার্ন দিয়েছিলাম তবে ফলাফলগুলি পৃথক হয়নি।

যাইহোক, এটি মোটামুটি উল্লেখযোগ্য তাত্পর্য - 10 বার kshছাড়িয়ে গেছে sed। আমি এর আগে পড়েছি যে ডেভিড কর্ন তার নিজের আইও লিব লিখেছিলেন এবং এতে প্রয়োগ করেছিলেন ksh- সম্ভবত এটি সম্পর্কিত? - তবে আমি এটি সম্পর্কে কিছুই জানি না। কিভাবে এটি শেল এটি এত ভাল করে?

আমার কাছে আরও আশ্চর্যের বিষয় হ'ল kshসত্যই যেখানে আপনি এটি জিজ্ঞাসা করেছেন সেখানে অফসেটটি ছেড়ে যায়। পেতে (প্রায়) একই আউট (গনুহ) sed আপনি ব্যবহার করতে হবে -u- খুব ধীর

এখানে একটি grepv kshপরীক্ষা রয়েছে:

1000000         #grep + head
( grep -qm1 '^[^0-8]99999.*bar'; head -n1; ) \
    0.02s user 0.00s system 90% cpu 0.026 total
999999foo bar   #ksh + head
( ksh -c ':<#@(~(E)^[^0-8]99999.*bar)'; head -n1; )  \
    0.02s user 0.00s system 73% cpu 0.023 total

kshgrepএখানে মারধর করে - তবে সবসময় তা হয় না - এগুলি অনেকটা বাঁধা। তবুও, এটি বেশ দুর্দান্ত, এবং ksh বর্ণমালা সরবরাহ করে - এর ম্যাচের আগেhead এর ইনপুট শুরু হয় ।

আমার ধারণা, এটি সত্য হওয়া খুব ভাল লাগে। এই কমান্ডগুলি হুডের নীচে আলাদাভাবে কী করছে?

ওহ, এবং দৃশ্যত এখানে একটি সাবশেলও নেই:

ksh -c 'printf %.5s "${<file;}"'

কি patternএকটি রেগুলার এক্সপ্রেশন বা সহজ শেল প্যাটার্ন?
মুরু

@ মুরু - এটি হতে পারে তবে আশেপাশের স্থানগুলি পরিবর্তন করার ক্ষেত্রে আমি খুব ভাল না। উদাহরণস্বরূপ এটি একটি শেল প্যাটার্ন - ডিফল্ট।
মাইকজার্ভ

@ মুরু - আমি একটি ডাব্লু / একটি রেজেক্স যুক্ত করেছি।
মাইক্রজারভ

উত্তর:


8

Ksh কেবল এসফিয়ো ব্যবহার করে না এটি নিজস্ব কাস্টম মেমরি বরাদ্দকারীও ব্যবহার করে।

তবুও, আমার অনুমানটি এসফিয়ো এই ক্ষেত্রে পার্থক্য আনায়। আমি কেবল আপনার উদাহরণটি স্ট্রেসের অধীনে চালানোর চেষ্টা করেছি এবং দেখতে পাচ্ছি যে ksh কলগুলি 200 ডলার (65 কিলোবাইট ব্লক) পড়তে / লিখতে পারে যখন সেগুলি 3400 বার (4 কেবি ব্লক) করে। সেড -u দিয়ে আমার ল্যাপটপটি প্রায় গলে গেছে, বাইট প্রতি পড়া হয় এবং প্রতি লাইনে লেখা হয়। Ksh সাধারণ lseek ব্যবহার করে। গ্রেপ ~ 400 বার পঠন (32 কেবি ব্লক) ব্যবহার করে।


হ্যাঁ - উদ্বেগহীন হৃদয়ের হতাশার জন্য নয়। আমি ভাবছি kshএর রেজেক্স ইঞ্জিনটি এর আইও হিসাবে দক্ষ কিনা? যাইহোক, উত্তরের জন্য অনেক ধন্যবাদ। আপনার ল্যাপটপে আমার ক্ষমা। যদিও কাস্টম মেমরি বরাদ্দকারী সম্পর্কে? তোমার কি আর কিছু আছে?
মাইক্রজারভ

1
দুঃখের বিষয়, না। আপনি অবশ্যই এ & টি ওয়েবসাইট থেকে সোর্স কোডটি ডাউনলোড করতে পারেন, তবে এটি প্রায়। গ্রন্থাগারটিকে এএসটি বলা হয় এবং এতে বরাদ্দকারী, রেজেক্স ইঞ্জিন এবং অন্যান্য অনেকগুলি জিনিস রয়েছে। সুতরাং এটি সম্পূর্ণরূপে সম্ভব যে এই সমস্ত জিনিসের সংমিশ্রণ ksh কে আরও দ্রুত করে তোলে।
মিরোস্লাভ ফ্রাঙ্ক


আপনাকে ধন্যবাদ - এটি আশাব্যঞ্জকও দেখায়: এএসটি সফ্টওয়্যার সংগ্রহের মধ্যে উপলব্ধ কয়েকটি উপাদান হ'ল: পসিক্স কমান্ডগুলি বেশিরভাগ স্ট্যান্ডার্ড পসিক্স কমান্ডগুলি এএসটি সংগ্রহের মধ্যে পাওয়া যায়। অনেকগুলি লাইব্রেরির ফাংশন হিসাবে কোড করা হয় যা বিল্ট-ইন কমান্ড হিসাবে নাটকীয়ভাবে কর্মক্ষমতা উন্নত করে ksh এ যুক্ত করা যেতে পারে। - এখন আমি কীভাবে এটি তৈরি করব তা ঠিক বের করতে হবে,
মাইক্রোসার্ভ

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