Ketika grep
atau sed
digunakan dengan opsi --extended-regexp
dan 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
,egrep
dansed -E
hampir sama, jadi hanya tes yang dibuat dengangrep -E
yang 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/null
vs time grep -E '[0-9]{1,9999}' </dev/null
. Bahkan tanpa input , perintah kedua lambat (pada 16.04). Seperti yang diharapkan, menghilangkan -E
dan melarikan diri {
dan }
berperilaku sama dan mengganti -E
dengan -P
tidak 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}
, grep
mengkonsumsi 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
.
ps
dan top
memverifikasi grep
melewati argumen yang diharapkan dan itu, tidak bash
, mengkonsumsi banyak RAM dan CPU. Saya berharap grep
dan sed
keduanya menggunakan fungsi regex POSIX diimplementasikan dalam libc untuk pencocokan BRE / ERE; Saya seharusnya tidak benar-benar berbicara tentang grep
desain secara khusus, kecuali sejauh grep
pengembang memilih untuk menggunakan perpustakaan itu.
time grep ... < /dev/null
, sehingga orang tidak mengacaukan masalah sebenarnya dengan data yang diumpankan ke grep
dan hal-hal asing lainnya.
[0-9]+
juga)