Grep komutlarını doğru bir şekilde nasıl zamanlayabilirim?


9

Bu iki komutun hızını karşılaştırmak istiyorum:

grep pattern1 files* 
grep pattern2 files* 

Ne yazık ki, ilk grep birçok dosyayı * bellek tamponlarına okur, bu nedenle ikinci grep çok hızlı çalışır, ancak yanlış bir nedenden dolayı.

Linux'a (Fedora 11) nasıl söyleyebilirim: "lütfen bir şeyleri test ettiğim için disk okumalarını önbelleğe almayı durdurun."


Muhtemelen daha akıllı bir cevap var ... ancak dizin yapısını çoğaltabilirsiniz, böylece aynı dosyayla uğraşmayacaksınız ve önbellekleme sorunlarınız olmayacak!
nico

1
Bir kenara: Fedora 11, Haziran 2010'da kullanım ömrünün sonuna geldi. Yaklaşan Fedora 15 sürümü gerçekten güzel görünüyor. Veya daha uzun bir ömür boyunca daha kararlı bir şeye ihtiyacınız varsa (ve hala 11 yaşında olduğunuzdan beri görünebilir), RHEL6 veya herhangi bir gün şimdi CentOS 6 var
mattdm

RH 7.3'ten buna yükseltmek sonsuza kadar sürdü! Yükseltmeler bir şeyleri kırar ve beni korkutur.
barrycarter

2
Önbelleği kapatarak desen eşleşmesinin hızını değil, sürücünüzün hızını kıyaslayacaksınız. Diğerlerinin önerdiği gibi - ilk komutu iki kez çalıştırın: ilk önce önbelleği doldurmak için, ikinci olarak kıyaslamak için.
alex

Ben deneyeceğim, ama asıl sorun disk hızı ... grep çalıştırdığınızda sabit disk fındık gider. Hmmm, tamam, bu grep'i optimize etmenin hiç yardımcı olmayabileceği anlamına gelebilir ... Çektiğim veri miktarını optimize etmem gerekiyor.
barrycarter

Yanıtlar:


11

Kolayca "geçici olarak önbelleğe almayı bırak" diyebileceğini sanmıyorum. Ancak yapabileceğiniz şey, sisteme her çalıştırmadan önce önbelleği bırakmasını söylemektir:

Kök olarak:

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

(Bu, Documentation / sysctl / vm.txt adresindeki çekirdek belgelerinde belgelenmiştir .

Alternatif olarak, elbette, önbelleği kullanıma hazırlayın ve önbelleğe alınan performansı karşılaştırın. (Her ikisinin de yararlı sayılar olduğunu düşünüyorum.)


1
echo 1disk önbelleklerini değil, yalnızca sayfa önbelleğini bırakır.
jsbillings

@jsbillings - er, evet. Sabit.
mattdm

İnanılmaz derecede küçük nitpicking: ">>" yapmak zorundaydım, ">" değil
barrycarter

@barrycarter: gerçekten mi? ha!
mattdm

3
@barrycarter: muhtemelen kabuğunuzda -o noclobber değerini ayarlamış olursunuz, bu da varolan bir dosyanın üzerine yazmak için> kullanmanıza izin vermez.
jsbillings

1

Bu tür şeyleri zamanlarken genellikle önbelleği kullanıma hazırlamak için çalıştırırım. Sonra komutu kullanarak komutu çalıştırın. Bunun gibi bir şeyi test ederken, CPU ve geçen zamanlar hakkında daha fazla, I / O zamanı hakkında daha az endişe duymalısınız.

Her durumda, tam olarak doğru zamanlamaları elde etmek zordur. Girdi dosyaları arabellekler için kullanılabilir bellek boyutunu aşarsa, büyük olasılıkla tüm dosyaları arabellek önbelleğinden geçirirsiniz. Aksi takdirde, arabellek önbelleğindeki tüm verilere erişebilirsiniz. Gerçek hayatta, genellikle arabellek verileri ve diskten okunan verilerin bir karışımı vardır.


IRL, bu komutu yalnızca ara sıra çalıştırıyorum, bu yüzden dosyaların * içeriği asla önbelleğe alınmaz. Bu durumda hızlı koşmak için grep optimize etmeye çalışıyorum. Dosyalar * içeriği zaten önbellekte olduğunda, bir saniyenin altında çalışır (çıktı son kullanıcı için tasarlandığından, bunu optimize
etmenin bir anlamı yoktur

2
@barrycarter. Dosyalar önbelleğe alınmamışsa ve bir saniyenin altında çalışırsa, optimizasyon için çok fazla fırsat bulacağınızı sanmıyorum. Dosyaları daha hızlı depolama alanına taşımak olası optimizasyon olacaktır.
BillThor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.