Was ist der schnellste Weg, um das Auftreten einer Zeichenfolge in einer anderen Zeichenfolge zu finden? [Duplikat]

8

Hallo!

Können Sie mir sagen, welche schneller ist :
strstr($mystring, $findme);
ODER
strpos($mystring, $findme);
ODER
alles andere

beim Finden des - ersten oder beliebigen - Auftretens eines Strings in einem anderen?

Spielt es sogar eine Rolle, wenn ich das Vorkommen in einem Modus ohne Berücksichtigung der Groß- und Kleinschreibung mit stristr() überprüfe. ODER stripos() ?

In meinem Fall spielt es keine Rolle, in welcher exakten Position die gegebene Zeichenkette ist (falls vorhanden), oder wie oft sie in der anderen auftritt (falls vorhanden), die einzige wichtige Frage ist, ob sie überhaupt existiert andere Zeichenfolge.

Ich habe in verschiedenen Artikeln bereits einige Kommentare über Geschwindigkeitsunterschiede gefunden (zB auf php.net jemand sagt strstr () ist schneller für den Fall, dass es einen! == false check nach strpos gibt, aber jetzt kann ich nicht entscheiden, was wahr ist.

Wenn Sie bessere Methoden kennen, um einen String in einem anderen zu suchen, lassen Sie es mich wissen!

Vielen Dank für die relevanten Kommentare!

============

Ein Beispiel:

%Vor%     
Sk8erPeter 28.04.2011, 15:55
quelle

7 Antworten

21

strpos scheint an der Spitze zu sein, ich habe es getestet, indem ich ein paar Strings in 'The quick brown fox jumps over the lazy dog' gefunden habe:

  • strstr verwendet 0,48487210273743 Mikrosekunden für 1000000 Iterationen 'quick' finden
  • strpos verwendet 0.40836095809937 Mikrosekunden für 1000000 Iterationen 'quick' finden
  • strstr verwendet 0,45261287689209 Mikrosekunden für 1000000 Iterationen, die 'dog' finden
  • strpos verwendet 0.39890813827515 Mikrosekunden für 1000000 Iterationen 'dog' finden
%Vor%     
pintxo 28.04.2011, 16:13
quelle
14

Aus den PHP-Dokumenten :

  

Hinweis:

     

Wenn Sie nur bestimmen möchten, ob a   bestimmte Nadel tritt innerhalb auf   Heuhaufen, benutze die schneller und weniger   speicherintensive Funktion strpos ()   stattdessen.

Ich bin bereit, ihr Wort dafür zu nehmen:)

    
Jason McCreary 28.04.2011 16:00
quelle
6

Der schnellere Weg ist:

%Vor%

Die case insensitive Versionen sollten natürlich langsamer sein (mindestens 2x langsamer, erwarte ich).

strncmp() / substr() kann möglicherweise besser funktionieren iff Sie überprüfen, ob $haystack beginnt mit $needle und wenn $haystack sehr lang ist (& gt; Hunderte Zeichen oder so).

Benchmark:

Siehe andere Benchmarks @ Ссылка (Suche nach strpos ).

Ein praktisches Beispiel, wo diese Art von Optimierungen (Art von) wichtig ist - Berechnung von Hashcases :

%Vor%     
Alix Axel 28.04.2011 16:00
quelle
2

Laut den PHP-Manpages ist strpos schneller und weniger speicherintensiv als strstr.

    
Arjan 28.04.2011 16:04
quelle
0

Trickfrage. Sie machen zwei verschiedene Dinge. Einer gibt den Teilstring zurück, der andere gibt die Startposition des Teilstrings mit dem String zurück. Die wirkliche Antwort ist, dass Sie Äpfel mit Orangen vergleichen, welche Sie brauchen.

    
Crayon Violent 28.04.2011 16:01
quelle
0

Wenn die Zeichenfolge A, nach der Sie ein Muster B suchen möchten, am schnellsten ist, einen Suffixbaum von A zu erstellen und dagegen zu suchen, sucht nach B.

    
akappa 28.04.2011 16:03
quelle
0

Ich würde denken, dass strpos() schneller wäre, weil es nur eine ganze Zahl zurückgibt (oder false , wenn keine Übereinstimmung gefunden wurde). strstr() gibt eine Zeichenfolge zurück, die den gesamten Text nach und einschließlich der ersten Übereinstimmung enthält.

Für case-insensitive Suchvorgänge würde ich denken, dass diese etwas langsamer wären, weil sie zusätzliche Prüfungen durchführen müssen ("passen die zwei Zeichen überein? Wenn nein, ist das Zeichen ein Buchstabe? Wenn ja, stimmt es mit der Kleinbuchstabenversion überein ? Wenn nein, stimmt es mit der Großschreibung überein? ", usw.)

    
Michael 28.04.2011 16:07
quelle

Tags und Links