Cache Mechanismus
am 29.08.2006 14:44:42 von Ferry Bolhar
Hallo,
Perl verwendet beim Lookup von Methoden (in @ISA) einen Cache-
Mechanismus (d.h, dass dieselbe Methode nicht immer wieder von
vorne gesucht werden muss).
Weiß jemand mehr darüber? Ich habe ein ähnliches Problem zu lösen
und wüsste gerne, wie das effizient möglich ist.
LG, Ferry
--
Re: Cache Mechanismus
am 29.08.2006 19:59:07 von ekkehard.horner
Ferry Bolhar wrote:
> Hallo,
>=20
> Perl verwendet beim Lookup von Methoden (in @ISA) einen Cache-
> Mechanismus (d.h, dass dieselbe Methode nicht immer wieder von
> vorne gesucht werden muss).
>=20
> Weiß jemand mehr darüber? Ich habe ein ähnliches Problem zu lös=
en
> und wüsste gerne, wie das effizient möglich ist.
[...]
Drei Stichworte:
"memoize", "M. J. Dominus", "Higher Order Perl"
und eine ISBN:
"1-55860-701-3"
Re: Cache Mechanismus
am 04.09.2006 18:29:34 von Ferry Bolhar
Ekkehard Horner:
> Drei Stichworte:
> "memoize", "M. J. Dominus", "Higher Order Perl"
> und eine ISBN: "1-55860-701-3"
Vielen Dank für den Hinweis! Das Modul "memoize", das
Funktionen und ihre Ergebnisse cacht, kenne ich natürlich.
Das dürfte aber nicht ganz das sein, was ich meine bzw.
dürfte der Perl-Core einen anderen Mechanismus verwenden,
da der nur Methoden (und nicht deren Ergebnisse) cacht
(dh., dass beim Aufruf einer ererbten Methode nicht jedesmal
die ganzen @ISA-Arrays erneut durchsucht werden müssen).
Trotzdem, das Buch werde ich versuchen zu bekommen. Es
klingt interessant. Danke!
Schöne Grüße, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Cache Mechanismus
am 05.09.2006 22:19:19 von Frank Seitz
Ferry Bolhar wrote:
> Perl verwendet beim Lookup von Methoden (in @ISA) einen Cache-
> Mechanismus (d.h, dass dieselbe Methode nicht immer wieder von
> vorne gesucht werden muss).
>
> Weiß jemand mehr darüber? Ich habe ein ähnliches Problem zu lösen
> und wüsste gerne, wie das effizient möglich ist.
Das Verfahren ist meines Wissens ganz einfach: Ist kein
Eintrag in der Symboltabelle das betreffenden Package vorhanden,
führt Perl gemäß @ISA-Hierarchie eine Tiefensuche durch.
Wird die Methode dabei in einer der übergeordneten Symboltabellen gefunden,
wird sie zur ursprünglichen Symboltabelle hinzugefügt.
Ich würde das allerdings nicht als Caching bezeichnen, sondern eher
als dynamische Ergänzung von fehlender Information.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Cache Mechanismus
am 06.09.2006 20:04:01 von Slaven Rezic
Frank Seitz writes:
> Ferry Bolhar wrote:
>
> > Perl verwendet beim Lookup von Methoden (in @ISA) einen Cache-
> > Mechanismus (d.h, dass dieselbe Methode nicht immer wieder von
> > vorne gesucht werden muss).
> >
> > Weiß jemand mehr darüber? Ich habe ein ähnliches Problem zu lösen
> > und wüsste gerne, wie das effizient möglich ist.
>
> Das Verfahren ist meines Wissens ganz einfach: Ist kein
> Eintrag in der Symboltabelle das betreffenden Package vorhanden,
> führt Perl gemäß @ISA-Hierarchie eine Tiefensuche durch.
> Wird die Methode dabei in einer der übergeordneten Symboltabellen gefunden,
> wird sie zur ursprünglichen Symboltabelle hinzugefügt.
>
> Ich würde das allerdings nicht als Caching bezeichnen, sondern eher
> als dynamische Ergänzung von fehlender Information.
>
"Caching" deswegen, weil man diese fehlende Information jedesmal
suchen könnte --- aus Effizienzgründen legt man die Information zum
schnelleren Zugriff ab.
Der Methoden-Cache kann auch ungültig gemacht werden, indem man @ISA
ändert.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
Lost in your Tk widget tree? Try
http://user.cs.tu-berlin.de/~eserte/src/perl/Tk-WidgetDump/
Re: Cache Mechanismus
am 06.09.2006 21:12:55 von Frank Seitz
Slaven Rezic wrote:
> Frank Seitz writes:
>>Ferry Bolhar wrote:
>>>
>>>Perl verwendet beim Lookup von Methoden (in @ISA) einen Cache-
>>>Mechanismus (d.h, dass dieselbe Methode nicht immer wieder von
>>>vorne gesucht werden muss).
>>>
>>>Weiß jemand mehr darüber? Ich habe ein ähnliches Problem zu lösen
>>>und wüsste gerne, wie das effizient möglich ist.
>>
>>Das Verfahren ist meines Wissens ganz einfach: Ist kein
>>Eintrag in der Symboltabelle das betreffenden Package vorhanden,
>>führt Perl gemäß @ISA-Hierarchie eine Tiefensuche durch.
>>Wird die Methode dabei in einer der übergeordneten Symboltabellen gefunden,
>>wird sie zur ursprünglichen Symboltabelle hinzugefügt.
>>
>>Ich würde das allerdings nicht als Caching bezeichnen, sondern eher
>>als dynamische Ergänzung von fehlender Information.
>
> "Caching" deswegen, weil man diese fehlende Information jedesmal
> suchen könnte --- aus Effizienzgründen legt man die Information zum
> schnelleren Zugriff ab.
Dass ich ein Resultat speichere, was ich auch immer wieder
neu berechnen könnte, ist für mich kein hinreichendes Kriterium für
einen Cache.
> Der Methoden-Cache kann auch ungültig gemacht werden, indem man @ISA
> ändert.
Gibt es wirklich einen eigenständigen Methoden-Cache?
Oder gibt es nur die Symboltabellen - mit Einträgen, die logisch
ungültig werden können, wenn man an der Vererbung rumfummelt?
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Cache Mechanismus
am 06.09.2006 23:35:43 von Slaven Rezic
Frank Seitz writes:
> Slaven Rezic wrote:
> > Frank Seitz writes:
> >>Ferry Bolhar wrote:
> >>>
> >>>Perl verwendet beim Lookup von Methoden (in @ISA) einen Cache-
> >>>Mechanismus (d.h, dass dieselbe Methode nicht immer wieder von
> >>>vorne gesucht werden muss).
> >>>
> >>>Weiß jemand mehr darüber? Ich habe ein ähnliches Problem zu lösen
> >>>und wüsste gerne, wie das effizient möglich ist.
> >>
> >>Das Verfahren ist meines Wissens ganz einfach: Ist kein
> >>Eintrag in der Symboltabelle das betreffenden Package vorhanden,
> >>führt Perl gemäß @ISA-Hierarchie eine Tiefensuche durch.
> >>Wird die Methode dabei in einer der übergeordneten Symboltabellen gefunden,
> >>wird sie zur ursprünglichen Symboltabelle hinzugefügt.
> >>
> >>Ich würde das allerdings nicht als Caching bezeichnen, sondern eher
> >>als dynamische Ergänzung von fehlender Information.
> >
> > "Caching" deswegen, weil man diese fehlende Information jedesmal
> > suchen könnte --- aus Effizienzgründen legt man die Information zum
> > schnelleren Zugriff ab.
>
> Dass ich ein Resultat speichere, was ich auch immer wieder
> neu berechnen könnte, ist für mich kein hinreichendes Kriterium für
> einen Cache.
Was sonst?
>
> > Der Methoden-Cache kann auch ungültig gemacht werden, indem man @ISA
> > ändert.
>
> Gibt es wirklich einen eigenständigen Methoden-Cache?
> Oder gibt es nur die Symboltabellen - mit Einträgen, die logisch
> ungültig werden können, wenn man an der Vererbung rumfummelt?
Guck dir mal die Verwendung von PL_stashcache in pp_hot.c an --- das
müsste es sein.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
tkrevdiff - graphical display of diffs between revisions (RCS, CVS or SVN)
http://ptktools.sourceforge.net/#tkrevdiff
Re: Cache Mechanismus
am 07.09.2006 11:26:31 von Ferry Bolhar
Slaven Rezic:
> Guck dir mal die Verwendung von PL_stashcache in pp_hot.c an --- das
> müsste es sein.
Soviel ich das jetzt mitbekommen habe, spielen tatsächlich zwei (voneinander
unabhängige?) Dinge mit:
1) Findet Perl eine Method in einer Basis-Klasse (dh., in einer der Klassen
in @ISA), so wird ein dafür eine Alias im aktuellen Package angelegt. Dieser
Alias wird mit einer Generationsnummer versehen (die aus der globalen
internen
Variable PL_sub_generation entnommen wird). Wird später irgendetwas an
@ISA geändert, so wird (über ein sog. "Set-Magic", dh, C-Code, der
ausgeführt
wird, wenn am Array @ISA oder an einem seiner Elemente etwas geändert
wird) die Variable PL_sub_generation um eins erhöht. Beim späteren Zugriff
auf den Alias wird dessen Generationsnummer mit PL_sub_generation verglichen
und der Alias nur verwendet, wenn die Nummern übereinstimmen. Anders gesagt,
werden nur solche Aliase verwendet, bei denen seit ihrem Anlegen an @ISA
nichts
mehr geändert wurde. Ansonsten wird @ISA aufs Neue durchsucht und der Alias
mit der aktuellen Generationsnummer überschrieben. Eswird also nicht der
Cache
als Ganzes als ungültig markiert, sondern nur Einträge, die vor der letzten
@ISA-
Änderung angelegt wurden.
2) Der erwähnte Stash PL_stashcache ist ein Hash, in dem die Adressen von
Packages (Symboltabellen = Stashes) abgespeichert werden, die Keys sind
die Packagenamen. Beim Aufruf von Klassenmethoden in verschachtelten
Packages (zB: X::Y::Z->method) erspart sich Perl dadurch, jedesmal den Tree
zu durchlaufen, bevor es den Stash der aktuellen Symboltabelle (hier also
"%Z::")
findet. Dieser Cache wird normalerweise nicht gelöscht, außer wenn ein Stash
komplett entfernt (zB. "undef %Z::;") oder ein Package durch ein
Gleichnamiges
überschrieben (package reload) wird.
Liege ich da einigermaßen richtig?
Schöne Grüße,
Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Re: Cache Mechanismus
am 07.09.2006 17:25:42 von Frank Seitz
Slaven Rezic wrote:
> Frank Seitz writes:
>>Slaven Rezic wrote:
>>>
>>>"Caching" deswegen, weil man diese fehlende Information jedesmal
>>>suchen könnte --- aus Effizienzgründen legt man die Information zum
>>>schnelleren Zugriff ab.
>>
>>Dass ich ein Resultat speichere, was ich auch immer wieder
>>neu berechnen könnte, ist für mich kein hinreichendes Kriterium für
>>einen Cache.
>
> Was sonst?
Einfaches Gegenbeispiel:
$a = 7 + 4;
$b = $a * 2;
Ist $a ein Cache?
>>>Der Methoden-Cache kann auch ungültig gemacht werden, indem man @ISA
>>>ändert.
>>
>>Gibt es wirklich einen eigenständigen Methoden-Cache?
>>Oder gibt es nur die Symboltabellen - mit Einträgen, die logisch
>>ungültig werden können, wenn man an der Vererbung rumfummelt?
>
> Guck dir mal die Verwendung von PL_stashcache in pp_hot.c an --- das
> müsste es sein.
Ferry hat es dankenswerterweise getan (ich bin mit den
Perl-Sourcen nicht sonderlich vertraut), seiner Beschreibung
nach geht es dabei um das Lookup der Symboltabellen,
nicht der Methoden.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Cache Mechanismus
am 08.09.2006 00:20:07 von Slaven Rezic
Frank Seitz writes:
> Slaven Rezic wrote:
> > Frank Seitz writes:
> >>Slaven Rezic wrote:
> >>>
> >>>"Caching" deswegen, weil man diese fehlende Information jedesmal
> >>>suchen könnte --- aus Effizienzgründen legt man die Information zum
> >>>schnelleren Zugriff ab.
> >>
> >>Dass ich ein Resultat speichere, was ich auch immer wieder
> >>neu berechnen könnte, ist für mich kein hinreichendes Kriterium für
> >>einen Cache.
> >
> > Was sonst?
>
> Einfaches Gegenbeispiel:
>
> $a = 7 + 4;
> $b = $a * 2;
>
> Ist $a ein Cache?
Wenn deine Intention war, das Ergebnis der Berechnung "7+4" aus
Performance-Gründen für spätere Operation*en* schneller zugreifbar zu
machen, dann ja.
Allerdings glaube ich nicht, dass du in diesem Fall nachweisen kannst,
dass das Programm tatsächlich schneller geworden ist. Dazu ist die
Berechnung viel zu einfach im Vergleich zu der Operation, das
zwischengespeicherte Ergebnis aus dem Cache (= Variablenzugriff) zu
holen. Ganz im Gegenteil, wahrscheinlich ist dein Programm hier sogar
langsamer geworden, als wenn du gleich "$b = (7+4)*2" geschrieben
hättest.
Auch weiß ich nicht, wie oft du auf $a zugreifst. Wenn es tatsächlich
nur einmal ist, dann brauchst du keinen Cache. Typischerweise braucht
man einen Cache nur, wenn öfters zugegriffen wird.
Dein Cache-Beispiel ist auch sehr einfach, da der Cache-Wert für alle
Zeiten konstant ist. Oft sind Cache-Werte nur eine Zeit lang konstant
und müssen u.U. neu berechnet werden.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
Start a WWW browser - OS independent:
http://user.cs.tu-berlin.de/~eserte/src/perl/WWWBrowser/