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

regexetiqueta)?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
indexOfparece ser más rápido, en Safari 5,indexOfes 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)
<-- wowFirefox: 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
indexOfno 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.indexOfes 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
var cadena = "hola", substring = "lo"; string.includes (subcadena);var cadena = "hola", substring = "lo"; string.indexOf (substring)! == -1;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, regresandotrueofalsesegú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')indexOfes 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 comoindexOfpara 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
charAtrealiza más rápido queindexOfoRegex. El código y la prueba están disponibles en JSPerf .ETA:
indexOfycharAtambos 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
matchcuando hay untestmétodo ... Mira la respuesta principal.