Bagaimana cara mengatur waktu grep secara akurat?

9

Saya ingin membandingkan kecepatan kedua perintah ini:

grep pattern1 files* 
grep pattern2 files* 

Sayangnya, grep pertama membaca banyak file * ke buffer memori, sehingga grep kedua berjalan sangat cepat, tetapi karena alasan yang salah.

Bagaimana saya memberi tahu Linux (Fedora 11): "tolong hentikan caching disk yang dibaca karena saya sedang menguji sesuatu."

barrycarter
sumber
Mungkin ada jawaban yang lebih cerdas ... tetapi Anda dapat menduplikasi struktur direktori, sehingga Anda tidak akan berurusan dengan file yang sama dan Anda tidak akan memiliki masalah caching!
nico
1
Sebagai tambahan: Fedora 11 mencapai akhir hidup pada Juni 2010. Saatnya untuk meningkatkan. Rilis Fedora 15 mendatang terlihat sangat bagus. Atau, jika Anda membutuhkan sesuatu yang lebih stabil dalam jangka waktu yang lebih lama (dan sepertinya Anda mungkin sejak usia 11 tahun), ada RHEL6 atau CentOS 6. hari-sekarang
mattdm
Butuh saya selamanya untuk memutakhirkan dari RH 7.3 menjadi itu! Peningkatan mematahkan banyak hal dan membuatku takut.
barrycarter
2
Dengan mematikan cache, Anda tidak akan membandingkan kecepatan pencocokan pola, tetapi kecepatan drive Anda. Seperti yang disarankan orang lain - jalankan perintah pertama dua kali: pertama untuk mengunggah cache, kedua untuk tolok ukur.
alex
Saya akan mencobanya, tetapi masalah utama saya adalah kecepatan disk ... hard drive menjadi gila ketika saya menjalankan grep. Hmmm, ok, jadi itu berarti mengoptimalkan grep mungkin tidak membantu sama sekali ... Saya perlu mengoptimalkan jumlah data yang saya tarik.
barrycarter

Jawaban:

11

Saya tidak berpikir Anda bisa, dengan mudah, katakan "berhenti sementara untuk caching". Tetapi yang dapat Anda lakukan adalah memberi tahu sistem untuk menjatuhkan cache sebelum setiap kali dijalankan:

Sebagai root:

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

(Ini didokumentasikan dalam kernel kernel di Documentation / sysctl / vm.txt , yang berguna jika seperti sebagian dari kita, Anda tidak dapat selalu mengingat begitu saja apa yang dilakukan nilai 1, 2, atau 3.)

Atau secara bergantian, tentu saja, mengunggah cache dan membandingkan kinerja yang di-cache. (Saya pikir keduanya adalah angka yang berguna.)

mattdm
sumber
1
echo 1hanya akan menjatuhkan cache halaman, bukan cache disk apa pun.
jsbillings
@ jsbillings - eh, ya. Tetap.
mattdm
Nitpicking luar biasa kecil: Saya harus melakukan ">>", bukan ">"
barrycarter
@ barrycarter: benarkah? Hah!
mattdm
3
@barrycarter: Anda mungkin telah menyetel -o noclobber di shell Anda, yang membuatnya jadi tidak akan membiarkan Anda menggunakan> untuk menimpa file yang ada.
jsbillings
1

Ketika menghitung waktu hal-hal seperti ini saya biasanya menjalankannya terlebih dahulu untuk mengunggah cache. Kemudian jalankan perintah menggunakan waktu. Dalam menguji sesuatu seperti ini Anda harus lebih peduli tentang CPU dan waktu berlalu, dan kurang peduli tentang waktu I / O.

Bagaimanapun, sulit untuk mendapatkan pengaturan waktu yang sepenuhnya akurat. Jika file input melebihi ukuran memori yang tersedia untuk buffer, maka Anda kemungkinan akan mengakhiri semua file melalui cache buffer. Jika tidak, Anda dapat mengakses semua data dari cache buffer. Dalam kehidupan nyata, sering ada campuran data buffered dan membaca data dari disk.

BillThor
sumber
IRL, saya menjalankan perintah ini hanya sesekali, sehingga file * konten tidak pernah di-cache. Saya mencoba mengoptimalkan grep untuk berlari cepat dalam situasi itu. Ketika file * konten sudah ada dalam cache, itu berjalan di bawah satu detik (tidak ada gunanya mengoptimalkan itu, karena output ditujukan untuk pengguna akhir)
barrycarter
2
@barrycarter. Jika file tidak di-cache, dan itu berjalan di bawah satu detik ketika mereka, maka saya tidak berpikir Anda akan menemukan banyak peluang untuk optimasi. Memindahkan file ke penyimpanan yang lebih cepat akan menjadi kemungkinan optimasi.
BillThor