Ich lese gerade Code Complete 2 , und einer der erwähnten Punkte bezieht sich auf das Erstellen von Unterprogrammen sogar für Operationen, die zu einfach erscheinen, um ihre eigenen Subroutinen zu haben, und wie das hilfreich sein kann.
Ich weiß, dass ich Inline-Funktionen in C und C ++ mit dem Schlüsselwort inline
verwenden kann. Aber ich habe nie einen Weg gefunden, Inline-Unterprogramme in Perl zu erstellen.
Gibt es eine Möglichkeit, dem Perl-Interpreter mitzuteilen, dass die Unterroutinenaufrufe (oder warum nicht) inline eingebunden werden sollen?
Konstante Unterroutinen, d. h. Unterroutinen mit einem leeren Prototyp und einem konstanten Rückgabewert, sind inline. So definiert das konstante Pragma Konstanten:
%Vor%wäre inline, wenn es vor der ersten Verwendung angezeigt wird.
Ansonsten erlaubt es Perl, dass Unterprogramme zur Laufzeit dynamisch neu definiert werden, daher ist Inlining nicht geeignet.
Für Unterprogramme, die bei denselben Eingaben immer den gleichen Wert zurückgeben, können Sie Memo verwenden.
Kapitel 13 von Programming Perl enthält einige Informationen zu den von% durchgeführten Optimierungsschritten. co_de%.
Dies wird als konstante Faltung bezeichnet. Konstantes Falten ist nicht auf einfache Fälle beschränkt, wie z. B. das Umwandeln von 2 ** 10 in 1024 zur Kompilierungszeit. Es löst auch Funktionsaufrufe auf - sowohl eingebaute als auch von Benutzern deklarierte Unterroutinen, die die Kriterien aus dem Abschnitt "Inlining Constant Functions" in Kapitel 6, Subroutinen, erfüllen. In Anspielung auf die berüchtigten Kenntnisse der FORTRAN-Compiler über ihre eigenen Funktionen weiß Perl auch, welche seiner eingebauten Funktionen während der Kompilierung aufgerufen werden müssen. Wenn Sie also versuchen, das Protokoll 0.0 oder das Quadrat einer negativen Konstante zu verwenden, entsteht ein Kompilierungsfehler und kein Laufzeitfehler, und der Interpreter wird überhaupt nicht ausgeführt.
Siehe auch perldoc perlguts .
Sie können den Effekt des ständigen Faltens selbst sehen:
%Vor% %Vor%Ausgabe:
%Vor% Hier führte das konstante Falten zum Ersetzen des perl
Blocks durch einen if
Block, weil der Compiler wusste, dass do
immer einen wahren Wert zurückgeben würde. Auf der anderen Seite mit:
Ausgabe trennen:
%Vor% Ein log_ok
Compiler hat möglicherweise C
durch if (log_ok)
ersetzt. if ( 0.5 > rand )
macht das nicht.
Perl erlaubt nur inline konstante Funktionen. Von perldoc perlsub :
Funktionen mit einem Prototyp von () sind potenzielle Kandidaten für Inlining. Ob das Ergebnis nach der Optimierung und konstante Faltung ist entweder eine Konstante oder ein lexikalisch begrenzter Skalar, der keine anderen Referenzen, dann wird es sein anstelle von Funktionsaufrufen verwendet ohne & amp; .
Ich habe keine davon versucht, aber wenn Sie Zeit haben, können Sie es versuchen
Macro
macro
Filter::Macro
Sie sind alle Quellfilter, daher müssen Sie Ihre Rendite auf die Leistung überprüfen. Die letzte hat tatsächlich eine Überprüfung auf cpanratings . (Ignoriere Dan Dascalescus Versuch, den Perl-Modul "Luftraum" zu regulieren.)
- Tatsächlich verwendet der letzte Filter::Macro
Filter::Simple::Compile
(das wiederum verwendet Module::Compile
), um die Routinen zu kompilieren, damit über den anderen Quellfiltermethoden ausgeführt werden kann. Aber die Standardvorbehalte auf Quellfilter anwenden.
Geschwindigkeit sollte beim Schreiben von Perl wahrscheinlich keine Rolle spielen. Mach weiter und mach die Dinge funktionstüchtig. Wenn das Profiling später zeigt, dass du viel Zeit in einer einfachen Funktion verbringst, weil du es oft aufgerufen hast, dann inline diese Funktion selbst.
Tags und Links perl inline subroutine