Pracuję z problemem wydajności w JavaScript. Chcę tylko zapytać: jaki jest najszybszy sposób sprawdzenia, czy ciąg zawiera inny podciąg (potrzebuję tylko wartości logicznej)? Czy mógłbyś zasugerować swój pomysł i przykładowy fragment kodu?
javascript
regex
substring
Đinh Hồng Châu
źródło
źródło
regex
tagu)?Odpowiedzi:
Masz dwie możliwości:
Wyrażenie regularne :
indexOf
:Wyrażenia regularne wydają się być szybsze (przynajmniej w Chrome 10).Test wydajności - krótki stóg siana
Test wydajności - długi stóg siana
Aktualizacja 2011:
Nie można z całą pewnością stwierdzić, która metoda jest szybsza. Różnice między przeglądarkami są ogromne. Podczas gdy w Chrome 10
indexOf
wydaje się być szybszy, w Safari 5indexOf
jest wyraźnie wolniejszy niż jakakolwiek inna metoda.Musisz zobaczyć i spróbować samemu. To zależy od Twoich potrzeb. Na przykład wyszukiwanie bez rozróżniania wielkości liter jest znacznie szybsze w przypadku wyrażeń regularnych.
Aktualizacja 2018:
Aby uchronić ludzi przed samodzielnym przeprowadzaniem testów, oto aktualne wyniki dla większości popularnych przeglądarek, wartości procentowe wskazują wzrost wydajności w stosunku do następnego najszybszego wyniku (który różni się w zależności od przeglądarki):
Chrome: indexOf (~ 98% szybciej)
<-- wow
Firefox: buforowany RegExp (~ 18% szybciej)
IE11: buforowany RegExp (~ 10% szybciej)
Edge: indexOf (~ 18% szybciej)
Safari: buforowany RegExp (~ 0,4% szybciej)
Zauważ, że buforowane wyrażenie RegExp to:
var r = new RegExp('simple'); var c = r.test(str);
w przeciwieństwie do:/simple/.test(str)
źródło
indexOf
nie działa. Nie wiem dlaczego. Korzystanie z Regex jednak tak. Jest to skrajny przypadek, ale inni mogą napotkać ten sam problem.Czy to działa dla Ciebie?
Edycja: może to nie być szybsze niż RegExp, jeśli ciąg 2 zawiera powtarzające się wzorce. W niektórych przeglądarkach indexOf może działać znacznie wolniej niż RegExp. Zobacz komentarze.
Edycja 2: RegExp może być szybsze niż indexOf, gdy ciągi są bardzo długie i / lub zawierają powtarzające się wzorce. Zobacz komentarze i odpowiedź @ Felix.
źródło
test
.indexOf
jest wielkością wolniejszą niż jakakolwiek inna metoda. Nie można więc powiedzieć, która metoda jest szybsza. To zależy od przeglądarki.Najszybszy
http://jsben.ch/9cwLJ
źródło
W ES6
includes()
metoda jest używana do określenia, czy jeden ciąg można znaleźć w innym ciągu, zwracająctrue
lubfalse
odpowiednio.Tutaj jest jsperf pomiędzy
I
Jak widać w jsperf, wydaje się, że oba działają dobrze.
źródło
str.includes("x|y")
:; wyszukaj literały „x” lub „y” w tym samym wywołaniu.regex
w nim używać . Jedno obejście dla twojego pytaniastr.includes("x") || str.includes('y')
indexOf
jest znacznie szybszy niżincludes
(do 1600% szybciej). Nie jest jasne, w jaki sposób różnica 44 milionów iteracji / s i ponad 777 milionów i / s wpływa na rzeczywistą wydajność, jednak mobilność prawdopodobnie przynosi wystarczające korzyści, żeindexOf
powinien być idealnym wyborem.Zauważyłem, że używanie prostej pętli for, iterowanie po wszystkich elementach ciągu i porównywanie za pomocą
charAt
działa szybciej niżindexOf
lubRegex
. Kod i dowód są dostępne w JSPerf .ETA:
indexOf
icharAt
oba działają podobnie strasznie w Chrome Mobile zgodnie z danymi zakresu przeglądarki wymienionymi na jsperf.comźródło
Aby znaleźć prosty łańcuch, użycie metody indexOf () i użycie wyrażenia regularnego jest prawie takie samo: http://jsperf.com/substring - wybierz więc ten, który wydaje się łatwiejszy do napisania.
źródło
Zrobiłem dla ciebie jsben.ch http://jsben.ch/#/aWxtF ... wydaje się, że indexOf jest trochę szybszy.
źródło
Jest to łatwy sposób na użycie
.match()
metody do stringów.Życzę miłego dnia, sir!
źródło
match
kiedy istniejetest
metoda… Sprawdź najlepszą odpowiedź.