Estoy trabajando con un problema de rendimiento en JavaScript. Entonces, solo quiero preguntar: ¿cuál es la forma más rápida de verificar si una cadena contiene otra subcadena (solo necesito el valor booleano)? ¿Podría sugerir su idea y un código de fragmento de muestra?
javascript
regex
substring
Đinh Hồng Châu
fuente
fuente
regex
etiqueta)?Respuestas:
Tienes dos posibilidades:
Expresión regular :
indexOf
:Las expresiones regulares parecen ser más rápidas (al menos en Chrome 10).Prueba de rendimiento: pajar corto
Prueba de rendimiento: pajar largo
Actualización 2011:
No se puede decir con certeza qué método es más rápido. Las diferencias entre los navegadores son enormes. Mientras que en Chrome 10
indexOf
parece ser más rápido, en Safari 5,indexOf
es claramente más lento que cualquier otro método.Tienes que ver y probar por ti mismo. Depende de tus necesidades. Por ejemplo, una búsqueda que no distingue entre mayúsculas y minúsculas es mucho más rápida con expresiones regulares.
Actualización 2018:
Solo para evitar que las personas ejecuten las pruebas ellos mismos, estos son los resultados actuales para los navegadores más comunes, los porcentajes indican un aumento en el rendimiento sobre el siguiente resultado más rápido (que varía entre navegadores):
Chrome: indexOf (~ 98% más rápido)
<-- wow
Firefox: RegExp en caché (~ 18% más rápido)
IE11: RegExp en caché (~ 10% más rápido)
Edge: indexOf (~ 18% más rápido)
Safari: RegExp en caché (~ 0.4% más rápido)
Tenga en cuenta que RegExp en caché es:
var r = new RegExp('simple'); var c = r.test(str);
en lugar de:/simple/.test(str)
fuente
indexOf
no funciona. No estoy seguro de por qué. Sin embargo, usar Regex sí. Este es un caso extremo, pero otros podrían encontrarse con el mismo problema.¿Esto funciona para tí?
Editar: Esto puede no ser más rápido que un RegExp si la cadena2 contiene patrones repetidos. En algunos navegadores, indexOf puede ser mucho más lento que RegExp. Ver comentarios.
Edición 2: RegExp puede ser más rápido que indexOf cuando las cadenas son muy largas y / o contienen patrones repetidos. Ver comentarios y la respuesta de @ Felix.
fuente
test
.indexOf
es una magnitud más lenta que cualquier otro método. Por lo tanto, en realidad no se puede decir qué método es más rápido. Varía de un navegador a otro.El más rápido
http://jsben.ch/9cwLJ
fuente
En ES6, el
includes()
método se utiliza para determinar si una cadena se puede encontrar dentro de otra cadena, regresandotrue
ofalse
según corresponda.Aquí está jsperf entre
Y
Como se muestra en jsperf, parece que ambos funcionan bien.
fuente
str.includes("x|y")
; busque los literales "x" o "y" en la misma llamada.regex
. Unastr.includes("x") || str.includes('y')
indexOf
es significativamente más rápido queincludes
(más de 1600% más rápido). No está claro cómo una diferencia de 44 millones de iteraciones / seg y 777+ millones de i / seg afecta el rendimiento del mundo real, sin embargo, es probable que los dispositivos móviles se beneficien lo suficiente comoindexOf
para ser la opción ideal.Descubrí que usar un bucle for simple, iterar sobre todos los elementos de la cadena y comparar el uso se
charAt
realiza más rápido queindexOf
oRegex
. El código y la prueba están disponibles en JSPerf .ETA:
indexOf
ycharAt
ambos funcionan de manera similar en Chrome Mobile según los datos del alcance del navegador que figuran en jsperf.comfuente
Para encontrar una cadena simple, usar el método indexOf () y usar regex es más o menos lo mismo: http://jsperf.com/substring , así que elija el que parezca más fácil de escribir.
fuente
Hice un jsben.ch para ti http://jsben.ch/#/aWxtF ... parece que indexOf es un poco más rápido.
fuente
Es una manera fácil de usar el
.match()
método para encadenar.¡Le deseo un buen día, señor!
fuente
match
cuando hay untest
método ... Mira la respuesta principal.