Verlangsamt die Verwendung von -v (ausführlich) Befehle?

34

In dieser Frage: Wie entferne ich alle Dateien und Unterverzeichnisse in einem Verzeichnis, OHNE das Verzeichnis in bash zu löschen? Es wird gefragt, wie alle Dateien in einem Ordner und nicht der Ordner selbst gelöscht werden sollen.

Matts ausgezeichnete Antwort beinhaltet die Verwendung des Flags -v für den Befehl 'rm'.

rm -rfv dontDeleteMe && mkdir dontDeleteMe

Der Befehl, mit dem ich ging, war der oben. Sicherlich nützlich, aber verlangsamt das Flag -v in 'rm' und / oder im Allgemeinen Aufgaben, die über die Befehlszeile ausgeführt werden?

Ich habe einen Ordner mit .txt-Dateien (ungefähr 100.000 davon), den ich einige Male für mich selbst erstellt, gelöscht und neu erstellt habe. Manchmal mit rm, manchmal im Dateibrowser, und ich habe das Gefühl, dass es noch langsamer ist, den Befehl rm wie oben gezeigt zu verwenden. Hat das -v-Flag etwas damit zu tun?

Eiriks
quelle

Antworten:

37

Ja, das Flag -v verlangsamt den Befehl.

Die meisten, wenn nicht alle Softwareprogramme (oder Befehle) prüfen, ob ein Flag bereitgestellt wird, und führen dann eine Reihe von Code aus, der sich auf das Flag bezieht. Im Falle des Flags -v würden sie wahrscheinlich eine Reihe von Ausgabebefehlen (wie echooder printf) ausführen , die sie lieber ohne das Flag übersprungen hätten.

Dies bedeutet mehr Befehlszyklen für den Prozessor und somit mehr Ausführungszeit.

Es ist besser, wenn Sie das Flag -v nicht verwenden, wenn Sie die Nachrichten nicht lesen / benötigen.

Auf der anderen Seite wäre / sollte die CLI schneller als die GUI sein, vorausgesetzt, Sie geben keine Zeit für die Eingabe der Befehle ein und drücken die EnterTaste.

Aus diesem Blog von Superuser erklärt dieses Bild die Langsamkeit sehr gut

Bildbeschreibung hier eingeben

Für den jeweiligen Befehl sind die Ergebnisse des Zeitbefehls

//with -v
real    0m8.753s
user    0m0.816s
sys     0m2.036s

//without -v
real    0m1.282s
user    0m0.124s
sys     0m1.092s

Dies geschah mit dem Verzeichnis, das 100000 leere Dateien enthielt

registrierter Nutzer
quelle
9
Ich würde nicht von "Echobefehlen" sprechen. Die meisten Programme sind keine Bash-Skripte und rufen daher kein Echo auf. Das Problem besteht darin, dass sie nach stdout (oder stderr ) schreiben, dh , sie führen E / A-Vorgänge aus, die Zeit erfordern (E / A ist teuer), und sie erfordern auch Systemaufrufe (was bedeutet, dass mehr Kontexte geändert werden und somit mehr Cache-Miss etc.).
Bakuriu
23
Das Hauptproblem beim Schreiben an stdout ist das tatsächliche Rendern dieses Inhalts. Wenn Sie stdout in eine Datei umleiten oder /dev/null, ist die Leistung nicht annähernd so beeinträchtigt wie die Anzeige von Text in einem Terminalemulator.
Jacob Krall
Wie Sie aus der Grafik ersehen können, ist der Zeitunterschied vernachlässigbar, wenn Sie von einer Reaktionszeit aus menschlicher Sicht sprechen. Wenn Sie sich also Sorgen um die Effizienz einer Person machen, die den Befehl überwacht, ist dies nicht relevant. Dies ist nur für eine große Anzahl von Dateien oder für viele Wiederholungsläufe relevant, bei denen die Computerzeit kostbar ist (z. B. ein stark ausgelasteter Webserver oder ein alter Computer).
Paddy Landau
Die größte Auswirkung und wahrscheinlich der einzige Fall, in dem es wirklich wichtig wäre, besteht darin, dass Sie den Befehl über SSH auf einem Remotecomputer ausführen. Durch die ausführliche Protokollierung kann leicht ein Datenverkehr von mehreren zehn Megabyte generiert werden, der vom Host an Ihre Konsole übertragen werden müsste. Ich habe einmal eine Beschleunigung in der Größenordnung von 10x festgestellt, nachdem ich die übermäßige Konsolenprotokollierung aus einem Skript entfernt hatte, das ich über SSH ausgeführt habe.
Sergey
5

Warum nicht selbst herausfinden: Zeit nutzen.

$ time rm -rfv dontDeleteMe && mkdir dontDeleteMe
real    0m0.003s
user    0m0.001s
sys     0m0.002s

$ time rm -rf dontDeleteMe && mkdir dontDeleteMe
real    0m0.002s
user    0m0.001s
sys     0m0.001s
Sethmuss
quelle
10
Dies beantwortet die Frage nicht wirklich. Eine Differenz von 1 ms zwischen einzelnen Durchläufen jedes Befehls kann durch viele Faktoren verursacht werden. Auch nicht klar, ob Sie die -vAusgabe ausgelassen haben oder das Verzeichnis leer war.
Ganz zu schweigen davon, dass die Verlangsamung nicht von den extra ausgeführten Anweisungen herrührt, sondern vom Prozess des Schreibens in eine Datei oder auf das Terminal. time' pretty much redirects the output to / dev / null '.
Cole Johnson