Thread Array ist nicht Array?!?: Was ist eigentlich ein Array in Perl? (23 answers)
Opened by highlander at 2006-04-07 17:02

sid burn
 2006-04-09 21:26
#64552 #64552
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hmm,
entweder verstehen wir uns Falsch, oder ich verstehe dich nicht richtig. Ich glaube eher letzteres ^^

Ich selber wollte nicht Testen welche Methode schneller ist um ein Array zu füllen, sondern ob es wirklich stimmt das es sich hier um ein Array und nicht um eine Liste handelt.

Es wurde ja gesagt das bei verwendung bei einem Array das ganze Array hin und her kopiert werden muss. Es kostet also letztendlich Performance. Das es jetzt nicht bei jedem push passiert, und das die größe Exponentiel steigt ist Interessant, sollte aber nichts an der Tatsache ändern, das dass Kopieren trotzdem passiert und es Zeit kostet.

Daher habe ich deine Aussage genommen, dass man mit "$#var = xxx" Die größe schon vorher festlegen kann, und danach ein umkopieren nicht mehr nötigt ist.

Von daher muss es ja so sein, dass wenn ich diese Methode anwende, es aufjedenfall schneller ist, als wenn ich das nicht Benutze. Den wenn ich diese Zeile nicht Benutze, muss das Array beim hinzufügen öfters mal vergrößert werden, was letztendlich Zeit kostet.

Am anfang habe ich eine Zuweisung und ein push genommen. Da hat sich aber schnell herausgetsellt das "$#..." logischerweise darauf keine Auswirkung hat.

Nur ein Direkter Zugriff über den index Wert dürfte letztendlich schneller sein, vor allem sollte es dann schneller sein, wenn ich die maximale größe des Arrays vorher festgelegt habe, und das array an sich schon im Speicher liegt, nur noch mit inhalten gefüllt werden muss. Damit ich auch wirklich sicher gehen kann das das Arrays öfters mal hin und her kopiert wird, und nicht zufällig so viel Speicher an einem Stück im RAM frei ist, habe ich das Arrays etwas größer gewählt.

Das Array ist nun 20Mio Eintraege groß, und im jeden wird ein 50Byte String gespeichert. Dadadurch kommt man nur durch die Strings auf einem Speicherverbrauch von ~953MB.

Ich besitze 1GB Ram und meine Swap Partition ist ebenfalls 1GB groß. Für den Speicher das mein System verbraucht + Zusätzlichen Verwaltungsaufwand den perl benötigt sollte allerdings mehr als 953MB Speicher verbraucht werden. Vor allem wird es mit dem Umkopieren zu ende hin schwer, da unter umständen gar nicht mehr so viel Speicher zur verfügung steht.

Wenn ich also vorher die Größe mit "$#..." festlege, dann sollte das wohl letztendlich deutlich schneller sein. Allerdings sollte das erzeugen des Arrays etwas dauern. Diese Zeit wird aber nicht mit eingerechnet.


Insgesamt bringt das Ergebnis aber einem zum Grübeln. Wenn ich vorher "$#..." benutze, dauert das auffüllen des Arrays ca. 45sek. beim Auffüllen sollte er kein einziges mal das Array umkopieren, da das Array ja immer groß genug ist.


Lasse ich "$#..." weg, dann sollte es ja eigentlich langsamer sein, da er ja letztendlich öfters mal umkopieren muss. Allerdings wenn ich es weg lasse, dann ist das letztere Schneller. Im Schnitt brauche ich nur 38sek.

Hier mein Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl -w
use Time::HiRes 'time';

my @array;
#$#array = 20_000_010;


$start = time();
for( 1 .. 20_000_000 )
{
$array[$_] = 'x' x 50;
}
$end = time();

printf "Die Zeit Betrug %lf Sekunden\n", $end - $start;
printf "Das Array hat %d Eintraege\n", scalar @array;


Von daher stellt sich nicht die Frage ob nicht doch Listen benutzt werden? Vielleicht ja auch ein Misch aus Liste & Array.

ich weiß es nicht.\n\n

<!--EDIT|sid burn|1144603623-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread Array ist nicht Array?!?: Was ist eigentlich ein Array in Perl?