Hoi,
Ich wäre sehr froh, wenn mir die PHP-Spezies unter Euch ein paar
Tips geben könnten.
Spezie bin ich nicht, aber ich versuchs trotzdem.
Ich habe ein Script geschrieben, das augenscheinlich zu viel
Speicherplatz verbraucht.
Das heisst?
- assoziative Arrays
Könnte es sein, daß die assoziativen Arrays viel mehr Platz
verbrauchen, als "normale" Arrays?
Wäre es also günstiger, statt
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
?>
die Variante
<?
$root->obj[1][3][5] = new Klasse_1();
?
zu wählen?
Nein. Das sind pro Key lediglich (Anzahl der Zeichen des Keys - 1)
Byte mehr. Und ansonsten sind Arrays in PHP *immer* assoziativ (als
eine Key-Value-Liste implementiert, AFAIK).
(Und muß man dabei darauf achten, daß in jeder Dimension von
0,1,2... beginnend alle Zahlen vertreten sind, oder geht auch
z.B. 5,34,623...)
Es geht auch die zweite Variante. Ist sogar sinnvoller.
- Verschachtelung der mehrdimensionalen Arrays
Könnte es sein, daß die verschachtelung der Arrays als solche
eine Rolle spielt?
Wäre es günstiger, statt
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
?>
die Variante
<?
$root->obj['xyz_abc_bnm'] = new Klasse_1();
?>
zu wählen?
Das duerfte hoechstens Geschwindigkeits-Vorteile bringen -- PHP muss
jetzt nicht mehr n Lookups machen, sondern nur noch einen.
Aber das ist so eine Sache, dafuer ist die Liste dann wieder ein
ganzes Stueckchen groesser. Das musst du mal ausrechnen: es sollte
generell so sein, dass bei wenigen Elementen ein Lookup schneller
ist als n Lookups, bei grossen Arrays allerdings sollte eine
verschachtelte Struktur schneller sein.
- Objekte als "value" in Arrays
Könnte es sein, daß es überhaupt ungünstig ist, Objekte in Arrays
zu stecken?
Wäre es günstiger, statt
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
?>
die Variante
<?
$root->obj_xyz_abc_bnm = new Klasse_1();
?>
zu wählen?
Nein.
- Referenzen
Ist die hohe Zahl von Referenzen, die z.B. durch die
parent-child-Beziehung entstehen relevant?
Durchaus. Referenzen sind anscheinend sehr langsam in PHP.
Wäre es günstiger statt der wirklichen Abbildung eines
Objektbaumes nur die "Adressen" (Arraynamen) der Objekte zu
speichern?
Also statt
<?
$root->obj['xyz']['abc'][1]->obj['sdf']['yxc']['xcv'] = new Klasse_4();
?>
lieber
<?
$root->obj['xyz']['abc'][1] = new Klasse_1();
$root->obj['sdf']['yxc']['xcv'] = new Klasse_4();
$root->obj['xyz']['abc'][1]->child = 'sdf_yxc_xcv';
$root->obj['sdf']['yxc']['xcv']->parent = 'xyz_abc_1';
(oder so ähnlich)
?>
Ja. Wenn die Wiederaufbereitung der Daten nicht zu viel Zeit kostet.
- Verschachtelung von Objekten
Durch die Nutzung von $root und Unterordnung aller Objekte unter
dieses Rootobjekt kann ich durch
<?
global $root;
?>
in allen Funktionen auf alle vorhandenen Objekte zugreifen. Das
ist recht günstig.
Ist es aber vielleicht trotzdem besser, auf $root zu verzichten
und Objekte im allgemeinen Namensraum zu definieren?
Nein.
Es könnte ja z.B. sein, daß mit jedem
<?
global $root;
?>
der ganze Baum wieder innerhalb der Funktion noch einmal erzeugt
wird.
Wäre es also günstiger, statt
<?
$root->obj['xyz']['abc']['bnm'] = new Klasse_1();
$root->obj['xyz']['mno']['jkl'] = new Klasse_2();
$root->obj['asd']['qwe']['mno'] = new Klasse_3();
?>
lieber die Variante
<?
$obj['xyz']['abc']['bnm'] = new Klasse_1();
$obj['xyz']['mno']['jkl'] = new Klasse_2();
$obj['asd']['qwe']['mno'] = new Klasse_3();
?>
zu wählen und dann innerhalb einer Funktion z.B. mit
<?
global $obj['xyz']['abc']['bnm'];
global $obj['xyz']['mno']['jkl'];
?>
die benötigten Objekte direkt anzusteuern?
Nein.
Wenn ich jetzt wissen würde, ob ich auf dem richtigen Weg bin -
und wo ich anfange...
Ich wuerde an deiner Stelle nicht bei der Datenstruktur suchen,
sondern den Algorithmus checken.
Gruesse,
CK