Optimierung bei der Suche eines Vorkommnisses im String

Bei der simplen Suche nach Vorkommnis eines Teilstrings in einem Gesamtstring stehen die beiden Funktionen strstr() und strpos bereit. Da strstr() im Erfolgsfall einen String zurückgibt und strpos() eine integere Zahl als Rückgabewert liefert, ist davon auszugehen, dass strpos() die schnellere Variante ist. Wir vergleichen die Ausführzeiten anhand von Benchmarks mit folgenden kleinen PHP-Scripts.

Erstes von 10 Zeichen im String, strpos()

Code:

<?php
$teilstring = "a";
$gesamtstring = "abcdefghij";
for ($i = 0;$i < 10000;$i++) {
    if (strpos($gesamtstring, $teilstring) !== false) {
        echo "ja";
    }
}
?>

Erläuterung:
Der zu untersuchende Gesamtstring enthält den gesuchten Teilstring an der ersten von 10 Stellen. Innerhalb einer for()-Schleife wird die String-Suche 10.000mal mit strpos() durchgeführt. Wird der Teilstring im Gesamtstring gefunden, wird via echo das Wort ja ausgegeben.

Erstes von 10 Zeichen im String, strstr()

Code:

<?php
$teilstring = "a";
$gesamtstring = "abcdefghij";
for ($i = 0;$i < 10000;$i++) {
    if (strstr($gesamtstring, $teilstring)) {
        echo "ja";
    }
}
?>

Erläuterung:
Das zweite Beispiel-Script wird gegenüber dem ersten dahingehend geändert, dass die Suche nicht mehr mit strpos(), sondern mit strstr() durchgeführt wird.

Letztes von 10 Zeichen im String, strpos()

Code:

<?php
$teilstring = "j";
$gesamtstring = "abcdefghij";
for ($i = 0;$i < 10000;$i++) {
    if (strpos($gesamtstring, $teilstring) !== false) {
        echo "ja";
    }
}
?>

Erläuterung:
Das dritte Beispiel-Script ist äquivalent zum ersten Beispiel mit dem Unterschied, dass der gesuchte Teilstring nicht mehr am Anfang, sondern am Ende des zu untersuchenden Teilstrings steht.

Letztes von 10 Zeichen im String, strstr()

Code:

<?php
$teilstring = "j";
$gesamtstring = "abcdefghij";
for ($i = 0;$i < 10000;$i++) {
    if (strstr($gesamtstring, $teilstring)) {
        echo "ja";
    }
}
?>

Erläuterung:
Die gleiche Änderung der Position des gesuchten Teilstrings wird im vierten Beispiel-Script gegenüber dem zweiten Beispiel vorgenommen. Die Suche auf Vorgekommnis erfolgt hier wieder mit strstr().

Ergebnis

Requests per second (RPS)Time per Request (TPR)Vergleich
Erstes von 10 Zeichen im String, strpos()78.82 [#/sec] (mean)12.688 [ms] (mean)
7.2%
6.7%
Erstes von 10 Zeichen im String, strstr()73.56 [#/sec] (mean)13.594 [ms] (mean)
Letztes von 10 Zeichen im String, strpos()79.21 [#/sec] (mean)12.625 [ms] (mean)
7.7%
7.1%
Letztes von 10 Zeichen im String, strstr()75.21 [#/sec] (mean)13.297 [ms] (mean)
2.2%
2.2%

Die Suche via strpos() benötigt in unserem Benchmark rund 7% weniger Zeit als das Durchsuchen des Strings mit strstr().

Fazit

Wenn es um die simple Untersuchung eines Strings auf Vorkommen eines Teilstrings geht, ist strpos() die richtige Wahl. Die Funktion ist schneller und weniger Speicherintensiv als strstr(). Zu beachten gilt, dass strpos() Groß-/Kleinschreibung berücksichtigt. Soll bei der Suche Groß-/Kleinschreibung nicht berücksichtigt werden, ist stripos() der Verwendung von stristr() vorzuziehen.

 

Anmerkung:
Die Tests wurden mit dem Apache HTTP server benchmarking tool ab auf einem im Februar 2017 nicht mehr dem Stand der Technik entsprechenden Server durchgeführt. Die RPS und TPR der getesteten PHP-Scripte sollten auf einem im Produktiv-Einsatz befindlichen Webserver deutlich besser sein.