Aufzucht und Hege von Shell-Scripts: Script-Overclocking
Script-Overclocking
Hier noch einmal zusammengefasst einige Tuning-Maßnahmen für Eure Scripts. Die meisten habe ich schon an der einen oder anderen Stelle genannt.
- Vermeidet unnötige Aufrufe externer Programme - versucht so viel wie möglich mit Shell-Mitteln zu erledigen. Jeder externe Aufruf ist ein neuer Prozess, das ist eine Ressource, mit der man sparsam umgehen sollte - und es kostet Zeit. Ausnahme: siehe unten.
- Vermeidet Schleifen, wenn Ihr die Aufgaben auch mit spezialisierten Programmen erledigen könnt. Ein awk wird fast immer schneller sein als eine selbstgestrickte Schleife - je größer die Datei, desto signifikanter.
- Vermeidet vor allem unnötige Aufrufe externer Programme in Schleifen! Denkt daran, dass dann je Eingabezeile ein Fork mit neuem Prozess erfolgt!
- Nehmt keinen Vorschlaghammer, um eine Reißzwecke in einen Korken zu drücken. Anders gesagt: Versucht das richtige Werkzeug für die Aufgabe zu finden. Ihr braucht z. B. keinen awk, um die Anzahl der Zeichen einer Variable zu ermitteln - das geht auch viel billiger mit wc.
- Versucht, keinen Useless Use Of cat Award zu kriegen ;-) Konstruktionen wie
cat datei | irgendein_kommando sind fast immer Anwärter auf diesen Preis. Zum Einen können die meisten Unix-/Linux-Programme selbst Dateien lesen (die man ihnen dann per Kommandozeile als Argument übergibt), und wenn nicht, dann kann man sie auch so über die Standardeingabe füttern:
irgendein_kommando <datei - Versucht, unnötige Pipes zu vermeiden. Oft werden sie eingesetzt, um Kommandoausgaben zu filtern, um diese dann
nach irgendwelchen Kriterien testen zu können. Bevor Ihr so etwas macht: Schaut Euch die Manuals der
Kommandos an, vielleicht bieten diese ja die Funktion selbst an, die Ihr mit Pipes erreichen wollt?
if test `grep Muster Datei | wc -l` -gt 0; then ... - das funktioniert, aber wie umständlich ist das doch, nur um festzustellen, ob ein Suchmuster in einer Datei vorhanden ist. Der grep kann nämlich selbst zählen, dazu gibt es die Option -c, schon sieht das Ganze viel besser aus:
if test `grep -c Muster Datei` -gt 0; then .... Es geht noch einfacher, siehe nächster Punkt. - Überlegt Euch, ob Ihr tatsächlich immer einen test braucht. Denkt daran, dass
die meisten Kommandos einen Returncode liefern, den Ihr in if-Abfragen oder Schleifen direkt verwenden könnt.
Im Beispiel aus dem vorigen Abschnitt: Mit der Option -q unterdrückt Ihr die Ausgabe
und der Befehl liefert direkt im Returncode, ob es einen Treffer gibt. Damit vereinfacht sich die obige
Abfrage wie folgt:
if grep -q Muster Datei; then ...
Besser, oder?

