Ketika grepatau seddigunakan dengan opsi --extended-regexpdan pola {1,9999}adalah bagian dari regexp yang digunakan, kinerja perintah ini menjadi rendah. Agar lebih jelas, di bawah ini diterapkan beberapa tes. [1] [2]
- Kinerja relatif dari
grep -E,egrepdansed -Ehampir sama, jadi hanya tes yang dibuat dengangrep -Eyang disediakan.
Tes 1
$ time grep -E '[0-9]{1,99}' < /dev/null
real 0m0.002s
Tes 2
$ time grep -E '[0-9]{1,9999}' < /dev/null
> real 0m0.494s
Tes 3
$ time grep -E '[0123456789] {1,9999}' </ dev / null
> 21m43.947s nyata
Tes 4
$ time grep -E '[0123456789]+' < /dev/null
$ time grep -E '[0123456789]*' < /dev/null
$ time grep -E '[0123456789]{1,}' < /dev/null
$ time grep -P '[0123456789]{1,9999}' < /dev/null
real 0m0.002s
Apa alasan perbedaan kinerja yang signifikan ini?
time grep -E '[0-9]{1,99}' </dev/nullvs time grep -E '[0-9]{1,9999}' </dev/null. Bahkan tanpa input , perintah kedua lambat (pada 16.04). Seperti yang diharapkan, menghilangkan -Edan melarikan diri {dan }berperilaku sama dan mengganti -Edengan -Ptidak lambat (PCRE adalah mesin yang berbeda). Paling menarik adalah berapa banyak cepat [0-9] adalah dari ., x, dan bahkan [0123456789]. Dengan semua itu dan {1,9999}, grepmengkonsumsi sejumlah besar RAM; Saya belum berani membiarkannya berjalan lebih dari ~ 10 menit.
{ }ini ' 'dikutip ; shell melewati mereka tidak berubah grep. Bagaimanapun, {1,9999}akan menjadi ekspansi penjepit yang sangat cepat dan sederhana . Shell hanya akan memperluas ke 1 9999.
psdan topmemverifikasi grepmelewati argumen yang diharapkan dan itu, tidak bash, mengkonsumsi banyak RAM dan CPU. Saya berharap grepdan sedkeduanya menggunakan fungsi regex POSIX diimplementasikan dalam libc untuk pencocokan BRE / ERE; Saya seharusnya tidak benar-benar berbicara tentang grepdesain secara khusus, kecuali sejauh greppengembang memilih untuk menggunakan perpustakaan itu.
time grep ... < /dev/null, sehingga orang tidak mengacaukan masalah sebenarnya dengan data yang diumpankan ke grepdan hal-hal asing lainnya.
[0-9]+juga)