2 Reaktionen

PHP array_search() Performance verbessern durch STRICT search

Geschätzte Lesedauer:

Mich hat für ein Projekt interessiert, ob es in PHP wirklich viel schneller ist array_search() mit der strict Option zu verwenden, da Optionen dieser Art ja nur zu gerne unbeachtet bleiben.

Für diejenigen, die mit dem Begriff nicht direkt etwas anfangen können:
Mit der strict Option werden beim Durchsuchen des Arrays die Werte sozusagen mit === statt mit == verglichen, so dass für einen Treffer auch der Typ identisch sein muss.

[pastacode lang=“php“ message=“PHP“ highlight=““ provider=“manual“]

$a = 12;
$b = "12";
if($a == $b) ....; // true
if($a === $b) ....; // false
 
$a = 0;
$b = false;
$c = "";
$d = "0";
if($a == $b) ....; // true
if($b == $d) ....; // true
if($a == $c) ....; // true
if($a == $d) ....; // true
if($c == $d) ....; // Achtung: false!
 
if($a === $b) ....; // false
if($b === $d) ....; // false
if($a === $c) ....; // false
if($a === $d) ....; // false

[/pastacode]

Hier nun die PHP Datei für den Test:

[pastacode lang=“php“ message=“PHP“ highlight=““ provider=“manual“]

function currentTime(){
      $mtime = microtime();
      $mtime = explode(' ', $mtime);
      $mtime = $mtime[1] + $mtime[0];
      return $mtime;
}
 
function rnd_str() {
    $str = '';
    $len = mt_rand(8,25);
    for($i = 1; $i < = $len; $i++) $str .= substr('abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ-__', mt_rand(0, 55), 1);
    return $str;
}
 
$start = currentTime();
 
$arr = array();
for($i=0; $i<500000; $i++){
    $arr["$i"] = rnd_str();
}
$total = currentTime() - $start;
echo "Filling Array took \t$total seconds\n";
 
$search = array();
for($i = 0; $i < 500; $i++) {
    $search[] = $arr[array_rand($arr)];
}
$cnt = count($search);
 
$start = currentTime();
 
for($i = 0; $i < $cnt; $i++) {
    $dummy = array_search($search[$i], $arr);
}
 
$total = currentTime() - $start;
 
echo "array_search " . $cnt . " times took \t$total seconds\n";
 
$start = currentTime();
 
for($i = 0; $i < $cnt; $i++) {
    $dummy = array_search($search[$i], $arr, true);
}
 
$total = currentTime() - $start;
 
echo "strict array_search " . $cnt . " times took \t$total seconds\n";

[/pastacode]

Das Script füllt ein Array mit 500.000 zufälligen Zeichenfolgen und sucht danach 500 dieser zufälligen Zeichenfolgen aus dem Array, natürlich jeweils die gleichen Zeichenfolgen und in der gleichen Reihenfolge.

[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]

php -q test.php
#Filling Array took      16.7446591854 seconds
#array_search 500 times took     21.0517840385 seconds
#strict array_search 500 times took      8.41637516022 seconds

[/pastacode]

Dass es einen Unterschied in der Geschwindigkeit gibt hätte ich erwartet, dass er jedoch so extrem ist nicht.
Getestet habe ich es mit verschiedenen Anzahlen von Zeichenfolgen im Array und Suchvorgängen, da der Zeitaufwand jedoch etwa linear ansteigt ist das Ergebnis zumindest im Verhältnis immer ähnlich.
Bei 50.000 Einträgen im Array und gleicher Suchvorgangszahl lag die Zeit bei etwa 2.1 zu 0.91 Sekunden, also auch hier weniger als die Hälfte.
Die Reihenfolge im Skript (erst strict Suche oder erst normale Suche) ist dabei egal.

Das heißt also: Soweit möglich immer array_search($a, $b, TRUE) verwenden, außer es ist zwingend notwendig, dass bei der Suche nach bspw. false auch 0 gefunden wird oder Ähnliches.

Ach ja, getestet wurde übrigens unter Debian mit PHP 5.3.3-6 CLI.

Dieser Artikel wurde von Marius Burkard verfasst.

Marius Burkard ist Diplom-Wirtschaftsinformatiker und arbeitet seit 2006 als selbstständiger Software-Entwickler und Linux-Server-Administrator mit der Firma pixcept KG. Er ist unter anderem mitverantwortlich für die Projekte Was-lese-ich.de und ISPProtect.

2 Kommentare - bis jetzt!

Eigenen Kommentar verfassen
  1. daze
    schrieb am :

    Hey thx für den Test -> immer gut zu wissen sowas!

  2. Dirk
    schrieb am :

    Wow, vielen Dank! Bei mir läuft ein Skript, dass für 1 Mio. Einträge diverse array_search-Operationen durchführen muss, und dass 300x, die Laufzeit beträgt fast eine Woche. Bisher brauchte ich für 1 Mio. Daten ca. 45min., durch die Verwendung von „strict“ liegt die Laufzeit jetzt knapp unter 40min., was für das gesamte Projekt ca. 30h spart!

Und jetzt du! Deine Meinung?

Erforderliche Felder sind mit einem Asterisk (*) gekennzeichnet. Die E-Mail-Adresse wird nicht veröffentlicht.
  1. Nach Absenden des Kommentar-Formulars erfolgt eine Verarbeitung der von Ihnen eingegebenen personenbezogenen Daten durch den datenschutzrechtlich Verantwortlichen zum Zweck der Bearbeitung Ihrer Anfrage auf Grundlage Ihrer durch das Absenden des Formulars erteilten Einwilligung.
    Weitere Informationen