PHP array_search() Performance verbessern durch STRICT search
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.
Hey thx für den Test -> immer gut zu wissen sowas!
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!