स्टीव के उत्कृष्ट उत्तर में जोड़ने के लिए।
यह व्यापक रूप से ज्ञात नहीं हो सकता लेकिन ग्रेप, लगभग हमेशा तेजी जब एक अब एक छोटी एक से पैटर्न स्ट्रिंग के लिए grepping है, क्योंकि एक लंबे समय तक पैटर्न में, बोयर-मूर को छोड़ सकते हैं अब प्रगति में आगे और भी बेहतर प्राप्त करने के लिए sublinear गति:
उदाहरण:
# after running these twice to ensure apples-to-apples comparison
# (everything is in the buffer cache)
$ time grep -c 'tg=f_c' 20140910.log
28
0.168u 0.068s 0:00.26
$ time grep -c ' /cc/merchant.json tg=f_c' 20140910.log
28
0.100u 0.056s 0:00.17
लंबा फॉर्म 35% तेज है!
कैसे आते हैं? बॉयर-मूर पैटर्न-स्ट्रिंग से एक स्किप-फ़ॉरवर्ड टेबल तैयार करता है, और जब भी कोई मेल नहीं खाता है, तो यह स्किप में चार में इनपुट में एक सिंगल चार की तुलना करने से पहले सबसे लंबी छोड़ देता है (अंतिम चार से पहले तक) तालिका।
यहाँ a good video explaining Boyer Moore
एक अन्य आम धारणा (जीएनयू ग्रेप के लिए) है कि fgrep
grep
की तुलना में तेजी है। f
fgrep
'फास्ट' के लिए खड़ा नहीं है, यह 'निश्चित' (मैन पेज देखें) के लिए खड़ा है, और चूंकि दोनों एक ही प्रोग्राम हैं, और दोनों बॉयर-मूर का उपयोग करते हैं, तो उनके बीच गति में कोई अंतर नहीं होता है regexp विशेष वर्णों के बिना फिक्स्ड स्ट्रिंग की खोज। fgrep
का उपयोग करने का एकमात्र कारण तब होता है जब रेगेक्सपी विशेष चार होता है (जैसे .
, []
, या *
) मैं नहीं चाहता कि इसे इस तरह व्याख्या किया जाए। और फिर भी grep -F
का अधिक पोर्टेबल/मानक रूप fgrep
से अधिक पसंद किया जाता है।
यह खुला स्रोत है ताकि आप स्वयं को देख सकें। http://www.gnu.org/software/grep/devel.html – driis
@WilliamPursell जब निष्पादन का समय सेकंड में जाता है, तो जेआईटी शायद गर्म हो जाता है और दिमागी-झुकाव अंतर (1) grep अविश्वसनीय रूप से होता है यह क्या करता है इसके बारे में स्मार्ट और (2) जावा कोड विशिष्ट समस्या grep के लिए एक बहुत खराब एल्गोरिदम विकल्प बना रहा है। – delnan
आपके जावा कार्यान्वयन ने JVM को शुरू करने में कितना समय व्यतीत किया है, और यह वास्तव में आपके कोड को निष्पादित करने में कितना समय व्यतीत करता है? या यह आपके जावा कोड में उपयोग किए गए एल्गोरिदम का विषय हो सकता है; एक ओ (एन^2) एल्गोरिदम किसी भी भाषा में धीमा होने की संभावना है। –