2010-04-24 7 views
6

Ich schrieb mehrere Skripte in Perl und Shell und ich habe die tatsächliche Ausführungszeit verglichen. In allen Fällen war das Perl-Skript mehr als 10 Mal schneller als das Shell-Skript.Ist es möglich, ein Shell-Skript zu schreiben, das schneller ist als das entsprechende Skript in Perl?

Also fragte ich mich, ob es möglich ist, ein Shell-Skript zu schreiben, das schneller ist als das gleiche Skript in Perl? Und warum ist Perl schneller als Shell, obwohl ich die Funktion system im Perl-Skript verwende?

+1

Ich weiß es nicht. Aber es hängt wahrscheinlich vom Skript ab. ein Skript Beispiel zu veröffentlichen ist eine gute Sache. Auch ohne 100% Systemfunktion in Perl zu sein bezieht sich wahrscheinlich auf die C-Bibliothek. – xenoterracide

+0

Fragen Sie nach einem Beispiel für ein Shell-Skript, das schneller ist als ein entsprechendes Perl-Skript? Oder, für jedes Perl-Skript (zumindest jedes Perl-Skript eines bestimmten Formulars), wenn es möglich ist, ein äquivalentes, schnelleres Shell-Skript zu schreiben? – outis

+0

ein Beispiel für ein Shell-Skript, das schneller ist als ein entsprechendes Perl-Skript :) – JohnJohnGa

Antwort

6

Es gibt einige Möglichkeiten, Ihre Shell (zB Bash) schneller ausführen zu lassen.

  1. Versuchen Sie weniger externe Befehle zu verwenden, wenn Bashs Interna die Aufgabe für Sie erledigen können. ZB übermäßige Verwendung von sed, grep, awk und für String/Text Manipulation.
  2. Wenn Sie relativ große Dateien manipulieren, verwenden Sie keine Bashs während der Leseschleife. Verwenden Sie awk. Wenn Sie wirklich BIG-Dateien manipulieren, können Sie mit grep nach den gewünschten Mustern suchen und sie dann an awk übergeben, um sie zu "bearbeiten".Der Suchalgorithmus von grep ist sehr gut und schnell. Wenn Sie nur die Vorderseite oder das Ende der Datei erhalten möchten, verwenden Sie Kopf und Schwanz.
  3. Dateimanipulationswerkzeuge wie sed, cut, grep, wc, usw. alles kann mit einem awk-Skript oder mit Bash Internals wenn nicht kompliziert gemacht werden. Daher können Sie versuchen, die Verwendung dieser Tools, die sich in ihren Funktionen überschneiden, zu reduzieren. Unix-Rohre/Verkettung ist ausgezeichnet, aber mit zu vielen von ihnen, zB command|grep|grep|cut|sed macht Ihren Code langsam. Jedes Rohr ist ein Overhead. Für dieses Beispiel, nur ein awk macht sie alle. command | awk '{do everything here}' Das nächste Werkzeug, das Sie verwenden können, die Perls Geschwindigkeit für bestimmte Aufgaben, z. B. Zeichenfolge Manipulation oder Mathematik, übereinstimmen kann, ist awk. Hier ist ein Spaß Benchmark für this solution. Es gibt rund 9Mio Zahlen in der Datei

Ausgabe

$ head -5 file 
1 
2 
3 
34 
42 
$ wc -l <file 
8999987 

# time perl -nle '$sum += $_ } END { print $sum' file 
290980117 

real 0m13.532s 
user 0m11.454s 
sys  0m0.624s 

$ time awk '{ sum += $1 } END { print sum }' file 
290980117 

real 0m9.271s 
user 0m7.754s 
sys  0m0.415s 

$ time perl -nle '$sum += $_ } END { print $sum' file 
290980117 

real 0m13.158s 
user 0m11.537s 
sys  0m0.586s 

$ time awk '{ sum += $1 } END { print sum }' file 
290980117 

real 0m9.028s 
user 0m7.627s 
sys  0m0.414s 

Für jeden Versuch, awk ist schneller als Perl.

Schließlich, versuchen Sie awk darüber hinaus, was sie als ein Liner tun können.

+0

Danke! genau das suche ich! – JohnJohnGa

1

Nein, ich denke, es ist unmöglich:
bash Befehl wirklich interpeted Sprache ist, aber Perl-Programme zu Bytecode vor der Ausführung kompiliert

+1

Ok - warum Leute Shell Script benutzen? weil sie Perl nicht kennen? :) – JohnJohnGa

+1

Weil es natürlich ist, Kommando-Shell zu verwenden, um Befehle auszuführen :) –

+4

@JohnJohnGa: Weil Person-Zeit mehr Wert ist als CPU-Zeit. Wenn es sogar 5 Minuten länger dauert, eine Perl-Version zu schreiben, die pro Lauf ein paar Sekunden spart, dann ist bash wahrscheinlich die bessere Wahl. Persönlich bin ich ein riesiger Perl-Fan, aber wenn ich nur eine Reihe von Befehlen automatisiere, ohne dass ich eine Flusskontrolle benötige, mache ich das trotzdem mit bash. –

-2

Ja. C-Code wird für dieselbe Sache schneller sein als Perl-Code, daher wird ein Skript, das eine kompilierte ausführbare Datei für eine Menge Arbeit verwendet, schneller sein als ein Perl-Programm, das dasselbe tut.

Natürlich könnte das Perl-Programm neu geschrieben werden, um die ausführbare Datei zu verwenden, in diesem Fall wäre es wahrscheinlich wieder schneller.

+0

Das mag in einigen Fällen wahr sein, aber denken Sie daran, dass Perl C-Code ist. Je nach Job können Sie die hochoptimierte C-Infrastruktur von Perl nicht übertreffen. –

4

Dies könnte gefährlich nahe fallen Lehnstuhl Optimierung, aber hier sind einige Ideen, die Ihre Ergebnisse rationalisieren könnten:

  • fork/exec: fast alles, was nützlich, dass durch einen Shell-Skript ausgeführt wird erfolgt über ein Shell-out, das eine neue Shell startet und einen Befehl wie sed, awk, cat usw. ausführt. In der Regel wird dann mehr als ein Prozess ausgeführt, und Daten werden über Pipes verschoben.

  • Datenstrukturen: Perls Datenstrukturen sind komplexer als Bashs oder Cshs. Dies zwingt normalerweise den Programmierer, mit Datenspeicher erstellt zu werden. Dies kann die Formen annehmen:

    • Verwendung nicht optimal Datenstrukturen (Arrays anstelle von Hashes)
    • speichern Daten in Textform (zB ganze Zahlen als Strings), das jedes Mal neu interpretiert werden muß.
    • Daten in einer Datei speichern und erneut und erneut analysieren.
    • usw.
  • Nicht optimierte Implementierung: einig Shell-Konstrukt nicht mit der Optimierung konzipiert werden könnte, aber mit Benutzerkomfort. Zum Beispiel habe ich Grund zu der Annahme, dass die Bash-Implementierung der Parametererweiterung, insbesondere ${foo//search/replace}, bezüglich der gleichen Operation in sed suboptimal ist. Dies ist normalerweise kein Problem für alltägliche Aufgaben.

1

Bestimmte Shell-Befehle können in manchen Situationen schneller als Perl ausgeführt werden. Ich habe einmal ein einfaches sed-Skript mit dem Äquivalent in Perl verglichen und sed gewonnen. Als die Anforderungen jedoch komplexer wurden, begann die Perl-Version die sed-Version zu schlagen. Die Antwort ist also, es kommt darauf an. Aber aus anderen Gründen (Einfachheit, Wartungsfreundlichkeit, etc.) würde ich mich dazu neigen, Dinge in Perl zu machen, wenn die Anforderungen nicht sehr einfach sind, und ich erwarte, dass sie so bleiben.

2

Okay, ich weiß, dass ich danach frage, indem ich vor zwei Jahren eine Dose Würmer öffne, aber ich bin nicht 100% glücklich mit irgendeiner der Antworten.

Die richtige Antwort ist JA. Aber die meisten neuen Programmierer werden immer noch Perl und Python schreiben und Code schreiben, der sich mächtig bemüht, Aufrufe an externe Executables zu übertragen, weil ihnen das Mentoring oder die Erfahrung fehlt, um wissen zu können, wann welche Tools verwendet werden.

Die Korn Shell (ksh) hat eine schnelle eingebaute Mathematik, und eine voll funktionsfähige und schnelle Regex-Engine, die, keuchend, mit Perl-Regex umgehen kann. Es hat auch assoziative Arrays. Es kann sogar externe .so-Bibliotheken laden. Und es war vor 10 Jahren ein fertiges und ausgereiftes Produkt. Es ist sogar bereits auf Ihrem Mac installiert.