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.
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
aber diese Schleife ist teurer
%Vor%und auch
%Vor%ist teurer als
%Vor%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.
Sie können sich dieses Tutorial ansehen, dort gibt es auch ein Kapitel "Benchmark Your Code "könnten Sie diese beiden Möglichkeiten vergleichen.
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.
Wenn Sie die beiden Optionen über " perl -MO=Concise,-terse,-src test.pl
" ausführen, ergeben sich diese beiden OpTrees:
for my $n (@num){ ... }
for(@num){ ... }
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.
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".
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).
Tags und Links perl loops performance variables