Wie kann man Grep-Befehle genau zeitlich festlegen?

9

Ich möchte die Geschwindigkeit dieser beiden Befehle vergleichen:

grep pattern1 files* 
grep pattern2 files* 

Leider liest der erste Grep viele Dateien * in Speicherpuffer, so dass der zweite Grep sehr schnell ausgeführt wird, aber aus dem falschen Grund.

Wie sage ich Linux (Fedora 11): "Bitte hören Sie auf, Festplattenlesevorgänge zwischenzuspeichern, weil ich etwas teste."

Barrycarter
quelle
Es gibt wahrscheinlich eine klügere Antwort ... aber Sie könnten die Verzeichnisstruktur duplizieren, damit Sie nicht mit derselben Datei arbeiten und keine Caching-Probleme haben!
Nico
1
Nebenbei bemerkt: Fedora 11 hat im Juni 2010 das Ende seiner Lebensdauer erreicht. Es ist Zeit für ein Upgrade. Die bevorstehende Fedora 15-Version sieht wirklich gut aus. Oder wenn Sie über eine längere Lebensdauer etwas Stabileres benötigen (und es klingt so, als ob Sie es könnten, seit Sie noch 11 Jahre alt sind), gibt es RHEL6 oder CentOS 6.
mattdm
Ich habe ewig gebraucht, um von RH 7.3 auf das zu aktualisieren! Upgrades brechen Dinge und machen mir Angst.
Barrycarter
2
Wenn Sie das Caching deaktivieren, messen Sie nicht die Geschwindigkeit des Pattern Matching, sondern die Geschwindigkeit Ihres Laufwerks. Wie andere vorschlagen - führen Sie den ersten Befehl einfach zweimal aus: erstens, um den Cache zu füllen, zweitens, um den Benchmark durchzuführen.
Alex
Ich werde es versuchen, aber mein Hauptproblem ist die Festplattengeschwindigkeit ... die Festplatte wird verrückt, wenn ich den Grep starte. Hmmm, ok, das kann bedeuten, dass die Optimierung des grep überhaupt nicht hilft ... Ich muss die Datenmenge optimieren, die ich abrufe.
Barrycarter

Antworten:

11

Ich glaube nicht, dass Sie es leicht sagen können "vorübergehend das Caching beenden". Sie können das System jedoch anweisen, den Cache vor jedem Lauf zu löschen:

Als Wurzel:

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

(Dies ist in den Kerneldokumenten unter Documentation / sysctl / vm.txt dokumentiert. Dies ist praktisch, wenn Sie sich wie bei einigen von uns nicht immer sofort daran erinnern können, was die Werte 1, 2 oder 3 bewirken.)

Oder alternativ können Sie den Cache vorbereiten und die zwischengespeicherte Leistung vergleichen. (Ich denke, beide sind nützliche Zahlen.)

mattdm
quelle
1
echo 1löscht nur den Seiten-Cache, keine Festplatten-Caches.
jsbillings
@jsbillings - ähm, ja. Fest.
Mattdm
Unglaublich kleines Nitpicking: Ich musste ">>" machen, nicht ">"
Barrycarter
@ Barrycarter: Wirklich? huh!
Mattdm
3
@barrycarter: Sie haben wahrscheinlich -o noclobber in Ihrer Shell gesetzt, sodass Sie eine vorhandene Datei nicht mit> überschreiben können.
jsbillings
1

Wenn ich solche Dinge zeitlich festlege, führe ich sie normalerweise zuerst aus, um den Cache zu füllen. Führen Sie dann den Befehl mit der Zeit aus. Wenn Sie so etwas testen, sollten Sie sich mehr Gedanken über die CPU und die verstrichenen Zeiten machen und weniger über die E / A-Zeit.

In jedem Fall ist es schwierig, genau genaue Zeitangaben zu erhalten. Wenn die Eingabedateien die für Puffer verfügbare Speichergröße überschreiten, werden Sie wahrscheinlich alle Dateien durch den Puffercache durchlaufen. Andernfalls können Sie einfach aus dem Puffercache auf alle Daten zugreifen. Im wirklichen Leben gibt es oft eine Mischung aus gepufferten Daten und von der Festplatte gelesenen Daten.

BillThor
quelle
IRL, ich führe diesen Befehl nur gelegentlich aus, sodass der Inhalt der Dateien * nie zwischengespeichert wird. Ich versuche, den Grep so zu optimieren, dass er in dieser Situation schnell läuft. Wenn sich der Inhalt von Dateien * bereits im Cache befindet, läuft er in
weniger als
2
@ Barrycarter. Wenn die Dateien nicht zwischengespeichert sind und in weniger als einer Sekunde ausgeführt werden, werden Sie wahrscheinlich nicht viele Möglichkeiten zur Optimierung finden. Das Verschieben der Dateien in einen schnelleren Speicher wäre die wahrscheinliche Optimierung.
BillThor