Neulich wurde ich von einem Kollegen darauf aufmerksam gemacht, wie wenig Performance die Funktion in_array() doch bietet. Dass diese Funktion nicht die „hochperformanteste” ist, war mir schon klar, doch wie langsam/schnell ist sie im Vergleich zu anderen Funktionen?
In diesem Test möchte ich die drei Funktionen isset(), array_key_exists() und in_array() testen und beweisen, dass die Funktion in_array() nicht immer die klügste Wahl ist. Anhand eines Beispiels möchte ich euch zeigen, dass man nicht immer die Funktion in_array() benutzen muss.
Performancevergleich – in_array vs. isset vs. array_key_exists
Mal angenommen, wir haben folgendes Array:
array("Apfel", "Birne", "Pfirsich");
Um nun zu testen, ob das Array ein Element “Apfel” enthält, würden wir für gewöhnlich folgende Abfrage machen:
if (in_array("Apfel", $array))
An diese Stelle möchte ich euch nun auf die Grafik aufmerksam machen. Wie man unschwer erkennen kann, steigt die Laufzeit für die Funktion in_array() exponentiell an mit zunehmender Menge an Elementen.
Die unten stehende Tabelle enthält nochmal die absoluten Zahlen der Messergebnisse.
Array Size | in_array in ms | array_key_exists in ms | isset in ms |
1 |
7 |
6 |
5 |
10 |
9 |
6 |
4 |
50 |
21 |
6 |
4 |
100 |
35 |
6 |
4 |
1.000 |
334 |
6 |
4 |
5.000 |
1.642 |
6 |
5 |
15.000 |
5.228 |
6 |
4 |
50.000 |
34.623 |
8 |
6 |
Und hier nun das Skript, mit welchem die Testergebnisse durchgeführt wurden.
<?php $array = array(); for ($i=0; $i<50000; $i++) $array[$i] = rand(0,1000000); $time1 = microtime(true); for ($i=0; $i<10000; $i++) in_array(rand(0,100000),$array); echo "in_array(): ".round((microtime(true)-$time1)*1000, 0)."ms\n"; $time2 = microtime(true); for ($i=0; $i<10000; $i++) array_key_exists(rand(0,100000), $array); echo "array_key_exists(): ". round((microtime(true)-$time2)*1000, 0)."ms\n"; $time3 = microtime(true); for ($i=0; $i<10000; $i++) isset($array[rand(0,100000)]); echo "isset(): ". round((microtime(true)-$time3)*1000, 0)."ms\n"; ?>