Wie kann ich Perl-Subroutinen inline machen?

9

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?

    
Eine Unterroutine (z. B. eine Prozedur oder ein Unterprogramm) ist ein Teil des Codes innerhalb eines größeren Programms, der eine bestimmte Aufgabe ausführt und relativ unabhängig von dem verbleibenden Code sein kann. Die Syntax vieler Programmiersprachen umfasst die Unterstützung für das Erstellen von eigenständigen Unterprogrammen sowie für das Aufrufen und Zurückkehren von ihnen. Sie sind in vielerlei Hinsicht ähnlich wie Funktionen, haben aber normalerweise Nebenwirkungen außerhalb des einfachen "Rückgabewerts", der die Rückgabe bewirkt.
Lazer 02.11.2010, 11:30
quelle

4 Antworten

22

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:

%Vor%

Ausgabe trennen:

%Vor%

Ein log_ok Compiler hat möglicherweise C durch if (log_ok) ersetzt. if ( 0.5 > rand ) macht das nicht.

    
Sinan Ünür 02.11.2010, 11:39
quelle
5

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; .

    
Eugene Yarmash 02.11.2010 11:40
quelle
3

Ich habe keine davon versucht, aber wenn Sie Zeit haben, können Sie es versuchen

  1. Macro
  2. macro
  3. oder sogar 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.

    
Axeman 02.11.2010 13:34
quelle
1

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.

    
Chas. Owens 02.11.2010 22:20
quelle

Tags und Links