কেন ইরেপ [ডাব্লুডাব্লু] [ওও] [আরআর] [ডিডি] গ্রেপ-আই শব্দের চেয়ে দ্রুত?


49

আমি grep -iপ্রায়শই ব্যবহার করেছি এবং আমি জানতে পেরেছি যে এটি এর egrepসমতুল্য চেয়ে ধীর গতির , যেখানে আমি প্রতিটি চিঠির উপরের বা নিম্নের সাথে মেলে:

$ time grep -iq "thats" testfile

real    0m0.041s
user    0m0.038s
sys     0m0.003s
$ time egrep -q "[tT][hH][aA][tT][sS]" testfile

real    0m0.010s
user    0m0.003s
sys     0m0.006s

grep -iঅতিরিক্ত টেস্টগুলি কি তা egrepকরে না?


12
আপনি অন্যদিকে grepফ্লাইয়ের ডিস্ক ক্যাচিংয়ের মধ্যে পার্থক্য পরিমাপ করছেন না তা নিশ্চিত করার জন্য অন্যদিকে চেষ্টা করুন ।
এইটবিটটনি

3
আমি পরীক্ষার আগে ফাইলটি গ্রেপড করেছি, তাই এটি ক্যাশে হয়েছে। বিপরীত ক্রমে করা হলে প্রায় একই সময়ে।
টিলেডেরো

21
এটি লোকেলের উপর নির্ভর করতে পারে: কিছু লোকেল কেস সংবেদনশীলতার জন্য অ্যাকাউন্টে জটিল গণনা জড়িত। ইউনিকোড জড়িত অনেক পরিস্থিতিতে GNU গ্রেপ বিশেষত ধীর। আপনি কোন স্থানীয় সেটিংস ব্যবহার করেছেন? কি ইউনিক্স বৈকল্পিক অধীনে? আপনার পরীক্ষার ফাইলটির বিষয়বস্তু কী?
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

6
@ গিলস দেখতে দেখতে ভাল লাগছে, প্রতিটি পরীক্ষার এখানে 100 বার পুনরাবৃত্তি করা (পুরো জিনিসটির সময় নির্ধারণ করা), যতক্ষণ না আমি সেট করি তার egrepচেয়ে দ্রুত এবং তারপরে তারা উভয়ই মোটামুটি একই। grepLANG=C
এইটবিটটনি

2
@ আইটবিটটনি userসময় দেখুন (যা ডিস্কের জন্য অপেক্ষা করার সময় অন্তর্ভুক্ত করে না)। পার্থক্যের ক্ষেত্রে একটি ক্রম রয়েছে।
ক্যাস্পারড

উত্তর:


70

grep -i 'a'grep '[Aa]'শুধুমাত্র একটি ASCII- এর লোকেলের সমতুল্য । একটি ইউনিকোড লোকালে, অক্ষরের সমতা এবং রূপান্তর জটিল হতে পারে, তাই grepকোন অক্ষর সমতুল্য তা নির্ধারণ করতে অতিরিক্ত কাজ করতে হতে পারে। প্রাসঙ্গিক লোকেল সেটিংটি LC_CTYPEযা নির্ধারণ করে যে কীভাবে বাইটগুলি অক্ষর হিসাবে ব্যাখ্যা করা হয়।

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

time LC_ALL=C grep -iq "thats" testfile
time LC_ALL=C egrep -q "[tT][hH][aA][tT][sS]" testfile

অবিচ্ছেদ্য সময় উত্পাদন করতে হবে।

বলা হচ্ছে, আমি আপনার grepদেবিয়ান জেসিতে জিএনইউর সাথে অনুসন্ধানের পুনরুত্পাদন করতে পারি না (তবে আপনি নিজের পরীক্ষার ফাইলটি নির্দিষ্ট করেননি)। আমি যদি একটি এএসসিআইআই লোকেল ( LC_ALL=C) সেট করি তবে grep -iতা দ্রুত। প্রভাবগুলি স্ট্রিংয়ের সঠিক প্রকৃতির উপর নির্ভর করে, উদাহরণস্বরূপ পুনরাবৃত্ত অক্ষরগুলির সাথে একটি স্ট্রিং কার্যকারিতা হ্রাস করে ( যা প্রত্যাশিত হওয়া উচিত )।


লেখক উবুন্টু ১৪.০৪ ব্যবহার করেন যা গ্রেপ ২.১০ সহ প্রেরণ করে। -iমাল্টিবাইট লোকেলগুলির সাথে কেস-সংবেদনশীল মিলগুলির গতি 2.17 এ উন্নত হওয়া উচিত ছিল ।
লেকেনস্টেইন

@ লিকেনস্টেইন জেনে রাখা ভাল, ধন্যবাদ। উবুন্টু 14.04 আসলে গ্রেপ 2.16 এর সাথে আসে তবে এটি প্রাক-2.17; আমি গ্রেপ ২.২০ দিয়ে পরীক্ষা করেছি, যা ব্যাখ্যা করে যে কেন আমি একই ধীরতা দেখছি না।
গিলস

ঠিক আছে, আমি ভুল এলটিএস মুক্তির দিকে তাকিয়ে ছিলাম, উবুন্টু 12.04 গ্রেপ 2.10 সহ জাহাজ এবং উবুন্টু 14.04-তে গ্রেপ 2.16 অন্তর্ভুক্ত রয়েছে।
লেকেনস্টেইন

1
আমি যথেষ্ট নিশ্চিত যে কোনও লোকালে grep -i 'a'সমান grep '[Aa]'। সঠিক উদাহরণটি হ'ল grep -i 'i'হয় grep '[Ii]'বা হয় grep '[İi]'(উপরের বিন্দুতে বড় বড় 1, U + 130, তুর্কি স্থানীয়)। তবে grepস্থানীয়ভাবে এই সমতুল্য শ্রেণীর সন্ধানের জন্য কোনও কার্যকর উপায় নেই ।
এমসাল্টার্স 13'13

15

কৌতূহলের বাইরে আমি একটি আর্চ লিনাক্স সিস্টেমে এটি পরীক্ষা করেছি:

$ uname -r
4.4.5-1-ARCH
$ df -h .
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           3.9G  720K  3.9G   1% /tmp
$ dd if=/dev/urandom bs=1M count=1K | base64 > foo
$ df -h .                                         
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           3.9G  1.4G  2.6G  35% /tmp
$ for i in {1..100}; do /usr/bin/time -f '%e' -ao grep.log grep -iq foobar foo; done
$ for i in {1..100}; do /usr/bin/time -f '%e' -ao egrep.log egrep -q '[fF][oO][oO][bB][aA][rR]' foo; done

$ grep --version
grep (GNU grep) 2.23
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

এবং তারপরে কিছু পরিসংখ্যান সৌজন্যে কি কোনও একক কমান্ডে ন্যূনতম, সর্বোচ্চ, মধ্যম, এবং সংখ্যাগুলির তালিকার গড় পাওয়ার কোনও উপায় আছে? :

$ R -q -e "x <- read.csv('grep.log', header = F); summary(x); sd(x[ , 1])"
> x <- read.csv('grep.log', header = F); summary(x); sd(x[ , 1])
       V1       
 Min.   :1.330  
 1st Qu.:1.347  
 Median :1.360  
 Mean   :1.362  
 3rd Qu.:1.370  
 Max.   :1.440  
[1] 0.02322725
> 
> 
$ R -q -e "x <- read.csv('egrep.log', header = F); summary(x); sd(x[ , 1])"
> x <- read.csv('egrep.log', header = F); summary(x); sd(x[ , 1])
       V1       
 Min.   :1.330  
 1st Qu.:1.340  
 Median :1.360  
 Mean   :1.365  
 3rd Qu.:1.380  
 Max.   :1.430  
[1] 0.02320288
> 
> 

আমি en_GB.utf8লোকালে আছি , তবে সময়গুলি প্রায় অবিচ্ছেদ্য।

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