Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7866[/thread]

Array ist nicht Array?!?: Was ist eigentlich ein Array in Perl? (Seite 3)

Leser: 1


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
ptk
 2006-04-09 23:05
#64555 #64555
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=sid burn,09.04.2006, 20:07]Anscheind hat man ein Array, dass die unterschiedlichen Speicherstellen der unterschiedlichen Elemente enthält. Greift man auf Element 500 wird auf eine Speicherstelle verwiesen die auf einer Struktur zeigt, wo sich der Inhalt befindet.

Letztendlich wird beim vergößern des Arrays dann nur die tabelle mit den Speicherorten neu angelegt, und umkopiert. Aber nicht die Inhalte des Arrays.
[/quote]
Exakt. Intern ist ein AV (Array Value) eine Datenstruktur, die hauptsächlich ein Array enthält, das auf SV (Scalar Value, die eigentlichen Werte) verweist. Beim Umkopieren des Arrays im AV müssen deshalb die eigentlichen Werte nicht angefasst werden.
Quote
Vielleicht sollte man auch einfach Perl vertrauen das alles gut und schnell geht, und sich keine größere Gedanken darüber machen. Immerhin Programmieren wir mit Perl und nicht mit C, damit wir uns nicht mit solchen Sachen befassen müssen. *g*

So ist es. Wenn es denn wirklich performance-kritisch wird, kann man noch immer auf XS/Inline::C zugreifen oder Arrays anderweitig emulieren.
Relais
 2006-04-09 23:08
#64556 #64556
User since
2003-08-06
2261 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mann, laß Dir sagen, Perl-Arrays sind echte Arrays, echter geht es nicht.
Ich arbeite seit Jahren damit, und bin noch keinem falschen begegnet!

scnr: Denk mal dran, daß es hier im Forum nur so von Perl-Programmieren wimmelt, deren täglich Brot (hoffentlich!) Perl ist.
C hat nicht einfach so immer Recht in seinen Annahmen, fast immer hat Perl Recht :-) ;)
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
ptk
 2006-04-09 23:18
#64557 #64557
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=murphy,09.04.2006, 17:40]Ich hätte allerdings gedacht, dass die Präallokation das ganze nicht noch verlangsamen sollte -- vielleicht spielt da noch Overhead von der Referenzzählung hinein, wenn man die Arrayelemente neu beschreibt.[/quote]
Das hat mich auch gewundert. Ein Blick in av.c, Funktion Perl_av_store gibt dir Recht, bei der Präallokationsmethode muss für jedes Element SvREFCNT_dec aufgerufen werden (und mit Perl_sv_free noch eine weitere Funktion). Aber auch wenn ich diesen Aufruf mittels ary[key] != &PL_sv_undef vermeide (bei einem undef braucht man ja nicht den Referenzzähler runterzuzählen), ist die Methode ohne Präaallokation noch immer schneller. Weitere Vermutung: bei der Präallokation wird in Perl_av_extend in einer Schleife das gesamte Array in einer while-Schleife erst einmal auf undef gesetzt.

Ich habe übrigens deinen Benchmark auch mit 1 Mio. und 10 Mio. Werten ausprobiert, aber auch dort verliert die Präallokations-Methode.

Vielleicht ist es so nur auf meinem System (Intel Celeron, FreeBSD). Aber vielleicht sollte man trotzdem die Stelle in "perldoc perldata" ändern, die von " gain some minuscule measure of efficiency" spricht --- das ist bestimmt von System zu System unterschiedlich.\n\n

<!--EDIT|ptk|1144610350-->
lichtkind
 2006-04-10 01:19
#64558 #64558
User since
2004-03-22
5708 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
apropos "echte" arrays hab grad gesehen das perl6 compact arrays kennt die weit weniger speicher fressen weden wenn man so grosse datenmengen hat
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2006-04-07 17:02.