Jak precyzyjnie odmierzać czas poleceń grep?

9

Chcę porównać szybkość tych dwóch poleceń:

grep pattern1 files* 
grep pattern2 files* 

Niestety, pierwszy grep wczytuje dużą część plików * do buforów pamięci, więc drugi grep działa bardzo szybko, ale z niewłaściwego powodu.

Jak mam powiedzieć Linuksowi (Fedora 11): „proszę przestań buforować odczyt dysku, ponieważ coś testuję”.

bariera
źródło
Prawdopodobnie jest mądrzejsza odpowiedź ... ale możesz zduplikować strukturę katalogów, więc nie będziesz mieć do czynienia z tym samym plikiem i nie będziesz mieć problemów z buforowaniem!
nico
1
Nawiasem mówiąc: Fedora 11 zakończyła działalność w czerwcu 2010 roku. Czas na aktualizację. Nadchodzące wydanie Fedory 15 wygląda naprawdę ładnie. Lub, jeśli potrzebujesz czegoś bardziej stabilnego w dłuższym okresie życia (i brzmi to tak, jakbyś miał 11 lat), jest RHEL6 lub dziś CentOS 6.
mattdm
Przejście od wersji RH 7.3 do tego zajęło mi wieczność! Ulepszenia niszczą rzeczy i przerażają mnie.
barrycarter
2
Wyłączając buforowanie, porównujesz nie prędkość dopasowywania wzorców, ale prędkość dysku. Jak sugerują inni - po prostu uruchom pierwsze polecenie dwa razy: najpierw, aby zalać pamięć podręczną, drugi, aby przeprowadzić test porównawczy.
alex
Spróbuję, ale moim głównym problemem jest prędkość dysku ... dysk twardy wariuje, gdy uruchamiam grep. Hmmm, ok, więc to może oznaczać, że optymalizacja grepa może wcale nie pomóc ... Muszę zoptymalizować ilość pobieranych danych.
barrycarter

Odpowiedzi:

11

Nie sądzę, żebyś mógł łatwo powiedzieć „chwilowo przestań buforować”. Ale możesz powiedzieć systemowi, aby upuścił pamięć podręczną przed każdym uruchomieniem:

Jako root:

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

(Jest to udokumentowane w dokumentacji jądra w Documentation / sysctl / vm.txt , co jest przydatne, jeśli jak niektórzy z nas nie zawsze pamiętasz od razu, co robią wartości 1, 2 lub 3).

Lub, alternatywnie, oczywiście zalej pamięć podręczną i porównaj wydajność pamięci podręcznej. (Myślę, że oba są użytecznymi liczbami.)

mattdm
źródło
1
echo 1spowoduje jedynie upuszczenie pamięci podręcznej strony, a nie pamięci podręcznych dysków.
jsbillings
@jsbillings - er, tak. Naprawiony.
mattdm
Niewiarygodnie drobne dręczenie: musiałem zrobić „>>”, a nie „>”
bar kosztujący
@barrycarter: naprawdę? tak!
mattdm
3
@barrycarter: prawdopodobnie ustawiłeś -o noclobber w swojej powłoce, co sprawia, że ​​nie pozwala na użycie> do zastąpienia istniejącego pliku.
jsbillings
1

Podczas mierzenia czasu takich rzeczy zwykle uruchamiam je najpierw, aby zalać pamięć podręczną. Następnie uruchom polecenie, używając czasu. Testując coś takiego, powinieneś bardziej przejmować się procesorem i upływającymi czasami, a mniej przejmować się czasem we / wy.

W każdym razie trudno jest uzyskać w pełni dokładne czasy. Jeśli pliki wejściowe przekroczą rozmiar pamięci dostępnej dla buforów, prawdopodobnie skończysz cyklicznie wszystkie pliki w buforze pamięci podręcznej. W przeciwnym razie możesz uzyskać dostęp do wszystkich danych z bufora pamięci podręcznej. W prawdziwym życiu często występuje połączenie danych buforowanych i danych odczytywanych z dysku.

BillThor
źródło
IRL, uruchamiam to polecenie tylko sporadycznie, więc zawartość plików * nigdy nie jest buforowana. Próbuję zoptymalizować grep, aby działał szybko w tej sytuacji. Gdy zawartość plików * jest już w pamięci podręcznej, uruchamia się ona w ciągu sekundy (nie ma sensu tego optymalizować, ponieważ dane wyjściowe są przeznaczone dla użytkownika końcowego)
barrycarter
2
@barrycarter. Jeśli pliki nie zostaną zapisane w pamięci podręcznej, a gdy zostaną uruchomione, trwa mniej niż sekundę, nie sądzę, że znajdziesz wiele okazji do optymalizacji. Prawdopodobnie optymalizacją byłoby przeniesienie plików do szybszego magazynu.
BillThor