PHP: Array-Benchmark

Hiho,

heute hab ich mich ein bisschen mit Arrays in PHP beschäftigt. Speziell ging es mir darum herauszufinden, welche Methode am schnellsten ist um einen neuen Wert ans Ende eines Arrays zu speichern.

Dabei habe ich 4 Möglichkeiten untersucht:

  1. Der []-Operator
    $a = array();
    $a[] = "foobar";
    
  2. Die Funktion array_push()
    $a = array();
    array_push($a,"foobar");
    
  3. Via Index und count()
    $a = array();
    $a[count($a)] = "foobar";
    
  4. Direkt via Index
    (setzt voraus, dass der nächste Index bekannt ist)

    $a = array();
    $a[0] = "foobar";
    

Ich habe in meinem Benchmark 10.000 mal einen 1000 Byte-Wert an das Array angehängt. Was dabei herausgekommen ist, zeigt dieses Diagramm.
(Achtung: logarithmische x-Achse!)

PHP Array Benchmark

Fazit:

  • Der Gewinner ist mit knappem Vorsprung Methode 1, der []-Operator.
  • Methode 4 liefert einen nahezu identischen Wert, da ja der selbe Operator benutzt wird.
  • Den 3. Platz hat sich array_push() gesichert. Das Geschwindigkeitsdefizit gegenüber Methode 1 lässt sich durch den zusätzlichen Overhead erklären, da hier bei jedem Durchlauf eine Funktion aufgerufen wird.
  • Und, nicht überraschend, weit abgelegen die Kombination aus count() und Index-Zugriff. Der Grund ist offensichtlich. Das wiederholte Aufrufen der count()-Methode, die das Array vermutlich jedes mal mit einem Aufwand von O(n) durchläuft um die Größe/Länge zu ermittlen, erzeugt eine deutliche Zeitverzögerung.
  • Eine kleine Vermutung meinerseits: Arrays sind in PHP als Liste implementiert, was das Mischen von assoziativen und numerischen Arrays erleichert, allerdings anscheinend auch das Zählen der Elemente verlangsamt. Ich würde mich aber wundern, wenn die interne Datenstruktur des PHP-Arrays keine Zähl-Variable enthielte, welche die aktuelle Größte speichert. Mein Ergebnis spricht nicht dafür. Weiß es jemand genau?

Das wars auch schon mit meinem kleinen Benchmark. Eventuell werde ich in Zukunft noch ein paar weitere durchführen. Hat jemand Vorschläge?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.