Zugriff auf große Arrays in PHP
Ich habe verschiedene Methoden für den Zugriff auf große (ish) Arrays von Daten in PHP analysiert. Der Anwendungsfall ist recht einfach: Einige unserer Tools geben Daten als assoziative Arrays in PHP-Dateien aus, und diese Dateien werden von der Anwendung als statische Daten betrachtet. Wir machen Spiele, daher enthalten einige Beispiele für Datendateien Elemente in einem Katalog, Aufgaben, die ein Benutzer ausführen muss, oder Definitionen für Karten:
<code><?php $some_data = array( ...lots and lots of stuff in here... ); ?> </code>
Da diese Arrays groß (400 KB) sind und ein Großteil unseres Codes an diesen Daten interessiert ist, muss auf diese Daten so effizient wie möglich zugegriffen werden. Ich entschied mich für das Timing von 3 verschiedenen Mustern. Nachdem ich die Methoden vorgestellt habe, werde ich meine Ergebnisse weiter unten veröffentlichen.
Was ich suche, ist eine erfahrungsbasierte Validierung dieser Methoden und ihres Timings sowie anderer Methoden zum Ausprobieren.
Methode 1: GetterfunktionIn der Methode erstellt der Exporter tatsächlich eine Datei, die wie folgt aussieht:
<code><?php function getSomeData() { $some_data = array( ...lots and lots of stuff here... ); return $some_data; } ?> </code>
Der Client-Code kann dann die Daten abrufen, indem er einfach getSomeData () aufruft, wenn er dies wünscht.
Methode 2: global + includeBei dieser Methode sieht die Datendatei mit dem obigen ursprünglichen Codeblock identisch aus, der Clientcode muss jedoch einige Rahmen durchlaufen, um die Daten in einen lokalen Bereich zu übertragen. Dies setzt voraus, dass sich das Array in einer Datei namens 'some_data.php' befindet.
<code>global $some_data; //must be the same name as the variable in the data file... include 'some_data.php'; </code>
Dies wird das Array $ some_data in den Geltungsbereich bringen, obwohl es für Client-Code etwas umständlich ist (meiner Meinung nach).
Methode 3: Getter nach ReferenzDiese Methode ist nahezu identisch mit Methode 1, jedoch gibt die Getter-Funktion keinen Wert zurück, sondern legt eine Referenz auf die Daten fest.
<code><?php function getSomeDataByRef($some_data) { $some_data = array( ...lots and lots of stuff here... ); return $some_data; } ?> </code>
Der Client-Code ruft dann die Daten ab, indem er eine lokale Variable deklariert (irgendetwas genannt) und sie als Referenz an den Getter weitergibt:
<code>$some_data_anyname = array(); getSomeDataByRef(&$some_data_anyname); </code>Ergebnisse
Also habe ich ein kleines Skript ausgeführt, das jede dieser Methoden zum 1000-maligen Abrufen von Daten ausführt und die Laufzeit mittelt (berechnet durch Mikrotime (true) am Anfang und Ende). Das Folgende sind meine Ergebnisse (in ms, ausgeführt auf einem MacBookPro 2 GHz, 8 GB RAM, PHP Version 5.3.4):
METHODE 1:AVG: 0.0031637034416199 MAX: 0.0043289661407471 MIN: 0.0025908946990967
Methode 2:AVG: 0.01434082698822 MAX: 0.018275022506714 MIN: 0.012722969055176
Methode 3:AVG: 0,00335768699646 MAX: 0,0043489933013916 MIN: 0,0029017925262451
Aus diesen Daten scheint ohnehin ziemlich klar zu sein, dass die globale + include-Methode den beiden anderen Methoden, die "vernachlässigbare" Unterschiede darstellen, unterlegen ist.
Gedanken? Vermisse ich überhaupt etwas? (wahrscheinlich...)
Danke im Voraus!