Verlangsamt die ausführende Ausführung von Befehlen diese?


37

Ich habe festgestellt, dass ich die -vFlagge immer seltener für viele Anwendungen benutze (insbesondere für Triviales wie tarund cp). Wenn ich jedoch eine große Datei entpackte, würde dies länger dauern, als wenn ich das -vFlag 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?


Haben Sie versucht zu Zeit zB tar xvf file.tar > /dev/nullvs. tar xf file.tar? Die Umleitung zu /dev/nullsollte Ihr Terminal davon abhalten.
Benjamin Bannier

3
Beachten Sie auch, dass stdoutund stderrsind Line-gepuffert - was bedeutet , dass Puffer Auffüllen dauert nicht so lange - es ist die blockierenden printfAnrufe (und durch Erweiterung Terminal - Ausgabe), das dauert ewig.
new123456 20.07.11

1
Wenn Sie über Windows-Befehle gesprochen hätten, würde ich sicherlich sagen, dass es wahr ist :)
Kokbira

Bei CPU-intensiven Aufgaben kann es je nach E / A-Aufwand zu einer schrecklichen Leistungsverschlechterung kommen.
Benutzer

Antworten:


31

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 timeProgramm 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.


Die meisten Programmierer lernen dies ziemlich schnell (Borland C in DOS);)
Dragos

Wenn das Konsolenfenster ausgeblendet (oder teilweise abgedeckt) ist, wirkt es sich natürlich nicht annähernd so stark aus wie bei sichtbarer Konsole. Öffnen Sie eine Eingabeaufforderung und führen Sie a aus 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.
Synetech

1
@Syn Wir reden hier über Linux.
Majenko

1
@Matt es ist immer noch ein gültiger Kommentar. Bitte sei respektvoll.
nhinkle

@ Matt, doh! Ich habe es nicht bemerkt. (Vielleicht habe ich mich vom DOS-Kommentar abgelenkt fühlen.) Linux ist auf jeden Fall ganz anders, aber ich frage mich, ob dies auch so ist (sichtbare Konsolen mit viel langsamerem Scrollen von Text).
Synetech

8

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.


6

Die Verwendung yesals 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 yesfür 5 Sekunden, in einem Fall das Drucken der Ausgabe auf dem Terminal und in eine Datei (mit dem Speichern tee), im anderen Fall das gleiche zu tun , außer Umleitung stdoutzu /dev/null:

  1. yes | tee yeslog_term & sleep 5 && killall yes && wc -l yeslog_term
  2. 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 yesin Verbindung mit teehier 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 yesdas Terminal während der Ausgabe auf einem Terminal ca. 100% CPU und yesnur ca. 37% yesnutzt , während es ohne Ausgabe auf einem Terminal die vollen 100% nutzt (Dies ist Core-Maschine, yeskönnte also mehr CPU verbrauchen, wenn dies möglich wäre, es sei denn, das Terminal verlangsamt dies.


5

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.


3
-1 Das ist einfach nicht wahr. printf()ist wahnsinnig teuer
Thomas Bonini

1
Was ich sagte, war wahr. Was Sie versuchen, es so aussehen zu lassen, wie ich sagte, ist jedoch etwas ganz anderes. Ich sage nichts über die Effizienz eines bestimmten Stdlib-Drucks. Ich sage, Programme sollten so viel Arbeit leisten, dass der Zeitaufwand für das Drucken vernachlässigbar gering ist. Jetzt geh und trolle jemand anderen.
Slarpspark

@slarpspark: Es ist nicht unbedingt zu vernachlässigen, auch wenn wir printf () aus der Gleichung nehmen, der Bytestrom muss immer noch bash durchlaufen, dann den Terminalemulator, dann musste der Terminalemulator den Text in den Bildschirm rendern Nach dem Parsen der Escape-Zeichen ist das Rendern von Text nicht billig, wenn es mit der Geschwindigkeit ausgeführt wird, mit der einige ausführliche Befehle ausgeführt werden können. und es wäre besonders teuer, wenn das Programm den Ausgabepuffer in jeder Zeile leeren würde, da dies bedeutet, dass der Kontext wechselt. Ich habe beim Schreiben von Python-Skripten oft die Erfahrung gemacht, dass das Entfernen von Abzügen in engen Schleifen manchmal 10s zu 1s führen kann.
Lie Ryan

Was ist mit einem Befehl, der über SSH ausgeführt wird, und selbst wenn die CPU-Zeit minimal ist, ist dies sicherlich von Bedeutung, wenn Sie die Netzwerklatenz einführen?
ec2011

3

Ein 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 :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.