Schrift
[thread]5909[/thread]

Speicherplatzvergleich: Strings und code-referenzen



<< >> 9 Einträge, 1 Seite
betterworld
 2003-11-14 21:16
#71860 #71860
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Hallo,

ich moechte eine grosse Anzahl von Referenzen auf Subroutinen speichern. Um es moeglichst effizient zu machen, ueberlege ich, ob ich nicht lieber die qualifizierten Namen der Subs (als Strings) speichere. Weiss jemand, welche Moeglichkeit speichereffizienter ist?
esskar
 2003-11-14 21:39
#71861 #71861
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=betterworld,14.11.2003, 20:16]Hallo,

ich moechte eine grosse Anzahl von Referenzen auf Subroutinen speichern. Um es moeglichst effizient zu machen, ueberlege ich, ob ich nicht lieber die qualifizierten Namen der Subs (als Strings) speichere. Weiss jemand, welche Moeglichkeit speichereffizienter ist?[/quote]
wenn ich es mit C/C++ vergleiche, verbraucht dort ein Pointer auf eine Funktion genau 4 Bytes...

falls deine funktionnamen kleiner sind als 4 zeichen, dannn ist das so okay... ansonsten würd ich mit die die referencen auf die subs merken... ist wohl auch performanter
betterworld
 2003-11-14 21:43
#71862 #71862
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=esskar,14.11.2003, 20:39]wenn ich es mit C/C++ vergleiche, verbraucht dort ein Pointer auf eine Funktion genau 4 Bytes...[/quote]
Ja, daher wuerde ich spontan eigentlich auch Referenzen nehmen. Aber bei dem Perl-Speichermodell weiss man ja nie. Es gibt ja viele Stellen, an denen sich die Arten der Speicherung in Perl und C unterscheiden. Daher frage ich
esskar
 2003-11-14 21:45
#71863 #71863
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
teste es doch einfach!
betterworld
 2003-11-14 22:23
#71864 #71864
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=esskar,14.11.2003, 20:45]teste es doch einfach![/quote]
The three principal virtues of a programmer are Laziness, Impatience, and Hubris.

Ja, Du hast schon Recht, zumal ich ja selbst immer Leuten vorwerfe, zu fragen, obwohl sie es selbst herausfinden koennten ;)

Habe es gerade getestet... die Methode mit den Referenzen braucht ein bisschen weniger Speicher als die mit den Strings (3.5% statt 3.6% in meinem Versuch)
kabel
 2003-11-20 17:47
#71865 #71865
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
ein skalar (sv) hat 12 bytes. dazu kommt noch eine zwischenliegende struktur (xrv) mit weiteren 4 bytes. macht summa summarum 16 bytes.

was ist ein string? ein string ist ebenfalls ein perl skalar (sv), also 12 bytes, dazu eine prise xpv (12 bytes), dazu noch der eigentliche &copy; string, der unter der annahme einer durchschnittlichen länge von n zeichen (n+1) bytes hat. unter strich also 12+12+n+1=25+n bytes.

du sparst also ganze 9+n bytes pro referenz. herzlichen glückwunsch ;)

zur erläuterung: sv ist die grunddatenstruktur eines skalares. die einzelheiten der einzelnen "typen" (string, zahl, referenz, ...) werden dabei in weitere strukturen ausgelagert (xrv, xpv). xrv enthält nur einen SV*, wohingegen xpv noch 8 byte längeninformation zusätzlich verwaltet.\n\n

<!--EDIT|kabel|1069343953-->
-- stefan
Crian
 2003-11-21 16:18
#71866 #71866
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Das wesentliche ist doch wohl, dass man O(n) gegen O(1) eintauscht, das dürfte doch wohl der große Gewinn sein... :)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ishka
 2003-11-21 17:49
#71867 #71867
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Nicht ganz - die Ordnung rentiert sich nur dann so gewaltig, wenn n beliebig groß werden kann. Un Subroutinen bekommen keine beliebig lange Namen. Daher muß man in dem Fall sich eher überlegen, was ist vom Mittelwert her günstiger.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
betterworld
 2003-11-21 21:18
#71868 #71868
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Man kann Referenzen auf Funktionen haben, die nicht existieren. Solche Referenzen machen zum Beispiel mit AUTOLOAD Sinn, oder wenn die Funktion erst spaeter eingebunden wird. Diese Tatsache laesst doch vermuten, dass auch in einer Referenz letztendlich der Name der Funktion gespeichert wird.
Beispiel:
Code: (dl )
1
2
$ perl -le '$a=\&foobar;sub AUTOLOAD{print $AUTOLOAD;} $a->();'
main::foobar

Oder auch:
Code: (dl )
1
2
$ perl -le '$a=\&foobar;eval "sub foobar{print qq(hallo);}";$a->();'
hallo

Irgendwo muss der Name ja gespeichert gewesen sein.\n\n

<!--EDIT|betterworld|1069442846-->
<< >> 9 Einträge, 1 Seite



View all threads created 2003-11-14 21:16.