Thread Array ist nicht Array?!?: Was ist eigentlich ein Array in Perl?
(23 answers)
Opened by highlander at 2006-04-07 17:02
[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--> |