Ist $ _ effizienter als eine benannte Variable in Perls Foreach?

8

Ich bin ziemlich neu in Perl und möchte wissen, welche der folgenden Schleifen effizienter ist:

%Vor%

oder

%Vor%

Ich möchte das wissen, um zu wissen, ob die Verwendung von $ _ effizienter ist, weil es in einem Register liegt, weil es häufig verwendet wird oder nicht. Ich habe etwas Code geschrieben, und ich versuche, es aufzuräumen, und ich habe herausgefunden, dass ich die erste Schleife öfter als die zweite benutze.

    
mandel 28.01.2009, 08:58
quelle

8 Antworten

11

Sogar wissen Vorzeitige Optimierung ist die Wurzel allen Übels

%Vor%

aber einige Erwartungen können falsch sein. Der Test ist etwas seltsam, weil die Ausgabe einige seltsame Nebenwirkungen haben kann und die Reihenfolge wichtig sein kann.

%Vor%

Man kann erwarten, dass loop2 schneller als loop1

sein sollte %Vor%

Manchmal beobachtete ich konsistent loop1 ungefähr 15% -20% schneller als loop2 , aber ich kann nicht bestimmen warum.

Ich habe einen generierten Byte-Code für loop1 und loop2 beobachtet und es gibt nur einen Unterschied beim Erstellen von my Variable. Dieser variable Innenraum wird nicht zugeordnet und auch nicht kopiert, somit ist diese Operation sehr günstig. Der Unterschied kommt nur von "$_\n" construct, was nicht billig ist. Diese Schleifen sollten sehr ähnlich sein

%Vor%

aber diese Schleife ist teurer

%Vor%

und auch

%Vor%

ist teurer als

%Vor%     
Hynek -Pichi- Vychodil 28.01.2009, 09:46
quelle
14

Haben Sie in Abschnitten des Codes, die diese Schleifen verwenden, ein Leistungsproblem festgestellt? Wenn nicht, möchten Sie sich für dasjenige entscheiden, das lesbarer und damit wartbarer ist. Ein Geschwindigkeitsunterschied ist wahrscheinlich vernachlässigbar, besonders im Vergleich zu anderen Teilen Ihres Systems. Schreiben Sie immer zuerst die Wartbarkeit, dann das Profil und dann den Code für die Leistung

  

"Vorzeitige Optimierung ist die Wurzel allen Übels" [1]

[1] Knuth, Donald. Strukturierte Programmierung mit gehe zu Aussagen, ACM Journal Computing Surveys, Bd. 6, Nr. 4, Dez. 1974. S.268.

    
tddmonkey 28.01.2009 09:04
quelle
6

Sie können sich dieses Tutorial ansehen, dort gibt es auch ein Kapitel "Benchmark Your Code "könnten Sie diese beiden Möglichkeiten vergleichen.

    
schnaader 28.01.2009 09:03
quelle
6

Benchmark:

%Vor%

Ausgabe:

%Vor%

Ich habe es ein paar Mal mit unterschiedlichen Ergebnissen ausgeführt. Ich denke, es ist sicher zu sagen, dass es keinen großen Unterschied gibt.

    
drby 28.01.2009 09:55
quelle
2
  

Ich interessiere mich mehr für die allgemeine Idee   Verwenden von $ _ statt Drucken ...

Als Randbemerkung ist Perl Best Practices ein guter Ausgangspunkt, wenn Sie lernen möchten, welche Idiome vermieden werden sollen und warum. Ich stimme nicht mit allem überein, was er schreibt, aber er ist in den meisten Fällen genau richtig.

    
Joe Casadonte 28.01.2009 13:56
quelle
2

Wenn Sie die beiden Optionen über " perl -MO=Concise,-terse,-src test.pl " ausführen, ergeben sich diese beiden OpTrees:

for my $n (@num){ ... }

%Vor%

for(@num){ ... }

%Vor%

Ich habe " <=== " hinzugefügt, um die Unterschiede zwischen den beiden zu markieren.

Wenn Sie bemerken, dass es tatsächlich mehr Operationen für die " for(@num){...} " Version gibt.

Also ist die " for(@num){...} " Version wahrscheinlich langsamer als " for my $n (@num){...} " Version.

    
Brad Gilbert 11.08.2009 16:26
quelle
1

Die Verwendung von $_ ist ein Perl-Idiom, das dem erfahrenen Programmierer zeigt, dass der "aktuelle Kontext" verwendet wird. Außerdem verwenden viele Funktionen $_ standardmäßig als Parameter, wodurch der Code prägnanter wird.

Einige argumentieren vielleicht auch, dass "es schwer war zu schreiben, es sollte schwer zu lesen sein".

    
David Schmitt 28.01.2009 09:17
quelle
0

Ich weiß es nicht, aber ... zuerst speichern Sie eine Variablenzuweisung in der zweiten Version der Schleife. Ich kann mir vorstellen, dass $ _ sehr oft verwendet wird und deshalb irgendwie optimiert werden sollte. Man könnte versuchen, es zu profilieren, ein sehr guter Perl-Profiler ist NYTProf 2 geschrieben von Tim Bunce.

Dann ist es wirklich wert, diese kleinen Dinge zu optimieren? Ich denke nicht, dass eine Schleife einen Unterschied machen wird. Ich empfehle Ihnen, den Profiler zu verwenden, um Ihre Leistung zu messen und die wirklichen Engpässe zu identifizieren. Normalerweise befinden sich die Geschwindigkeitsprobleme in den 10% des Codes, der in 90% der Fälle läuft (vielleicht wird es nicht 10-90 sein, aber dies ist das "berühmte" Verhältnis: P).

    
tunnuz 28.01.2009 09:05
quelle

Tags und Links