31

JAN09

Webseiten mehrsprachig programmieren

Trackback URIVon Peppie in PHP, Programmierung

2. Das Array

Für unseren Leistungstest habe ich eine php-Datei mit einem mega großen Array erzeugt (10000 Zeilen) Die Datei ist wie folgt aufgebaut:

1
2
3
4
5
6
<?php
$LANG_XYZ = array();
$LANG_XYZ[0] = 'Test string0';
...
$LANG_XYZ[9999] = 'Test string9999';
?>

Wie lange dauert nun das einlesen solch eine Datei und wie verhält sich der Speicherverbrauch von PHP. Das Einbinden und die Ausgabe eines Textes aus diesem Array gibt uns folgende Messwerte aus:

Mem start: 66.69 kb
Mem nach einlesen: 1131.06 kb
Mem nach Stringsuche: 1131.22 kb
Zeit zum einlesen der Datei: 0.047284 s
Zeit der Ausgabe: 0.000072 s

Man kann hier richtig schön erkennen wir nach dem Einbinden der Sprachdatei der Speicher von PHP nach oben geht. Das Einlesen der Datei geht auch relativ fix und das suchen des Strings in dem großen Array benötigt nur 0.000072 Sekunden.

3.  Assoziatives Array

Ich kann mir denken das eine Suche in einem assoziativen Array viel länger dauert als ein Numerisches Array. Das Array wurde von mir so aufgebaut:

1
2
3
4
5
6
<?php
$LANG_XYZ = array();
$LANG_XYZ['xyz0'] = 'Test string0';
...
$LANG_XYZ['xyz9999'] = 'Test string9999';
?>

Schauen wir uns nun die Messergebnisse für solch eine Methode an:

Mem start: 66.70 kb
Mem nach einlesen: 1209.13 kb
Mem nach Stringsuche: 1209.29 kb
Zeit zum einlesen der Datei: 0.047721 s
Zeit der Ausgabe: 0.000072 s

Aber was ist das? Hier kann man schön erkennen das es so groß keinen Unterschied macht ob assoziatives Array oder nicht. Klar geht der Speicherverbrauch ein wenig in die höhe aber zeitlich gesehen ist es genauso schnell wie ein normales Array. Der einzige Nachteil an dem normalen Array ist, dass der Programmierer Textpositionen mit z.B: [5874] aufrufen muss und das sieht unsauber aus und verwirrt leicht, mich zumindestens.

Seite:
1 2 3

Peppie
Über den Autor:
Vor mehr als 6 Jahren habe ich mein Hobby zum Beruf gemacht. Seit her bekommt mich kein Problem so schnell in die Knie, ich bin sehr verbissen und arbeite solange an einem Problem bis es gelöst ist.

Ähnliche Artikel:

9 Kommentare

ArSeN

Keeewl… danke, dass des mal jemand getestet hat, zum Glück gehts mit Konstanten am besten :D

Zu der Editierungsmöglichkeit die ja für den fiktiven Kunden am besten bei MySQL gegeben ist. Hier könnte man mit ein bisschen regexen sicherlich auch eine Bearbeitungsmaske für eine Konstanten definierende Datei schaffen, oder aber einen Spiegel des ganzen in MySQL lagern, und dann daraus die zu inkludierende Datei mit den Konstanten generieren, so hätte man von beiden Varianten die Vorteile ausgeschöpft :)

Greetz


Peppie

Hey Kolja,
ja die Idee mit der Eingabe der Konstanten über die MySQL hört sich nett an ;-)

coole Sache


Markus

Wenn man aber alle Einträge erst aus der MySQL Datenbank ausliest und dann in eine Konstante setzt, könnte ich mir vorstellen, dass auch viel Zeit und Speicher dabei drauf geht.

Ich sitze im moment auch vor dem Problem, ein mehrsprachiges System zu erstellen, und bin mir au ch noch unschlüssig wie ich es mache. Im Moment tendiere ich aber zu gettext, was du übrigens nicht erwähnt hast ;)


Peppie

Hi Markus,

wenn man dieses auslesen dann nur einmalig macht und nicht bei jedem Seitenaufruf dann wäre dies die Lösung für die Theorie von Kolja und mir :-)


Markus

Willst du dann dynamisch ne PHP Datei generieren, die dies dann übernimmt? Die Lösung würd mir nicht so wirklich gefallen :-|


Peppie

Naja das ganze würde nur richtig sinn machen bei großen Seiten die dynamisch die Texte pflegen wollen wie im Beispiel, bei kleineren Seiten kannst es auch von der DB aus zur Laufzeit immer in defines packen.

Ich meine nur, der SQL Query wäre an dieser Stelle unnötig denn man könnte es ja anderster machen. :)


Markus

Es geht um ein großes Projekt, deswegen is mir die Optimierung sehr wichtig ;)


Peppie

Schau mal, angenommen wir haben eine Seite mit etwa 200-300 Textpositionen die dann in der Datenbank stehen würden. Du hättest zunächst einen Query der dir ein ResultSet von diesen 200-300 Rows zurück gibt (nicht grad wenig) Als nächstes müsstest du eine Schleife machen die dir alle Werte in eine Konstante packt. Meiner Meinung nach sind das gleich 2 dicke negative Punkte es nicht auf diesen Weg zu machen. Selbst wenn du an dieser Stelle dann QueryCache oder Memcache benutzt haben wir ein Array mit der Anzahl der Textpositionen, dieses müsstest du dennoch schleifen um die Konstanten zu bekommen, dass ist aber dann gleich doppelt gemobbelt, da kannste ja gleich die Sprachsteuerung über Arrays machen :D


Patrick

Hast Du schon mal gettext probiert?


Kommentar schreiben

;) :( :) :D :P :o :| ^^ :> :< :cry: :S xD


Blogverzeichnis - Blog Verzeichnis bloggerei.de frisch gebloggt Blog Top Liste - by TopBlogs.de Bloggeramt.de Add to Technorati Favorites Dennis bei Xing Wikio - Top Blog UrlFan.com