Ich werde in dieser Antwort nur einige allgemeine Ratschläge geben und keine Benchmarks. Benchmarks sind die einzige Möglichkeit, Fragen zur Leistung zuverlässig zu beantworten. Da Sie jedoch nicht angeben, wie viele Daten Sie bearbeiten und wie oft Sie diesen Vorgang ausführen, gibt es keine Möglichkeit, einen nützlichen Benchmark durchzuführen. Was für 10 Artikel effizienter ist und was für 1000000 Artikel effizienter ist, ist oft nicht dasselbe.
Generell ist das Aufrufen von externen Befehlen teurer als das Ausführen von reinen Shell-Konstrukten, sofern der reine Shell-Code keine Schleife enthält. Andererseits ist eine Shell-Schleife, die über eine große Zeichenfolge oder eine große Anzahl von Zeichenfolgen iteriert, wahrscheinlich langsamer als ein Aufruf eines Spezialwerkzeugs. Beispielsweise kann das Aufrufen einer Schleife cut
in der Praxis sehr langsam sein. Wenn Sie jedoch eine Möglichkeit finden, das Ganze mit einem einzigen cut
Aufruf zu erledigen , ist dies wahrscheinlich schneller als mit der String-Manipulation in der Shell.
Beachten Sie, dass der Grenzwert zwischen den Systemen sehr unterschiedlich sein kann. Dies kann vom Kernel, der Konfiguration des Kernel-Schedulers, dem Dateisystem mit den externen ausführbaren Dateien, dem aktuellen CPU- und Speicherdruck und vielen anderen Faktoren abhängen.
Rufen Sie nicht expr
an, um zu rechnen, wenn Sie sich überhaupt um die Leistung sorgen. Rufen Sie expr
in der Tat gar nicht zum Rechnen auf. Shells verfügen über eine integrierte Arithmetik, die klarer und schneller ist als das Aufrufen expr
.
Sie scheinen bash zu verwenden, da Sie bash-Konstrukte verwenden, die in sh nicht existieren. Warum um alles in der Welt würden Sie kein Array verwenden? Ein Array ist die natürlichste und wahrscheinlich auch die schnellste Lösung. Beachten Sie, dass Array-Indizes bei 0 beginnen.
list=(1 2 3 5 9 8 6 90 84 9 3 2 15 75 55)
for ((count = 0; count += 3; count < ${#list[@]})); do
echo "${list[$count]}"
done
Ihr Skript ist möglicherweise schneller, wenn Sie sh verwenden, wenn Ihr System sh
statt bash dash oder ksh as hat . Wenn Sie sh verwenden, erhalten Sie keine benannten Arrays, aber Sie erhalten immer noch einen der Positionsparameter für das Array, die Sie festlegen können set
. Um auf ein Element an einer Position zuzugreifen, die erst zur Laufzeit bekannt ist, müssen Sie verwenden eval
(achten Sie darauf, dass Sie die Dinge richtig zitieren!).
# List elements must not contain whitespace or ?*\[
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
set $list
count=1
while [ $count -le $# ]; do
eval "value=\${$count}"
echo "$value"
count=$((count+1))
done
Wenn Sie immer nur einmal auf das Array zugreifen möchten und von links nach rechts gehen (einige Werte überspringen), können Sie shift
anstelle von Variablen Indizes verwenden.
# List elements must not contain whitespace or ?*\[
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
set $list
while [ $# -ge 1 ]; do
echo "$1"
shift && shift && shift
done
Welcher Ansatz schneller ist, hängt von der Shell und der Anzahl der Elemente ab.
Eine andere Möglichkeit ist die Verwendung der Zeichenfolgenverarbeitung. Es hat den Vorteil, dass die Positionsparameter nicht verwendet werden, sodass Sie sie für andere Zwecke verwenden können. Bei großen Datenmengen ist dies langsamer, bei kleinen Datenmengen macht sich dies jedoch kaum bemerkbar.
# List elements must be separated by a single space (not arbitrary whitespace)
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
while [ -n "$list" ]; do
echo "${list% *}"
case "$list" in *\ *\ *\ *) :;; *) break;; esac
list="${list#* * * }"
done