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यहाँ ERE और sedBRE का उपयोग करता है । मैंने kshपहले और शेल पैटर्न के साथ एक ही काम किया था लेकिन परिणाम अलग नहीं थे।

वैसे भी, यह एक काफी महत्वपूर्ण विसंगति है - 10 बार kshओवरपरफॉर्म sed। मैंने पहले पढ़ा है कि डेविड कॉर्न ने अपना io एफबीआई लिखा था और इसे लागू करता है ksh- संभवतः यह संबंधित है? - लेकिन मैं इसके बारे में कुछ नहीं के बगल में जानता हूं। यह कैसा है शेल यह इतनी अच्छी तरह से करता है?

मेरे लिए और भी आश्चर्यजनक बात यह है कि kshवास्तव में इसकी ऑफसेट वहीं छोड़ती है जहाँ आप इसे पूछते हैं। प्राप्त करने के लिए (लगभग) का एक ही बाहर (जीएनयू) sed आप का उपयोग करने के लिए है -u- बहुत धीमी गति से

यहाँ एक grepवी। 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रेगुलर एक्सप्रेशन या एक सरल खोल पैटर्न?
मूरू

@ मरमू - यह या तो हो सकता है, लेकिन मैं उन लोगों को बदलने में बहुत अच्छा नहीं हूं। उदाहरण में यह एक शेल पैटर्न है - डिफ़ॉल्ट।
mikeserv

@ मुरु - मैंने एक w / regex जोड़ा।
mikeserv

जवाबों:


8

न केवल ksh sfio का उपयोग करता है बल्कि यह अपने स्वयं के कस्टम मेमोरी एलोकेटर का उपयोग करता है।

फिर भी, मेरा अनुमान है कि sfio इस मामले में अंतर बनाता है। मैंने सिर्फ आपके उदाहरण को स्ट्रेस के तहत चलाने की कोशिश की है और देख सकते हैं कि ksh कॉल पढ़ता / लिखता है ~ 200 बार (65 KB ब्लॉक) जबकि sed इसे ~ 3400 बार (4 KB ब्लॉक) करता है। Sed -u के साथ मेरा लैपटॉप लगभग पिघल गया, रीड प्रति बाइट किया जाता है और प्रति पंक्ति लिखता है। क्ष सरल प्रयोग करता है। ग्रीप ~ 400 बार (32 KB ब्लॉक) पढ़ता है।


हाँ - असंबद्ध दिल के बेहोश के लिए नहीं है। मुझे आश्चर्य है कि अगर kshregex इंजन अपने io के रूप में कुशल है? वैसे भी, उत्तर के लिए बहुत बहुत धन्यवाद। अपने लैपटॉप के लिए मेरी माफी। हालांकि, कस्टम मेमोरी एलोकेटर के बारे में क्या? क्या आपके पास उस पर कोई और अधिक है?
मिकसेर्व

1
दुख की बात है नहीं। आप बेशक स्रोत कोड को & t वेबसाइट से डाउनलोड कर सकते हैं, लेकिन यह इसके बारे में है। पुस्तकालय को एएसटी कहा जाता है और इसमें आवंटनकर्ता, रेगेक्स इंजन और कई अन्य चीजें शामिल हैं। इसलिए यह पूरी तरह से संभव है कि उन सभी चीजों के संयोजन से ksh बहुत तेज हो।
मिरोस्लाव फ्रैंक


धन्यवाद - यह आशाजनक लग रहा है, भी: एएसटी सॉफ्टवेयर संग्रह में उपलब्ध घटकों में से कुछ हैं: पॉसिक्स कमांड अधिकांश मानक पॉस्क कमांड एएसटी संग्रह में उपलब्ध हैं। कई पुस्तकालय कार्यों के रूप में कोडित किए जाते हैं जिन्हें ksh में अंतर्निहित कमांड के रूप में जोड़ा जा सकता है जो नाटकीय रूप से प्रदर्शन में सुधार करता है। - अब मैं सिर्फ यह समझ सकता हूँ कि इसे कैसे बनाया जाए,
mikeserv

1
@mikeserv ksh को Phong Vo के vmalloc एलोकेटर के उपयोग के लिए बनाया जा सकता है । उस लिंक पर जर्नल लेख उपलब्ध हैं।
मार्क प्लॉटनिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.