Ich habe mich gefragt, wie man ein Skript am schnellsten ausführt. Ich habe gelesen, dass es einen Unterschied in der Geschwindigkeit gibt, wenn man die Ausgabe des Skripts auf dem Terminal anzeigt, in eine Datei umleitet oder vielleicht /dev/null
.
Also, wenn die Ausgabe nicht wichtig ist, was ist der schnellste Weg, um das Skript schneller zum Laufen zu bringen, auch wenn es minimiert ist.
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Antworten:
Terminals sind heutzutage langsamer als früher, vor allem, weil Grafikkarten sich nicht mehr um die 2D-Beschleunigung kümmern. In der Tat kann das Drucken auf einem Terminal ein Skript verlangsamen, insbesondere wenn es sich um einen Bildlauf handelt.
Folglich
./script.sh
ist langsamer als./script.sh >script.log
, was wiederum langsamer als ist/script.sh >/dev/null
, weil letztere weniger Arbeit erfordern. Ob dies jedoch für einen praktischen Zweck ausreicht, hängt davon ab, wie viel Ausgabe Ihr Skript erzeugt und wie schnell. Wenn Ihr Skript 3 Zeilen schreibt und beendet oder alle paar Stunden 3 Seiten druckt, müssen Sie sich wahrscheinlich nicht um Umleitungen kümmern.Edit: Einige schnelle (und völlig kaputte) Benchmarks:
In einer Linux-Konsole, 240x75:
In einer
xterm
Auflösung von 260 x 78:Weiterleiten an eine Datei auf einer Samsung SSD 850 PRO 512 GB-Festplatte:
Weiterleiten an
/dev/null
:quelle
timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"
druckt in einer Sekunde mehr als 100000 Zeilen auf meinem MBP.)xterm
s auf HP Apollo vor 30 Jahren verwendet, um im Vergleich zuxterms
auf HP-UX vor 20 Jahren zu kriechen . Eine Linux-Konsole mit einer Matrox-Grafikkarte von vor 15 Jahren war jedoch langsamer als dieselbe Linux-Konsole mit einer S3-Karte von vor 20 Jahren. Und eine Linux-Konsole mit hochauflösendem Bildspeicher auf einer modernen Karte ist einfach unbrauchbar. :)Ich hätte der Antwort von Satō Katsura instinktiv zugestimmt. es macht Sinn. Es ist jedoch leicht genug zu testen.
Ich habe getestet, wie man eine Million Zeilen auf den Bildschirm schreibt, an eine Datei anfügt und zu dieser umleitet
/dev/null
. Ich habe diese nacheinander getestet und dann fünf Wiederholungen durchgeführt. Dies sind die Befehle, die ich verwendet habe.Ich habe dann die Gesamtzeiten unten eingetragen.
Wie Sie sehen, stimmten die Vermutungen von Satō Katsura. Gemäß der Antwort von Satō Katsura bezweifle ich auch, dass der limitierende Faktor die Ausgabe ist, so dass es unwahrscheinlich ist, dass die Wahl der Ausgabe einen wesentlichen Einfluss auf die Gesamtgeschwindigkeit des Skripts hat.
FWIW, meine ursprüngliche Antwort hatte einen anderen Code, bei dem die Datei angehängt und in der Schleife
/dev/null
umgeleitet wurde .Wie John Kugelman in den Kommentaren ausführt, bedeutet dies einen erheblichen Mehraufwand. Da die Frage steht, ist dies nicht wirklich der richtige Weg , um es zu testen, aber ich werde es hier lassen , wie es deutlich die Kosten für die Wiedereröffnung eine Datei wiederholt aus zeigt im Skript selbst.
In diesem Fall werden die Ergebnisse umgekehrt.
quelle
xterm
, was wiederum ~ 3-mal langsamer ist als/dev/null
.Eine andere Möglichkeit, ein Skript zu beschleunigen, ist die Verwendung eines schnelleren Shell-Interpreters. Vergleichen Sie die Geschwindigkeiten einer POSIX- Busy-Schleife, die unter
bash
v4.4 ,ksh
v93u + 20120801 unddash
v0.5.8 ausgeführt wird .bash
:Ausgabe:
ksh
:Ausgabe:
dash
:Ausgabe:
Eine Teilmenge von Befehlen in
bash
undksh
ist abwärtskompatibel zu allen Befehlen indash
. Einbash
Skript, das nur Befehle in dieser Teilmenge verwendet, sollte mit funktionierendash
.Einige
bash
Skripte, die neue Funktionen verwenden, können in einen anderen Interpreter konvertiert werden. Wenn sich dasbash
Skript stark auf neuere Funktionen stützt, lohnt sich die Mühe möglicherweise nicht. Einige neuebash
Funktionen sind Verbesserungen, die einfacher zu programmieren und effizienter sind (obwohlbash
sie im Allgemeinen langsamer sind), sodass dasdash
Äquivalent (das möglicherweise ausgeführt werden muss) mehrere andere Befehle), wäre langsamer.Führen Sie im Zweifelsfall einen Test durch ...
quelle