253 Stimmen

Schnellste Weg, um eine Zeichenfolge enthalten eine andere Teilzeichenfolge in JavaScript überprüfen?

Ich arbeite mit einem Leistungsproblem bei JavaScript. Deshalb möchte ich fragen: Was ist der schnellste Weg, um zu prüfen, ob eine Zeichenfolge eine andere Teilzeichenfolge enthält (ich brauche nur den booleschen Wert)? Könnten Sie bitte vorschlagen, Ihre Idee und Beispiel-Code snippet?

0 Stimmen

Fragen Sie nach einer festen Teilzeichenkette, oder benötigen Sie einen regulären Ausdruck (ich bin etwas verwirrt durch die Verwendung der regex Tag)?

1 Stimmen

1 Stimmen

Wie wäre es, die Zeichenkette in ein Array um Leerzeichen herum aufzuteilen und eine Array-Kreuzung durchzuführen? stackoverflow.com/questions/1885557/

417voto

Felix Kling Punkte 751464

Sie haben drei Möglichkeiten:

  1. Regulärer Ausdruck :

     (new RegExp('word')).test(str)
     // or
     /word/.test(str)
  2. indexOf :

     str.indexOf('word') !== -1
  3. includes :

     str.includes('word')

Reguläre Ausdrücke scheinen schneller zu sein (zumindest in Chrome 10).

Leistungstest - kurzer Heuhaufen
Leistungstest - langer Heuhaufen


**Aktualisierung 2011:**

Es lässt sich nicht mit Sicherheit sagen, welche Methode schneller ist. Die Unterschiede zwischen den Browsern sind enorm. Während in Chrome 10 indexOf scheint schneller zu sein, in Safari 5, indexOf ist eindeutig langsamer als jede andere Methode.

Das müssen Sie selbst sehen und ausprobieren. Es hängt von Ihren Bedürfnissen ab. Zum Beispiel eine Groß- und Kleinschreibung wird nicht berücksichtigt Die Suche ist mit regulären Ausdrücken viel schneller.


Update 2018:

Um den Leuten zu ersparen, die Tests selbst durchzuführen, hier die aktuellen Ergebnisse für die gängigsten Browser. Die Prozentsätze geben die Leistungssteigerung gegenüber dem nächstschnelleren Ergebnis an (das von Browser zu Browser variiert):

Chrom: indexOf (~98% schneller) <-- wow
Firefox: RegExp im Cache (~18% schneller)
IE11: RegExp im Cache (~10% schneller)
Rand: indexOf (~18% schneller)
Safari: RegExp im Cache (~0,4% schneller)

Beachten Sie, dass zwischengespeicherte RegExp ist: var r = new RegExp('simple'); var c = r.test(str); im Gegensatz zu: /simple/.test(str)

5 Stimmen

Dies kann nur dann etwas schneller sein, wenn der zu suchende Text vorher bekannt ist (d. h. nicht in einer Variablen gespeichert ist), da die Regex von der JavaScript-Engine während der Parse-Zeit erstellt wird. Wenn Sie nach einer Zeichenkette suchen wollen, die in einer Variablen innerhalb einer anderen Zeichenkettenvariablen enthalten ist, ist indexOf am schnellsten, da Sie ein RegExp-Objekt erstellen und die Zeichenkette verarbeiten müssten, um Sonderzeichen usw. zu umgehen.

2 Stimmen

Erfahrungsgemäß kann indexOf bei der Suche ohne Berücksichtigung der Groß-/Kleinschreibung schneller sein, wenn Sie .toLowerCase für das, was Sie zuerst suchen, verwenden

0 Stimmen

Ich schreibe eine Office 2013 App, mit Microsofts Office Javascript API, und mit indexOf funktioniert nicht. Ich bin mir nicht sicher, warum. Die Verwendung von Regex hingegen schon. Dies ist ein Randfall, aber andere könnten in das gleiche Problem laufen.

59voto

Tính Ngô Quang Punkte 3750

Der Schnellste

  1. (ES6) enthält

    var string = "hello",
    substring = "lo";
    string.includes(substring);
  2. ES5 und älter indexOf

    var string = "hello",
    substring = "lo";
    string.indexOf(substring) !== -1;

http://jsben.ch/9cwLJ

enter image description here

20voto

Stephen Chung Punkte 14323

Funktioniert das für Sie?

string1.indexOf(string2) >= 0

Bearbeiten: Dies ist möglicherweise nicht schneller als ein RegExp, wenn der String2 wiederholte Muster enthält. Auf einigen Browsern kann indexOf viel langsamer sein als RegExp. Siehe Kommentare.

Edit 2: RegExp kann schneller sein als indexOf, wenn die Zeichenketten sehr lang sind und/oder wiederholte Muster enthalten. Siehe Kommentare und die Antwort von @Felix.

0 Stimmen

Aber wie ist das im Vergleich zu anderen Methoden? Ist dies die schnellste oder nur eine von vielen Methoden?

0 Stimmen

Dies sollte schnell sein, da es von JavaScript selbst implementiert wird (d. h. es wird nativer Code ausgeführt). Jede andere Methode, die auf JavaScript-Code basiert, wird langsamer sein. Wenn Sie die genaue Zeichenkette kennen, könnte ein Regex etwas schneller sein (da die JavaScript-Engine nicht die Prototypenkette durchlaufen muss, um .indexOf zu finden).

0 Stimmen

Wenn Sie eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung benötigen, dann müssen Sie definitiv ein RegExp-Objekt erstellen und test .

10voto

zangw Punkte 36978

In ES6 wird die includes() Methode wird verwendet, um festzustellen, ob eine Zeichenkette innerhalb einer anderen Zeichenkette gefunden werden kann, und gibt true o false nach Bedarf.

var str = 'To be, or not to be, that is the question.';

console.log(str.includes('To be'));       // true
console.log(str.includes('question'));    // true
console.log(str.includes('nonexistent')); // false

Hier ist jsperf zwischen

var ret = str.includes('one');

Und

var ret = (str.indexOf('one') !== -1);

Wie das Ergebnis in jsperf zeigt, scheinen beide gut zu funktionieren.

1 Stimmen

Kann ich "regex" innerhalb von includes als Argument verwenden? Zum Beispiel: str.includes("x|y") ; Suche nach den Literalen "x" oder "y" im selben Aufruf.

0 Stimmen

@Patrick, Gemäß dem Include-Dokument können Sie regex darin. Eine Lösung für Ihre Frage, str.includes("x") || str.includes('y')

0 Stimmen

Als Ergebnis der Chrome 59 JavaScript Verbesserungen, indexOf ist deutlich schneller als includes (bis zu 1600% schneller). Es ist unklar, wie ein Unterschied von 44 Millionen Iterationen/Sekunde und 777+ Millionen i/sec auf die reale Leistung auswirkt, ist der Nutzen für den Mobilfunk jedoch wahrscheinlich so groß, dass indexOf sollte die ideale Wahl sein.

7voto

wpg4665 Punkte 131

Ich habe festgestellt, dass die Verwendung einer einfachen for-Schleife, die über alle Elemente in der Zeichenfolge iteriert und den Vergleich mit charAt ist schneller als indexOf o Regex . Der Code und der Nachweis sind verfügbar unter JSPerf .

ETA: indexOf y charAt laut den auf jsperf.com aufgelisteten Browser Scope-Daten schneiden beide auf Chrome Mobile ähnlich schlecht ab

0 Stimmen

Seltsam, dass eine handgefertigte Funktion besser ist als eine eingebaute, aber ich nehme an, das liegt daran, dass die Nadel nur aus einem Zeichen besteht. Trotzdem...

0 Stimmen

Getestet in Chrome Mobile 36.0.1985.57 auf Apple iPad (iOS 7.1.1). IndexOf ist schneller. Entschuldigung

0 Stimmen

@rpax CharAt ist auf allen Plattformen immer noch deutlich schneller (basierend auf dem Verlauf von jsperf) außer für Chrome Mobile, wo sowohl IndexOf als auch CharAt im Vergleich zum Desktop ebenfalls sehr schlecht abschneiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X