Khi grephoặc sedđược sử dụng với tùy chọn --extended-regexpvà 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,egrepvàsed -Egầ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/nullso 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 -Evà thoát ra {và }hành xử giống nhau và thay thế -Ebằng -Pkhô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 ., xvà thậm chí [0123456789]. Với bất kỳ trong số đó và {1,9999}, greptiê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.
psvà 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 grepvà sedcả 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ề grepthiết kế, ngoại trừ khi các grepnhà 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 grepvà những thứ không liên quan khác.
[0-9]+)