Performance: in_array vs. isset vs. array_key_exists

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.

array_key_exists isset und in_array performance vergleich
Dieses Diagramm veranschaulicht die Performanceunterschiede zwischen den einzelnen Funktionen.

 


Die unten stehende Tabelle enthält nochmal die absoluten Zahlen der Messergebnisse.

 

Array Sizein_array in msarray_key_exists in msisset 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

Bildschirmfoto 2015-11-26 um 12.07.19
Die Ausgabe des Skripts sieht wie folgt aus.

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Notify me of followup comments via e-mail. You can also subscribe without commenting.