Shell-Loops sind langsam und Bashs sind die langsamsten. Muscheln sind nicht dazu gedacht, schwere Arbeit in Schleifen zu verrichten. Shells sollen einige externe, optimierte Prozesse für Datenstapel starten.
Wie auch immer, ich war neugierig, wie sich Shell-Loops vergleichen lassen, also habe ich einen kleinen Benchmark gemacht:
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
Details:
- CPU: Intel (R) Core (TM) i5-CPU M 430 bei 2,27 GHz
- ksh: version sh (AT & T Research) 93u + 01.08.2012
- bash: GNU bash, Version 4.3.11 (1) -release (x86_64-pc-linux-gnu)
- zsh: zsh 5.2 (x86_64-unknown-linux-gnu)
- Bindestrich: 0.5.7-4ubuntu1
)
Die (abgekürzten) Ergebnisse (Zeit pro Iteration) sind:
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
Aus den Ergebnissen:
Wenn Sie eine etwas schnellere Shell-Schleife wünschen, dann befinden Sie sich [[
in einer erweiterten Shell und haben auch die C-ähnliche for-Schleife , wenn Sie die Syntax und die schnelle Shell-Schleife wünschen. Verwenden Sie dann die C like for-Schleife. Sie können ungefähr 2-mal so schnell sein wie while [
-loops in derselben Shell.
- ksh hat die schnellste
for (
Schleife bei etwa 2,7 us pro Iteration
- dash hat die schnellste
while [
Schleife mit ca. 5,8 µs pro Iteration
C für Schleifen kann 3-4 Dezimalstellen schneller sein. (Ich habe gehört, die Torvalds lieben C).
Die optimierte C for -Schleife ist 56500-mal schneller als die bash- while [
Schleife (die langsamste Shell-Schleife) und 6750-mal schneller als die ksh- for (
Schleife (die schnellste Shell-Schleife).
Auch hier sollte die Langsamkeit von Shells keine Rolle spielen, da das typische Muster bei Shells darin besteht, einige Prozesse von externen, optimierten Programmen auszulagern.
Mit diesem Muster machen es Shells oft einfacher, Skripte mit einer Leistung zu schreiben, die Python-Skripten überlegen ist.
Eine weitere zu berücksichtigende Sache ist die Startzeit.
time python3 -c ' '
dauert 30 bis 40 ms auf meinem PC, während Shells ca. 3 ms dauern. Wenn Sie viele Skripte starten, summiert sich dies schnell und Sie können sehr viel in den zusätzlichen 27-37 ms tun, die Python benötigt, um zu starten. Kleine Skripte können in diesem Zeitraum mehrmals abgearbeitet werden.
(NodeJs ist wahrscheinlich die schlechteste Skriptlaufzeit in dieser Abteilung, da der Start nur etwa 100 ms dauert (auch wenn es einmal gestartet ist, wird es Ihnen schwer fallen, unter den Skriptsprachen einen besseren Interpreten zu finden).