PHP: "Konstantes" Array in PHP - Benchmark

Ich hatte letztens das "Problem" ein Array/Liste in PHP Global zugänglich zu machen. Am liebsten natürlich noch dass man dessen Werte nicht verändern kann, es also mehr oder weniger konstant ist.

Auf der php.net Seite habe ich 2 Möglichkeiten gefunden soetwas zu realisieren.
Einmal mit define() und serialize() sowie das ganze in einer Funktion returnen.
Da man keine Arrays als Konstanten definieren kann, muss man diese erst serialisieren, also in einer art String bringen, um diesen dann konstant zu machen. Da eine Funktion aber auch überall verfügbar ist kann man deren Rückgabe auch für solch ein Array benutzen.

Für die Entscheidung was ich jetzt nehme hab ich einen kleinen dreckigen Benchmark gemacht der wie folgt aussieht:

Code:

<?php
// Very simple Benchmark for "constant" Arrays
// Config
$iterations = 1000000;
$array = array(1,4,7,9,12,15,19,22,26,28,35,38,39,46,47,55,52,63,69);
// Define
define('CONST_ARRAY', serialize($array));
function get_const_array() {
  return array(1,4,7,9,12,15,19,22,26,28,35,38,39,46,47,55,52,63,69);
}
function get_const_array_static() {
  static $array = array(1,4,7,9,12,15,19,22,26,28,35,38,39,46,47,55,52,63,69);
  return $array;
}
// Bench function static
$time_start = microtime(true);
$i=0;
while($i++<=$iterations) {
  $devnull = get_const_array_static();
}
echo (microtime(true)-$time_start)." Sekunden mit get_const_array_static()\n";
// Bench function
$time_start = microtime(true);
$i=0;
while($i++<=$iterations) {
  $devnull = get_const_array();
}
echo (microtime(true)-$time_start)." Sekunden mit get_const_array()\n";
// Bench CONST
$time_start = microtime(true);
$i=0;
while($i++ <= $iterations) {
  $devnull = unserialize(CONST_ARRAY);
}
echo (microtime(true)-$time_start)." Sekunden mit unserialize(CONST_ARRAY)\n";
?>

Als Ergebnis habe ich folgendes bekommen:

2.907243013382 Sekunden mit get_const_array_static()
3.9479551315308 Sekunden mit get_const_array()
6.5756199359894 Sekunden mit unserialize(CONST_ARRAY)

Es ist deutlich wer gewonnen hat.

Wer es sich besonders einfach machen will kann mittels foreach() direkt über die Rückgabe der Funktion iterieren:

foreach(get_const_array() AS $r) {
...
}

So besteht nicht die Gefahr dass das Array verändert wurde.

UPDATE:
Wie Theo angemerkt hat, gibt es noch eine Methode ein konstantes Array in PHP zu realisieren.
Dazu wird in einer Funktion das Array in einer statischen Variable gespeichert, und von der Funktion bei jedem Aufruf nur die Referenz auf das Array zurückgegeben, was rund 1/4 schneller ist, als immer ein neues Array zu erstellen und eine Referenz auf dieses zurück zu geben.
Danke an Theo für diese gute Idee.

Related posts:


 
 
 

3 Kommentare zu “PHP: "Konstantes" Array in PHP - Benchmark”

  1. Fr33z3m4n 17. August 2009 um 15:12

    Hallo,

    vielen Dank für dieses kurzen Benchen.

    Wenn du doch aber viel Wert auf Performance legst, dann mach anstatt foreach lieber ein while schleife, in der du dann das Array durchläufst.

    Denn Foreach ist langsamer als while/for

    mfg
    Fr33z3m4n

  2. Julius 17. August 2009 um 16:45

    Ich lege recht viel Wert auf Performance und muss dir leider sagen dass foreach() wesentlich schneller ist. Schau dir das mal an: http://juliusbeckmann.de/blog/php-foreach-vs-while-vs-for-the-loop-battle.html

  3. Theo 14. November 2011 um 22:24

    Wie sieht es mit einer statischen Variante aus? Dabei sollte das Array nur einmal erzeugt werden und bei wiederholten Aufrufen schneller zurückgeliefert werden:

    function get_const_array_static() {
    static $arr = array(1, 2, 3, 4, 5, 6);
    return $arr;
    }