2015-04-18 8 views
6

Es scheint mir, gibt es mehrere Möglichkeiten, einen Wert aus einer Bash-Funktion zurückzugeben.Rückgabe von Werten aus Funktionen, wenn Effizienz von Bedeutung ist

Ansatz 1: Verwenden einer "local-global" Variable, die als local in den Aufrufer definiert ist:

func1() { 
    a=10 
} 

parent1() { 
    local a 

    func1 
    a=$(($a + 1)) 
} 

Ansatz 2: Verwendung Befehl Substitution:

func2() { 
    echo 10 
} 

parent2() { 
    a=$(func2) 
    a=$(($a + 1)) 
} 

Wie viel Beschleunigung könnte man von Ansatz 1 gegenüber Ansatz 2 erwarten?

Und ich weiß, dass es keine gute Programmierpraxis ist, globale Variablen wie in Ansatz 1 zu verwenden, aber könnte es irgendwann aus Effizienzgründen gerechtfertigt sein?

+3

Versuchen Sie, Benchmarks auszuführen? – shauryachats

+3

Ja, Ansatz 1 scheint auf meinem Ubuntu-Laptop ca. 33 mal schneller zu sein :) –

+5

Wenn es auf Effizienz ankommt, hört man auf 'bash' (oder irgendeinen Geschmack von' sh') zu verwenden. –

Antwort

4

Die teuerste Operation beim Shell-Scripting ist Forking. Jede Operation, die eine Verzweigung mit sich bringt, z. B. eine Befehlssubstitution, ist 1-3 Größenordnungen langsamer als eine, die dies nicht tut.

Zum Beispiel ist hier eine gerade nach vorne Ansatz für eine Schleife, die eine Reihe von erzeugten Dateien auf Form file-1234 liest und Streifen aus den file- Präfix sed verwenden, insgesamt drei Gabeln erforderlich ist (command Substitution + zweistufiger Pipeline) :

$ time printf "file-%s\n" {1..10000} | 
    while read line; do n=$(echo "$line" | sed -e "s/.*-//"); done 

real 0m46.847s 

Hier ist eine Schleife, die die gleiche Sache mit dem Parameter Expansion der Fall ist, keine Gabeln erforderlich:

$ time printf "file-%s\n" {1..10000} | 
    while read line; do n=${line#*-}; done 

real 0m0.150s 

die forky Version 300x länger dauert.

Daher ist die Antwort auf Ihre Frage ja: Wenn es auf Effizienz ankommt, haben Sie eine solide Rechtfertigung dafür, den Forky-Code herauszufiltern oder zu ersetzen.

Wenn die Anzahl der Verzweigungen in Bezug auf den Eingang konstant ist (oder zu unordentlich ist, um sie konstant zu halten) und der Code immer noch zu langsam ist, sollten Sie ihn in einer schnelleren Sprache schreiben.

1

sicher Ansatz 1 ist viel schneller als Ansatz 2, weil es keinen Interrupt hat (der wiederum mehrere OS Kernel-Kreuzung zu Service benötigt) und hat nur einen Speicherzugriff !!!

Verwandte Themen