Khi grep
hoặc sed
được sử dụng với tùy chọn --extended-regexp
và mẫu {1,9999}
là một phần của biểu thức chính được sử dụng, hiệu suất của các lệnh này trở nên thấp. Để rõ ràng hơn, dưới đây được áp dụng một vài thử nghiệm. [1] [2]
- Hiệu suất tương đối của
grep -E
,egrep
vàsed -E
gần như bằng nhau, do đó, chỉ có thử nghiệm được thực hiện vớigrep -E
được cung cấp.
Kiểm tra 1
$ time grep -E '[0-9]{1,99}' < /dev/null
real 0m0.002s
Kiểm tra 2
$ time grep -E '[0-9]{1,9999}' < /dev/null
> real 0m0.494s
Bài kiểm tra 3
$ time grep -E '[0123456789] {1,9999}' </ dev / null > 21m43.947 thực
Kiểm tra 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
Lý do của sự khác biệt đáng kể này của hiệu suất là gì?
time grep -E '[0-9]{1,99}' </dev/null
so với time grep -E '[0-9]{1,9999}' </dev/null
. Ngay cả khi không có đầu vào , lệnh thứ hai vẫn chậm (vào ngày 16.04). Như mong đợi, bỏ qua -E
và thoát ra {
và }
hành xử giống nhau và thay thế -E
bằng -P
không chậm (PCRE là một công cụ khác). Hầu hết thú vị là bao nhiêu nhanh hơn [0-9]
là hơn .
, x
và thậm chí [0123456789]
. Với bất kỳ trong số đó và {1,9999}
, grep
tiêu thụ một lượng lớn RAM; Tôi không dám để nó chạy quá ~ 10 phút.
{
}
được '
'
trích dẫn ; Vỏ chuyển chúng không thay đổi đến grep
. Dù sao, {1,9999}
sẽ là một mở rộng cú đúp rất nhanh và đơn giản . Vỏ sẽ mở rộng nó ra 1 9999
.
ps
và top
để xác minh grep
đã thông qua các đối số dự kiến và nó, không bash
, tiêu thụ nhiều RAM và CPU. Tôi mong đợi grep
và sed
cả hai đều sử dụng các hàm regex POSIX được triển khai trong libc để khớp BRE / ERE; Tôi thực sự không nên nói về grep
thiết kế, ngoại trừ khi các grep
nhà phát triển chọn sử dụng thư viện đó.
time grep ... < /dev/null
, để mọi người không nhầm lẫn vấn đề thực tế với dữ liệu được cung cấp cho grep
và những thứ không liên quan khác.
[0-9]+
)