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"; ?>
					




