Selfloader bzw. Autoloader bei require"ten Modulen
Selfloader bzw. Autoloader bei require"ten Modulen
am 18.11.2006 18:38:21 von ch_pingel
Hallo,
wie verwendet man SelfLoader bzw. Autoloader, wenn man im Script Module
require't hat ?
Mal nen Test-Script:
#!/usr/bin/perl
use SelfLoader;
require 'testlib.pl';
print "Skript ist kompiliert und läuft.\n";
# Aufruf der Funktionen
&foo();
&bar();
&foo();
&test();
__DATA__
sub foo
{
BEGIN { print "foo wird kompiliert\n" }
print "Foo\n";
&test();
}
sub bar
{
BEGIN { print "bar wird kompiliert\n" }
print "Bar\n";
}
__END__
testlib.pl:
sub test
{
BEGIN { print "test wird kompiliert\n" }
print "Test\n";
}
1;
Wie muß ich jetzt das Modul ändern, damit jene Methoden auch nur
compiliert werden, wenn sie benötigt werden ? Die Methoden mit in das
Hauptscript zu kopieren, ist keine Option, da ich diese in mehreren
Scripten verwenden möchte.
Ich hatte für den Selfloader versucht, die require'te Datei auch in
ein DATA-END block zu legen, was allerdings nicht funktioniert hat.
Auch ein weiteres "use Selfloader" im Modul hat nichts geholfen. Wenn
ich das require'rn in den Daten-Block lege, funktioniert das auch nicht
- jedenfalls gibt es dann einen Fehler beim oberen Aufruf der
Test-Methode.
Eigentlich möchte ich lieber den Autoloader verwenden als den
Selfloader, aber um den verwenden zu können, muß ich noch ein paar
mehr Tests für mein Produktiv-System machen und mich mehr damit
beschäftigen. Und daher möchte ich möglichst erstmal SelfLoader
verwenden, weil ich hoffe dort schneller zum Erfolg zu kommen und somit
schon eine kleine Verbesserung der Last auf dem Server. Ich hoffe es
funktioniert dann bei beiden ähnlich.
MFG,
Christoph Pingel
Re: Selfloader bzw. Autoloader bei require"ten Modulen
am 20.11.2006 13:39:06 von struebig
ch_pingel@gmx.de wrote:
> Wie muß ich jetzt das Modul ändern, damit jene Methoden auch nur
> compiliert werden, wenn sie benötigt werden ? Die Methoden mit in das
> Hauptscript zu kopieren, ist keine Option, da ich diese in mehreren
> Scripten verwenden möchte.
Du musst das require vor dem Aufruf der Funktion einbinden.
sub foo
{
BEGIN { print "foo wird kompiliert\n" }
print "Foo\n";
require 'testlib.pl';
&test();
}
> Eigentlich möchte ich lieber den Autoloader verwenden als den
> Selfloader, aber um den verwenden zu können, muß ich noch ein paar
> mehr Tests für mein Produktiv-System machen und mich mehr damit
> beschäftigen. Und daher möchte ich möglichst erstmal SelfLoader
> verwenden, weil ich hoffe dort schneller zum Erfolg zu kommen und somit
> schon eine kleine Verbesserung der Last auf dem Server. Ich hoffe es
> funktioniert dann bei beiden ähnlich.
Für Autloader musst du Dateien in einem Verzeichniss mit dem Namen auto
(unterhalb des skript Verzeichniss) ablegen, mit dem Dateinamen
'Funktion.al'
Dir ist aber klar, dass der Geschwindigkeitsvorteil sich wirklich nur
lohnt, wenn du selten genutzten Funktionen auslagerst, da der Aufruf
solch eines Mechanismus prinzipiell extrem langsam ist?
Struppi.
Re: Selfloader bzw. Autoloader bei require"ten Modulen
am 20.11.2006 18:46:56 von ch_pingel
Hi,
> Du musst das require vor dem Aufruf der Funktion einbinden.
>
> sub foo
> {
> BEGIN { print "foo wird kompiliert\n" }
> print "Foo\n";
> require 'testlib.pl';
> &test();
> }
Ja ne, das bringt ja nichts - in der require'ten Datei sind ja auch
noch andere Methoden, die eventuell erst später geladen werden sollen
bzw. diese Methode soll ja eventuell auch oben oder in anderen Methoden
aufgerufen werden. (da oben bei den foo/bar Aufrufen ist auch nochmal
ein "test") - und ich kann ja nicht in jeder Methode erstmal alle Lib's
require'n.
> Dir ist aber klar, dass der Geschwindigkeitsvorteil sich wirklich nur
> lohnt, wenn du selten genutzten Funktionen auslagerst, da der Aufruf
> solch eines Mechanismus prinzipiell extrem langsam ist?
Ich habe das Problem, daß manchmal z.B. 10 Instanzen meines Scripts
gleichzeitig geladen werden wollen - der Code ist so um die 100-120k
dick incl. der require'ten Dateien. Mit dem Mechanismus will ich
einfach versuchen, daß nicht alle auf einmal die kompletten 100k
compilieren, sondern eben Stückchenweise - und somit sich die
Compilierungslast ein wenig streckt - und da nicht jeder Aufruf
wirklich sämtlichen Code benötigt, erhoffe ich mir da dann Besserung.
... danach werden die Scripte dann per FastCGI im Speicher gehalten.
MFG,
Christoph Pingel
Re: Selfloader bzw. Autoloader bei require"ten Modulen
am 20.11.2006 21:33:02 von Slaven Rezic
ch_pingel@gmx.de writes:
> Hallo,
>
> wie verwendet man SelfLoader bzw. Autoloader, wenn man im Script Module
> require't hat ?
>
[...]
>
> Wie muß ich jetzt das Modul ändern, damit jene Methoden auch nur
> compiliert werden, wenn sie benötigt werden ? Die Methoden mit in das
> Hauptscript zu kopieren, ist keine Option, da ich diese in mehreren
> Scripten verwenden möchte.
>
> Ich hatte für den Selfloader versucht, die require'te Datei auch in
> ein DATA-END block zu legen, was allerdings nicht funktioniert hat.
> Auch ein weiteres "use Selfloader" im Modul hat nichts geholfen. Wenn
> ich das require'rn in den Daten-Block lege, funktioniert das auch nicht
> - jedenfalls gibt es dann einen Fehler beim oberen Aufruf der
> Test-Methode.
>
> Eigentlich möchte ich lieber den Autoloader verwenden als den
> Selfloader, aber um den verwenden zu können, muß ich noch ein paar
> mehr Tests für mein Produktiv-System machen und mich mehr damit
> beschäftigen. Und daher möchte ich möglichst erstmal SelfLoader
> verwenden, weil ich hoffe dort schneller zum Erfolg zu kommen und somit
> schon eine kleine Verbesserung der Last auf dem Server. Ich hoffe es
> funktioniert dann bei beiden ähnlich.
>
Bei meinen Versuchen mit SelfLoader, die allerdings schon etliche
Jahre zurückliegen, habe ich keine Performacevorteile gegenüber der
kompletten Kompilierung des Skripts erkennen können. Vielleicht sparst
du etwas Memory, das habe ich damals nicht untersucht. AutoLoader
bringt wahrscheinlich mehr. Vielleicht ist autouse für dich
interessant?
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
Start a WWW browser - OS independent:
http://user.cs.tu-berlin.de/~eserte/src/perl/WWWBrowser/
Re: Selfloader bzw. Autoloader bei require"ten Modulen
am 21.11.2006 12:26:22 von struebig
ch_pingel@gmx.de wrote:
>
> Hi,
>
> > Du musst das require vor dem Aufruf der Funktion einbinden.
> >
> > sub foo
> > {
> > BEGIN { print "foo wird kompiliert\n" }
> > print "Foo\n";
> > require 'testlib.pl';
> > &test();
> > }
>
> Ja ne, das bringt ja nichts - in der require'ten Datei sind ja auch
> noch andere Methoden, die eventuell erst später geladen werden sollen
> bzw. diese Methode soll ja eventuell auch oben oder in anderen Methoden
> aufgerufen werden. (da oben bei den foo/bar Aufrufen ist auch nochmal
> ein "test") - und ich kann ja nicht in jeder Methode erstmal alle Lib's
> require'n.
Dann musst du dir eine andere vorhgehensweise überlegen.
Selfloader sucht im DATA Block der Hauptdatei und nicht in der Datei in
der es eingebunden wurde. Somit kann es die test() Funktion nicht
finden.
Dein Problem schreit nach einer eigenen AUTOLOAD Funktion, die bei
Bedarf die entsprechende Datei nachlädt (oder evtl. Autoloader) und
nicht Selfloader.
>
> > Dir ist aber klar, dass der Geschwindigkeitsvorteil sich wirklich nur
> > lohnt, wenn du selten genutzten Funktionen auslagerst, da der Aufruf
> > solch eines Mechanismus prinzipiell extrem langsam ist?
>
> Ich habe das Problem, daß manchmal z.B. 10 Instanzen meines Scripts
> gleichzeitig geladen werden wollen - der Code ist so um die 100-120k
> dick incl. der require'ten Dateien. Mit dem Mechanismus will ich
> einfach versuchen, daß nicht alle auf einmal die kompletten 100k
> compilieren, sondern eben Stückchenweise - und somit sich die
> Compilierungslast ein wenig streckt - und da nicht jeder Aufruf
> wirklich sämtlichen Code benötigt, erhoffe ich mir da dann Besserung.
> ... danach werden die Scripte dann per FastCGI im Speicher gehalten.
Und dann klingt der Ansatz unütz. 100-120K ist für Perl nicht viel, im
gegensatz dazu muss Selfloader jedesmal den Code erneut zur Laufzeit
kompilieren, wenn du dann noch zusätzlich Module einbinden willst kommen
noch die Dateioperationen dazu, die ebenfalls ein Flaschenhals sind. Und
bei FastCGI ist es ja so, soweit ich weiß, dass eben der komplette
Kompilierte Code immer im Speicher bleibt, dann hast du sogar eher
Geschwindigkeitsvorteile, wenn einmal der komplette code übersetzt wird.
Struppi.
Re: Selfloader bzw. Autoloader bei require"ten Modulen
am 21.11.2006 21:46:10 von Slaven Rezic
"J. Strübig" writes:
> ch_pingel@gmx.de wrote:
> >
> > Hi,
> >
> > > Du musst das require vor dem Aufruf der Funktion einbinden.
> > >
> > > sub foo
> > > {
> > > BEGIN { print "foo wird kompiliert\n" }
> > > print "Foo\n";
> > > require 'testlib.pl';
> > > &test();
> > > }
> >
> > Ja ne, das bringt ja nichts - in der require'ten Datei sind ja auch
> > noch andere Methoden, die eventuell erst später geladen werden sollen
> > bzw. diese Methode soll ja eventuell auch oben oder in anderen Methoden
> > aufgerufen werden. (da oben bei den foo/bar Aufrufen ist auch nochmal
> > ein "test") - und ich kann ja nicht in jeder Methode erstmal alle Lib's
> > require'n.
>
> Dann musst du dir eine andere vorhgehensweise überlegen.
>
> Selfloader sucht im DATA Block der Hauptdatei und nicht in der Datei in
> der es eingebunden wurde. Somit kann es die test() Funktion nicht
> finden.
>
> Dein Problem schreit nach einer eigenen AUTOLOAD Funktion, die bei
> Bedarf die entsprechende Datei nachlädt (oder evtl. Autoloader) und
> nicht Selfloader.
Genau das macht autouse (Standard-Perl-Modul seit 5.004).
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
tksm - Perl/Tk program for searching and replacing in multiple files
http://ptktools.sourceforge.net/#tksm