Làm thế nào để thời gian lệnh grep chính xác?


9

Tôi muốn so sánh tốc độ của hai lệnh này:

grep pattern1 files* 
grep pattern2 files* 

Thật không may, grep đầu tiên đọc nhiều tệp * vào bộ đệm, vì vậy grep thứ hai chạy rất nhanh, nhưng vì lý do sai.

Làm thế nào để tôi nói với Linux (Fedora 11): "vui lòng dừng đọc bộ đệm trên đĩa vì tôi đang kiểm tra một cái gì đó."


Có thể có một câu trả lời thông minh hơn ... nhưng bạn có thể sao chép cấu trúc thư mục, vì vậy bạn sẽ không xử lý cùng một tệp và bạn sẽ không gặp vấn đề về bộ đệm!
nico

1
Tạm biệt: Fedora 11 đã hết tuổi thọ vào tháng 6 năm 2010. Đã đến lúc nâng cấp. Bản phát hành Fedora 15 sắp tới trông thực sự tốt đẹp. Hoặc, nếu bạn cần một cái gì đó ổn định hơn trong vòng đời dài hơn (và có vẻ như bạn có thể vì bạn vẫn còn trên 11 tuổi), có RHEL6 hoặc bất kỳ ngày nào là CentOS 6.
mattdm

Tôi đã mất mãi mãi để nâng cấp từ RH 7.3 lên đó! Nâng cấp phá vỡ mọi thứ và làm tôi sợ.
barrycarter

2
Bằng cách tắt bộ nhớ đệm, bạn sẽ đo điểm chuẩn không phải là tốc độ khớp mẫu, mà là tốc độ ổ đĩa của bạn. Như những người khác đề xuất - chỉ cần chạy lệnh đầu tiên hai lần: lần đầu tiên để đánh dấu bộ đệm, lần thứ hai đến điểm chuẩn.
alex

Tôi sẽ thử nó, nhưng vấn đề chính của tôi là tốc độ ổ đĩa ... ổ cứng bị hỏng khi tôi chạy grep. Hmmm, ok, vì vậy điều đó có nghĩa là tối ưu hóa grep có thể không giúp ích gì cả ... Tôi cần tối ưu hóa lượng dữ liệu tôi đang kéo.
barrycarter

Câu trả lời:


11

Tôi không nghĩ rằng bạn có thể, một cách dễ dàng, nói với nó "tạm thời dừng bộ nhớ đệm". Nhưng những gì bạn có thể làm là yêu cầu hệ thống bỏ bộ đệm trước mỗi lần chạy:

Là gốc:

sync; echo 3 > /proc/sys/vm/drop_caches

(Điều này được ghi lại trong các tài liệu kernel tại Documentation / sysctl / vm.txt , rất hữu ích nếu như một số người trong chúng ta, bạn không thể luôn nhớ những gì các giá trị 1, 2 hoặc 3 làm.)

Hoặc xen kẽ, tất nhiên, đánh dấu bộ đệm và so sánh hiệu suất được lưu trữ. (Tôi nghĩ cả hai đều là những con số hữu ích.)


1
echo 1sẽ chỉ bỏ bộ đệm trang, không phải bất kỳ bộ đệm đĩa.
jsbillings

@jsbillings - er, vâng. Đã sửa.
mattdm

Nitpicking nhỏ không thể tin được: Tôi đã phải làm ">>", không phải ">"
barrycarter

@barrycarter: thật sao? Huh!
mattdm

3
@barrycarter: có thể bạn đã đặt -o noclobber trong trình bao của mình, điều này khiến nó không cho phép bạn sử dụng> để ghi đè lên một tệp hiện có.
jsbillings

1

Khi định thời gian như thế này, tôi thường chạy nó trước để tạo bộ đệm. Sau đó chạy lệnh bằng thời gian. Khi thử nghiệm một cái gì đó như thế này, bạn nên quan tâm nhiều hơn về CPU và thời gian trôi qua, và ít quan tâm hơn về thời gian I / O.

Trong mọi trường hợp rất khó để có được thời gian hoàn toàn chính xác. Nếu các tệp đầu vào vượt quá kích thước bộ nhớ có sẵn cho bộ đệm, thì có khả năng bạn sẽ kết thúc tất cả các tệp thông qua bộ đệm. Nếu không, bạn chỉ có thể truy cập tất cả dữ liệu từ bộ đệm bộ đệm. Trong cuộc sống thực, thường có sự pha trộn giữa dữ liệu đệm và dữ liệu được đọc từ đĩa.


IRL, thỉnh thoảng tôi chỉ chạy lệnh này, vì vậy nội dung tệp * không bao giờ được lưu trong bộ nhớ cache. Tôi đang cố gắng tối ưu hóa grep để chạy nhanh trong tình huống đó. Khi nội dung tệp * đã có trong bộ đệm, nó sẽ chạy trong một giây (không có điểm nào tối ưu hóa điều đó, vì đầu ra được dành cho người dùng cuối)
barrycarter

2
@barrycarter. Nếu các tệp không được lưu trong bộ nhớ cache và nó chạy trong một giây khi chúng tồn tại, thì tôi không nghĩ bạn sẽ tìm thấy nhiều cơ hội để tối ưu hóa. Di chuyển các tập tin để lưu trữ nhanh hơn sẽ có khả năng tối ưu hóa.
BillThor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.