Benchmarking-Bash-Befehle mit Zeit und Abschlag

549
Hashim

Ich habe ein Verzeichnis, das mehr als 80 GB an einfachen Textdatei-Datenbanken enthält, von denen ich erwartet, dass sie häufig durch grep gehen müssen. Aus diesem Grund versuche ich, einige Tests zu erstellen, um GNU grepmit der meiner Meinung nach schnellsten Alternative zu vergleichen - ripgrep -, um festzustellen, welche mit meiner am schnellsten funktioniert Daten.

Der erste Test besteht aus drei forSchleifen, die ausgeführt werden grep, rgund grep -Fauf einer 15GB - Textdatei und der zweite Test wird eine Reihe von den gleichen Befehlen ausführen auf der Gesamtheit der Daten. Nach ein paar Tagen ständigem Radfahren zwischen dem Einsatz meines eigenen begrenzten bashWissens, dem Nachschlagen von Lösungen und Fehlern bei der Fehlersuche, habe ich es geschafft, Folgendes für den ersten Test zusammen zu hacken (der auch für den zweiten Test verwendet wird):

for i in ; \ do (time LC_ALL=C grep -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 |  tee -a "../grep Test 1.txt"; \ done; \ for i in ; \ do (time rg -i "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 | tee -a "../ripgrep Test 1.txt"; \ done; for i in ; \ do (time LC_ALL=C grep -Fi "ajndoandajskaskaksnaodnasnakdnaosnaond" "15gbfile.txt") 2>&1 | tee -a "../grep -F Test 1.txt"; \ done; 

Es ist hässlich, aber es funktioniert genauso wie beabsichtigt. Es führt alle drei forSchleifen nacheinander aus, wobei jeweils 15 Mal nach einer langen Zeichenfolge gesucht wird, die nie gefunden wird, und dann die Ausgabe timefür grepbeide in beide STDOUTund eine Datei gedruckt wird .

Aus Benchmarking-Gründen möchte ich jedoch sicherstellen, dass der Code geeignet ist, die (relativen) Geschwindigkeiten meiner Anwendungsfälle auf einem POSIX / bash / Cygwin-System genau zu testen, und dass es nichts gibt, was ich übersehen würde Die Ergebnisse bekomme ich. Insbesondere Dinge wie Caching, Festplatten-E / A und andere Aspekte, die mir nicht bekannt sind. Ich würde mich auch über Vorschläge freuen, die dazu führen würden, dass es robuster wirkt und weniger hässlich wirkt.

1
Was ist mit dem Caching? Ein Teil der 15-GB-Datei würde sich nach der ersten Schleife in der zweiten Schleife im Speicher befinden, wodurch die zweite möglicherweise künstlich schneller wird. Seien Sie interessant, mit und ohne zu laufen, um zu sehen, welchen Unterschied es macht: https://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/ Paul vor 6 Jahren 1
@Paul Das ist der Hauptgrund, warum ich jeweils 15 Mal "grep" lief, in der Überzeugung, dass das Zwischenspeichern nur einen Zeitunterschied zu den ersten ein oder zwei Läufen des Spiels ausmachen würde. Ist das nicht der Fall? Hashim vor 6 Jahren 0
Dieser Benchmark stimmt definitiv nicht mit dem Problem überein, das Sie zu lösen versuchen. Erstens, wenn Sie 80 GB an Dateien suchen, ist es wahrscheinlich, dass ein großer Teil davon von der Festplatte gelesen werden muss. grep und ripgrep werden dies mit etwa der gleichen Geschwindigkeit tun, da beide wahrscheinlich durch einfache E / A-Geschwindigkeit einen Engpass darstellen. Zweitens crawlt ripgrep standardmäßig ein Verzeichnis parallel, während 'grep -r' dies nicht tut. Dieses _could_ führt zu besseren Suchzeiten, die nicht durch das Durchsuchen einer einzelnen Datei erfasst werden. BurntSushi5 vor 6 Jahren 2
@ BurntSushi5 Vielleicht lohnt es sich zu sagen, dass Sie der Entwickler von `ripgrep` sind, aber ich verstehe Ihren Standpunkt. Wie in dem Post erwähnt, ist dies einfach der erste Test, den ich durchführen möchte. Der zweite Test besteht darin, die Befehle für das gesamte Verzeichnis auszuführen. Ich wollte hier hauptsächlich sicherstellen, dass der Code selbst keine Fehler aufweist, sodass er auch für den zweiten Test erneut verwendet werden kann. Hashim vor 6 Jahren 0
@ Paul Ein Gedanke, der mir gerade in den Sinn gekommen ist, gelten alle diese Aspekte für Cygwin, die auf einem Windows 7-System ausgeführt werden? Ich bin nicht sicher, ob Cygwin Bash Caching durchführt. Hashim vor 6 Jahren 0
@Hashim Ich weiß es nicht genau, aber ich bezweifle es. Zu Ihrer anderen Frage wird die Datei am Eingang der ersten Schleife nicht zwischengespeichert, während sie am Anfang der Ripgrep-Schleife möglicherweise zwischengespeichert wird. Das gibt der Ripgrep-Schleife einen Vorteil. Paul vor 6 Jahren 0
@Paul Würde jeder Befehl nacheinander in einer einzigen for-Schleife ausgeführt, wie dies in seiner Antwort darauf hindeutet, dieses Problem zu lösen? Etwas wie dieses: https://pastebin.com/L2ua3ihP? Hashim vor 6 Jahren 0
@Hashim Sorry, aber ich werde nicht sagen, dass ich der Autor von Ripgrep jedes Mal bin, wenn ich über Ripgrep im Internet sprechen möchte. Ich werde es offen legen, wenn ich denke, dass es klug ist, aber ansonsten denke ich, dass es leicht ist, herauszufinden, ob sich die Leute dafür interessieren. Cygwin ist nicht die Sache, die Caching tun wird; das OS wird. Wenn Sie einen grundlegenden "ersten" Test durchführen möchten, wählen Sie eine kleinere Datei aus oder suchen Sie nach einem Weg, um sicherzustellen, dass sich Ihre 15 GB-Datei immer im Speicher befindet (indem Sie sie auf eine Ramdisk stecken). Andernfalls wird Ihr Test nur für die Caching-Strategie des Betriebssystems empfänglich sein. BurntSushi5 vor 6 Jahren 0
@Hashim Wenn Sie eine differenziertere Methode zum Benchmarking von Befehlszeilentools suchen, sollten Sie Hyperfine in Betracht ziehen: https://github.com/sharkdp/hyperfine --- Andernfalls ist die Einrichtung eines ersten Basistests für mich nicht eindeutig nützlich Wenn Ihr zweiter Benchmark eine völlig andere Art der Suche mit anderem Verhalten ausübt. Wenn Sie für den Fall, dass sich alles im Speicher befindet, und für den Fall, dass Sie von der Festplatte lesen müssen, ein Benchmarking durchführen muss, sind zwei unterschiedliche Strategien erforderlich, die wiederum davon abhängen, was Sie messen möchten. BurntSushi5 vor 6 Jahren 0
@ BurntSushi5 Zu deinem ersten Kommentar - das Ziel besteht also nicht darin, das Caching zu eliminieren, sondern sicherzustellen, dass es während der Tests konsistent ist. Hashim vor 6 Jahren 0
@Hashim Im Idealfall sicher. Aber ich sehe nicht, wie das möglich ist, da es eine transparente Sache ist, die vom Betriebssystem gehandhabt wird. In der Praxis haben Sie zwei Möglichkeiten: Entweder stellen Sie sicher, dass sich alles im Cache befindet oder dass nichts im Cache ist. Ersteres kann im Allgemeinen durch ein ausreichendes Aufwärmen oder durch Auflegen der Eingabe auf eine Ramdisk erreicht werden, * vorausgesetzt, * Ihre Eingabe passt in den Speicher. (Ist das? 15 GB werden wahrscheinlich nicht vollständig auf einem System mit 16 GB Arbeitsspeicher zwischengespeichert.) Letzteres ist normalerweise möglich, obwohl ich nur unter Linux weiß, wie das geht: `sudo sh -c 'echo 3> / proc / sys / vm / drop_caches'`. BurntSushi5 vor 6 Jahren 0
@ BurntSushi5 Würde mit einer ausreichend großen Datei sichergestellt, dass sich nichts im Cache befindet? Sagen Sie eine 30 GB-Datei auf einem System mit 16 GB Arbeitsspeicher? Oder würde die Datei einfach in Teilen zwischengespeichert werden? Hashim vor 6 Jahren 0
Ich glaube, ich habe Ihnen die einzigen beiden Optionen gegeben, von denen ich weiß, dass sie für ein seriöses und reproduzierbares Benchmarking zuverlässig genug sind. Ich sehe keinen Grund anzunehmen, dass eine Datei entweder vollständig zwischengespeichert oder vollständig nicht zwischengespeichert ist. BurntSushi5 vor 6 Jahren 1

1 Antwort auf die Frage

1
xenoid

IMHO, den Sie testen, ist voreingenommen, da Sie die drei Befehle zu sehr unterschiedlichen Zeiten ausführen. Sie sollten über eine einzige Schleife verfügen, die nacheinander die Befehle grep, rgrep und grep -F ausführt. Wenn Sie diese Reihenfolge zufällig festlegen können, wäre dies sogar noch besser.

Auf der anderen Seite ist Leistung nicht alles, und ich würde eine wesentlich bessere Leistung benötigen, um zu einem bestimmten Befehl zu wechseln, und dieser weitaus bessere Darsteller würde sogar bei voreingenommenen Benchmarks zeigen.

Außerdem dauert der "tee" -Befehl wahrscheinlich mehr Zeit als der "grep" matzeri vor 6 Jahren 0
Ich sehe Ihren Punkt im ersten Absatz, aber welche Auswirkungen hätte dies auf die Beseitigung der Caching-Vorteile? Meine ursprüngliche Absicht, die gleichen Befehle nacheinander auszuführen, bestand in der Überzeugung, dass die Zwischenspeicherung für die ersten Instanzen des Befehls gilt und diese ersten Läufe daher ignoriert werden könnten. Gelten Linux-Konzepte für Caching / Disk IO auch für `bash`, die in Cygwin zusätzlich zu Windows 7 ausgeführt werden? Hashim vor 6 Jahren 0
Das Zwischenspeichern von Dateien ist kein "Linux-Konzept". BurntSushi5 vor 6 Jahren 0
@ BurntSushi5 Ich habe nie behauptet, dass es das war, aber die beiden Betriebssysteme haben wahrscheinlich unterschiedliche Implementierungen / Ansätze, und ich habe gefragt, ob "bash" in Cygwin Linux oder Windows verwendet. Hashim vor 6 Jahren 0