Đầu tiên, một nitpick: một chuỗi như a*
trong cú pháp shell thông thường là một hình cầu, hoạt động khác với các biểu thức thông thường.
Trên một tổng quan cấp cao, trình thông dịch shell (tức là bash) mở rộng chuỗi a*
thành một danh sách của mỗi tên tệp khớp với mẫu a*
. Những phần sau đó trở thành các tham số dòng lệnh để một đơn thể hiện của grep
(đối với các lập trình viên, tất cả các từ mở rộng đi như chuỗi riêng biệt vào các argv
đối số của main
). grep
Lệnh đơn đó sau đó phân tích các đối số theo bất kỳ cách nào nó chọn và tùy thuộc vào grep
việc diễn giải các đối số đó như tên tệp, tùy chọn, đối số tùy chọn, biểu thức chính quy, v.v. và thực hiện các hành động thích hợp. Mọi thứ xảy ra tuần tự (AFAIK không có grep
triển khai sử dụng nhiều luồng).
Nếu bạn thực hiện một vòng lặp trong một tập lệnh shell để làm điều tương tự, nó gần như được đảm bảo là chậm hơn quy trình trên, vì những lý do sau. Nếu bạn sinh ra một quy trình grep mới cho mỗi tệp, nó chắc chắn sẽ chậm hơn do chi phí tạo quá trình được nhân lên một cách không cần thiết. Nếu bạn tự xây dựng danh sách đối số trong tập lệnh shell và sử dụng một thể hiện duy nhất grep
, mọi thứ bạn làm trong shell sẽ vẫn chậm hơn vì các lệnh shell phải diễn giải (bằng bash), thêm một lớp mã bổ sung, và bạn sẽ chỉ cần thực hiện lại những gì bash đã thực hiện nhanh hơn trong mã được biên dịch.
Đối với việc tự viết bằng C, bạn có thể dễ dàng đạt được hiệu suất tương đương với quy trình được mô tả trong đoạn đầu tiên nhưng không chắc là bạn sẽ có thể đạt được mức tăng hiệu suất so với việc triển khai grep / bash hiện tại để chứng minh thời gian chi tiêu mà không đi sâu vào tối ưu hóa hiệu suất cụ thể của máy hoặc hy sinh tính di động. Có thể bạn có thể thử đưa ra một phiên bản song song tùy ý grep
, nhưng thậm chí điều đó có thể không giúp ích gì vì bạn có nhiều khả năng bị ràng buộc I / O hơn giới hạn CPU. Mở rộng Glob và grep đã "đủ nhanh" cho hầu hết các mục đích "bình thường".
glob
không phải là một biểu thức thông thường. Sự khác biệt lớn.