Estou trabalhando com um problema de desempenho em JavaScript. Então, eu só quero perguntar: qual é a maneira mais rápida de verificar se uma string contém outra substring (eu só preciso do valor booleano)? Você poderia sugerir sua ideia e ter um exemplo de código de trecho?
javascript
regex
substring
Ồinh Hồng Châu
fonte
fonte
regex
tag)?Respostas:
Você tem duas possibilidades:
Expressão regular :
indexOf
:Expressões regulares parecem ser mais rápidas (pelo menos no Chrome 10).Teste de desempenho - palheiro curto
Teste de desempenho - palheiro longo
Atualização de 2011:
Não se pode dizer com certeza qual método é mais rápido. As diferenças entre os navegadores são enormes. Enquanto no Chrome 10
indexOf
parece ser mais rápido, no Safari 5,indexOf
é claramente mais lento que qualquer outro método.Você tem que ver e tentar por si mesmo. Isso depende de suas necessidades. Por exemplo, uma pesquisa que não diferencia maiúsculas de minúsculas é muito mais rápida com expressões regulares.
Atualização 2018:
Apenas para evitar que as pessoas executem os testes, aqui estão os resultados atuais dos navegadores mais comuns, as porcentagens indicam um aumento de desempenho em relação ao próximo resultado mais rápido (que varia entre os navegadores):
Chrome: indexOf (~ 98% mais rápido)
<-- wow
Firefox: RegExp em cache (~ 18% mais rápido)
IE11: RegExp em cache (~ 10% mais rápido)
Edge: indexOf (~ 18% mais rápido)
Safari: RegExp em cache (~ 0.4% mais rápido)
Observe que o RegExp em cache é:
var r = new RegExp('simple'); var c = r.test(str);
ao contrário de:/simple/.test(str)
fonte
indexOf
não funciona. Não sei por que. Usando Regex embora. Este é um caso extremo, mas outros podem ter o mesmo problema.Isso funciona para você?
Editar: isso pode não ser mais rápido que um RegExp se a string2 contiver padrões repetidos. Em alguns navegadores, indexOf pode ser muito mais lento que o RegExp. Ver comentários.
Edit 2: RegExp pode ser mais rápido que indexOf quando as strings são muito longas e / ou contêm padrões repetidos. Veja os comentários e a resposta de @ Felix.
fonte
test
.indexOf
é uma magnitude mais lenta que qualquer outro método. Portanto, não se pode dizer qual método é mais rápido. Varia de navegador para navegador.O mais rápido
http://jsben.ch/9cwLJ
fonte
No ES6, o
includes()
método é usado para determinar se uma sequência pode ser encontrada dentro de outra, retornandotrue
oufalse
conforme apropriado.Aqui está jsperf entre
E
Como o resultado mostrado no jsperf, parece que os dois apresentam bom desempenho.
fonte
str.includes("x|y")
:; procure os literais "x" ou "y" na mesma chamada.regex
-lo. Uma solução para sua pergunta,str.includes("x") || str.includes('y')
indexOf
é significativamente mais rápido queincludes
(acima de 1600% mais rápido). Não está claro como uma diferença de 44 milhões de iterações / s e mais de 777 milhões de i / s afeta o desempenho do mundo real; no entanto, os dispositivos móveis provavelmente se beneficiam o suficiente eindexOf
devem ser a escolha ideal.Descobri que usar um loop for simples, iterando sobre todos os elementos da string e comparando o
charAt
desempenho é mais rápido queindexOf
ouRegex
. O código e a prova estão disponíveis no JSPerf .ETA:
indexOf
echarAt
ambos têm desempenho semelhante no Chrome Mobile, de acordo com os dados do escopo do navegador listados em jsperf.comfonte
Para encontrar uma string simples, usar o método indexOf () e usar regex é praticamente o mesmo: http://jsperf.com/substring - então escolha qual deles parecer mais fácil de escrever.
fonte
Eu fiz um jsben.ch para você http://jsben.ch/#/aWxtF ... parece que indexOf é um pouco mais rápido.
fonte
É uma maneira fácil de usar o
.match()
método para string.Desejo-lhe um bom dia, senhor!
fonte
match
quando existe umtest
método ... Confira a resposta principal.