Wird beim Übergeben von Argumenten an Perl-Subroutinen ein Datenkopier-Performance-Treffer verursacht?

8

Ich habe an mehreren Perl-Skripten gearbeitet, die große Dateien mit fester Breite verarbeiten und kleine Teilstrings aus jedem Datensatz extrahieren. Ich hatte mir vorgestellt, dass das Delegieren des Extrahierens von Teilstrings zu Methodenaufrufen wegen des Aufwands beim Kopieren des Datensatzes in das Array @_ teuer wäre. Also habe ich Folgendes ausgeführt, um (a) den direkten Aufruf von substr () zu vergleichen, (b) den Methodenaufruf, der den Datensatz als Zeichenfolge übergibt, und (c) den Methodenaufruf, der den Datensatz als Referenz übergibt.

%Vor%

Wie erwartet, war die direkte Methode die schnellste. Ich war jedoch überrascht, keine Strafe im Zusammenhang mit dem "Kopieren von Daten" zu finden, das ich mir vorgestellt hatte. Selbst wenn ich die Breite des Datensatzes auf ausgefallene Proportionen vergrößerte (zum Beispiel eine Milliarde Zeichen), waren die by-value- und by-reference-Benchmarks grundsätzlich gleich.

Es scheint, dass Perl beim Übergeben von Argumenten an Methoden keine Daten kopiert. Ich denke, das macht bei weiterer Betrachtung der Aliasing-Power von @_ Sinn. Die Argumente werden als Verweis übergeben, nicht als Wert.

Es ist jedoch eine begrenzte Form der by-reference-Weitergabe, da die Referenzen in @_ nicht direkt einer lokalen Variable innerhalb der Subroutine zugewiesen werden können. Solche Zuweisungen führen zum Kopieren von Daten, wie in der zweiten Reihe von Benchmarks veranschaulicht.

Verstehe ich das richtig?

    
FMc 15.06.2009, 21:50
quelle

3 Antworten

8

Ja, Zuweisungen kopieren; Argumente nur übergeben, nicht. Sie können in @_ mit Lexical :: Alias ​​ jedoch auch lexikalische Elemente verwenden. Dieser modifizierte Benchmark zeigt, dass dies ein Drittel so schnell ist wie die Verwendung einer Referenz, aber konsistent, unabhängig von der Länge von $ RECORD:

%Vor%

(Die direkte Verwendung von alias_r anstelle der Alias-Hilfsfunktion ist geringfügig schneller.)

    
ysth 15.06.2009, 23:06
quelle
6

IIRC, in einem Perl 'sub' ist das Array @_ bereits eine Menge von Aliasen (Verweisen) zu den Variablen. Wenn Sie $_[0] ändern, beeinflussen Sie die Variable in der aufrufenden Funktion.

%Vor%

Die Ausgabe ist:

%Vor%     
Jonathan Leffler 15.06.2009 22:52
quelle
0

Wenn Sie den Elementen von @_ aussagekräftige Namen geben möchten, können Sie ihnen mit Daten :: Alias ​​, so

%Vor%

Sie können ähnliche Dinge in Arrays und Hashes einfügen.

%Vor%

In der Tat, Aliasing in einen Hash

%Vor%

ist besonders leistungsfähig, da es benannte Parameter für die Übergabe nach Referenz bereitstellt. Nett.

(Data :: Alias ​​bietet eine Obermenge der Funktionalität von Lexical :: Alias; es ist allgemeiner und leistungsfähiger.)

    
zgpmax 23.01.2012 14:17
quelle

Tags und Links