Ich habe festgestellt, dass ich die -v
Flagge immer seltener für viele Anwendungen benutze (insbesondere für Triviales wie tar
und cp
). Wenn ich jedoch eine große Datei entpackte, würde dies länger dauern, als wenn ich das -v
Flag nicht verwendet hätte .
Ich nehme an, das liegt daran, dass das Terminal den Text verarbeiten muss und ich den eventuell vorhandenen Puffer auffülle. Aber meine Frage ist: Läuft die Anwendung dadurch tatsächlich langsamer oder wird sie in der gleichen Zeit ausgeführt, und ich sehe, dass das Terminal versucht, den Rückstand aufzuholen?
tar xvf file.tar > /dev/null
vs.tar xf file.tar
? Die Umleitung zu/dev/null
sollte Ihr Terminal davon abhalten.stdout
undstderr
sind Line-gepuffert - was bedeutet , dass Puffer Auffüllen dauert nicht so lange - es ist die blockierendenprintf
Anrufe (und durch Erweiterung Terminal - Ausgabe), das dauert ewig.Antworten:
Ja, wenn Sie verbose ausführen, werden Ihre Anwendungen langsamer.
Wie viel hängt von der Anwendung ab.
Jeder Ausdruck auf dem Terminal erfordert zusätzliche Verarbeitungszeit. Im Fall der Verwendung von printf () oder einer seiner Schwestern ist dies eine ziemlich hohe Menge an vergeudeter Verarbeitung.
Auch das Terminal muss mit diesen Daten umgehen. Zwischen der Anwendung und dem Terminal befindet sich eine begrenzte Menge an Pufferplatz, und der E / A-Kanal wird blockiert, bis genügend Speicherplatz im Puffer vorhanden ist, um die Daten tatsächlich auszugeben. Die Anwendung kann im Allgemeinen nicht fortgesetzt werden, während diese Blockierung stattfindet. 1
Das Anzeigen des Debugging-Texts auf dem Terminal beansprucht außerdem Verarbeitungszyklen. Dies ist wiederum abhängig von der Anwendung (der Menge an Debugging), dem Terminalprogramm (verwendete Schriftarten, Effekte usw.) und sogar dem verwendeten X-Windows-Treiber (Hardwarebeschleunigung usw.).
Mit dem
time
Programm kann ziemlich genau bestimmt werden, wie lange ein Befehl ausgeführt wurde. Wenn Sie dasselbe Programm zweimal im Laufe der Zeit ausführen, einmal mit und einmal ohne Fehlerbehebung, können Sie sehen, welchen Unterschied es macht. Ich würde vorschlagen, den Befehl vor dem Ausführen der Tests einmal auszuführen, um sicherzustellen, dass das Caching für beide Testläufe des Befehls identisch ist. Sie möchten die Ergebnisse nicht verzerren, indem Sie den zweiten Durchlauf viel schneller ausführen, da die meisten Daten jetzt beim ersten Durchlauf zwischengespeichert wurden, oder?1 Bei einer Multithread-Anwendung wird nur der Thread blockiert, der die Debugging-Ausgabe ausführt.
quelle
dir c:\/s/a
. Sie können die Geschwindigkeitsänderung sehen, wenn sie vollständig sichtbar und teilweise verdeckt ist. Sie können nicht sehen, dass es sich beschleunigt, wenn es minimiert wird, aber es ist definitiv schneller, obwohl Sie einen Neustart durchführen müssten, wenn Sie testen möchten, um das Caching zu umgehen, was dazu führen würde, dass es sowieso schneller wird, da dies nicht der Fall wäre um auf die Festplatte zuzugreifen.Dies hängt von der Anwendung ab, die Sie ausführen. Im Allgemeinen können wir jedoch sagen, dass ausführliche Informationen die meisten gängigen Linux-Anwendungen verlangsamen, da sie ihre Aktionen zwischen stdout und I / O- oder Prozessorgrenzen synchronisieren müssen.
quelle
Die Verwendung
yes
als Testfall auf OS X 10.7, so scheint es , es in der Tat wichtig ist, wenn Sie eine Menge Ausgabe an das Terminal drucken, wie man erwarten würde.Quantifizieren diese ein wenig weiter, lief ich
yes
für 5 Sekunden, in einem Fall das Drucken der Ausgabe auf dem Terminal und in eine Datei (mit dem Speicherntee
), im anderen Fall das gleiche zu tun , außer Umleitungstdout
zu/dev/null
:yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
yes | tee yeslog_noterm > /dev/null & sleep 5 && killall yes && wc -l yeslog_noterm
Fall 1. ergibt 2371584 Zeilen und Fall 2. ergibt 136421376 Zeilen oder 57-mal mehr. Die "Leistung" von
yes
(gemessen an der Anzahl der Zeilen, die pro Zeiteinheit gedruckt werden) ist in diesem Fall also 57-mal langsamer .Eine Randnotiz hier ist, dass ich
yes
in Verbindung mittee
hier verwendet habe, was die Ergebnisse geringfügig beeinflussen könnte, ich denke jedoch, dass die Ergebnisse immer noch gültig sind.Ein weiterer Hinweis darauf, dass das Programm verlangsamt wird, ist, dass
yes
das Terminal während der Ausgabe auf einem Terminal ca. 100% CPU undyes
nur ca. 37%yes
nutzt , während es ohne Ausgabe auf einem Terminal die vollen 100% nutzt (Dies ist Core-Maschine,yes
könnte also mehr CPU verbrauchen, wenn dies möglich wäre, es sei denn, das Terminal verlangsamt dies.quelle
Es ist einfach zu bejahen, es wird die Anwendung verlangsamen. Eine viel zutreffendere Antwort ist jedoch, dass es in 99% der Fälle keine Rolle spielt.
Wenn Ihre Anwendung irgendeine Arbeit ausführt, die tatsächlich etwas CPU-Leistung erfordert, liegt die Wahrscheinlichkeit, dass zusätzliche Textzeilen auf den Bildschirm gedruckt werden, die einen Unterschied bewirken, nahe bei 0%.
In der Tat können Sie sich leicht ein eigenes Urteil bilden: Wenn die Anwendung eine immense Textwand ausspuckt, kann dies Sie tatsächlich ein wenig kosten. Vielleicht.
quelle
printf()
ist wahnsinnig teuerEin ausführlicher Code wird normalerweise mit einer if-Anweisung ausgewertet. Jedes Mal, wenn die Steuerung an eine Anzeigefunktion übergeben wird, kann der Kontext umgeschaltet werden, und es können mehr Interrupts auftreten.
Aber es kommt darauf an, dass der Unterschied vernachlässigbar ist, wenn Sie ausführlichen Code als separaten Thread verwenden, der von Zeit zu Zeit nur den Fertigstellungsstatus überprüft.
Diese Frage kann sehr vom Beitrag der erfahrenen Programmierer von stackoverflow profitieren. Ich schlage vor, umzuziehen :)
quelle