Ich habe mich gefragt, ob es allgemeine Richtlinien für die Optimierung von Bash-Skripten gibt.
Zum Beispiel ist es bequemer , Schleifen als Befehlszeilen zu schreiben, aber ist es auch schneller für das System zu verarbeiten? Beispiel:
for i in a b c; do echo $i; done echo a echo b echo c
Manchmal präsentieren Menschen unterschiedliche Lösungen für das gleiche Problem. Zum Beispiel
sed
,cut
,awk
undecho
sind alle in der Lage Ziffern aus einer Zeichenfolge zu entfernen. Ich habe mich gefragt, ob Sie sagen können, dass je weniger Zifferncode vorhanden ist, desto schneller ist es, wenn Sie Folgendes verwenden:der gleiche Befehl, z
STRING=abc.def echo ${STRING} | sed 's/.def//g' echo ${STRING} | sed '$s/....$//'
verschiedene Befehle, z
STRING=abc.def echo ${STRING} | cut -d . -f 1 echo ${STRING} | sed 's/.def//g'
shell-script
Vincent
quelle
quelle
Antworten:
Shells führen keine Reorganisation des Codes durch, den sie erhalten, sondern werden nur eine Zeile nach der anderen interpretiert (nichts anderes macht in einem Befehlsinterpreter viel Sinn). Ein Großteil der von der Shell aufgewendeten Zeit wird für die lexikalische Analyse / Analyse / das Starten der aufgerufenen Programme aufgewendet.
Für einfache Operationen (wie die, die in den Beispielen am Ende der Frage Zeichenfolgen mischen) wäre ich überrascht, wenn die Zeit zum Laden der Programme keine winzigen Geschwindigkeitsunterschiede überschwemmt.
Die Moral der Geschichte lautet: Wenn Sie wirklich mehr Geschwindigkeit benötigen, sind Sie mit einer (halb) kompilierten Sprache wie Perl oder Python besser dran, die zunächst schneller ausgeführt werden kann und in der Sie viele der direkt genannten Operationen schreiben können Sie müssen keine externen Programme aufrufen und haben die Möglichkeit, externe Programme aufzurufen oder optimierte C-Module (oder was auch immer) aufzurufen, um einen Großteil der Arbeit zu erledigen. Dies ist der Grund, warum in Fedora die "System Administration Sugar" (im Wesentlichen GUIs) in Python geschrieben sind: Kann eine schöne GUI mit nicht allzu viel Aufwand hinzufügen, schnell genug für solche Anwendungen, direkten Zugriff auf Systemaufrufe haben. Wenn das nicht genug Geschwindigkeit ist, greifen Sie zu C ++ oder C.
Aber nicht dorthin gehen, es sei denn , man kann beweisen , dass der Performance - Gewinn wert ist der Verlust an Flexibilität und die Entwicklungszeit. Shell-Skripte sind nicht schlecht zu lesen, aber ich schaudere, wenn ich mich an einige Skripte erinnere, die zur Installation von Ultrix verwendet wurden, die ich einmal zu entschlüsseln versucht habe. Ich gab auf, zu viel "Shell-Skript-Optimierung" wurde angewendet.
quelle
Die erste Regel für die Optimierung lautet: Nicht optimieren . Zuerst testen. Wenn die Tests zeigen, dass Ihr Programm zu langsam ist, suchen Sie nach möglichen Optimierungen.
Der einzige Weg, um sicher zu sein, ist ein Benchmarking für Ihren Anwendungsfall. Es gibt einige allgemeine Regeln, die jedoch nur für typische Datenmengen in typischen Anwendungen gelten.
Einige allgemeine Regeln, die unter bestimmten Umständen zutreffen können oder nicht:
echo $foo
ist langsamer alsecho "$foo"
, da es ohne doppelte Anführungszeichen$foo
in Wörter aufgeteilt wird und jedes Wort als Platzhaltermuster für Dateinamen interpretiert. Noch wichtiger ist, dass Spalt- und Globbing-Verhalten selten erwünscht ist. Denken Sie also daran, Variablen- und Befehlssubstitutionen immer in doppelte Anführungszeichen zu setzen:"$foo"
,"$(foo)"
.cut
oderhead
mit denen emuliert werdensed
, sind jedochsed
langsamer undawk
sogar noch langsamer. Die Verarbeitung von Shell-Zeichenfolgen ist langsam, bei kurzen Zeichenfolgen jedoch besser als das Aufrufen eines externen Programms.Es ist selten, dass die Leistung in Shell-Skripten ein Problem darstellt. Die obige Liste ist nur ein Hinweis. In den meisten Fällen ist es vollkommen in Ordnung, „langsame“ Methoden zu verwenden, da der Unterschied oft nur einen Bruchteil eines Prozent beträgt.
Normalerweise geht es bei einem Shell-Skript darum, etwas schnell zu erledigen. Sie müssen viel von der Optimierung profitieren, um zusätzliche Minuten für das Schreiben des Skripts zu rechtfertigen.
quelle
python
undruby
sind definitiv langsamer zu starten, zumindest auf meinem System,perl
ist so schnell zu starten wiebash
oderksh
. GNU awk ist deutlich langsamer als GNU sed, insbesondere in utf-8-Regionen, aber nicht für alle awks und seds. Das ksh93> dash> pdksh> zsh> bash ist nicht immer so eindeutig. Einige Muscheln sind in einigen Dingen besser als andere, und der Gewinner ist nicht immer der gleiche.Aus allgemeinen Shell-Skriptfehlern von Pádraig Brady gestohlen .
quelle
for i in *; do wc -l "$i">/dev/null; done
besser zu machenfor i in *; do wc -l "$i"; done>/dev/null
.time
cmdwc -l
, überprüfen Sie, ob ich in der Post Ihre Ausgabe aktualisiert habe