¿Qué tiene un mayor rendimiento utilizado en los bucles grandes: .indexOf (str) o .match (regex)?

StackOverflow https://stackoverflow.com/questions/1008364

Pregunta

Tengo este array.prototype en mi página y parece estar consumiendo mucho tiempo de procesamiento:

        Array.prototype.findInArray = function(searchStr) {
          var returnArray = false;
          for (i=0; i<this.length; i++) {
            if (typeof(searchStr) == 'function') {
              if (searchStr.test(this[i])) {
                if (!returnArray) { returnArray = [] }
                returnArray.push(i);
              }
            } else {
              var regexp = new RegExp(".*" + searchStr + ".*");
              if (this[i].match(regexp)) {
                if (!returnArray) { returnArray = [] }
                returnArray.push(i);
              }
            }
          }
          return returnArray;
        }
¿Fue útil?

Solución

Antes que nada, sabes que no tienes que tener el ". * " a ambos lados, ¿verdad? Una expresión regular ya por defecto coincidirá en cualquier lugar dentro de la cadena. En segundo lugar, si solo está buscando una cadena constante y no necesita usar ninguna de las cosas avanzadas que ofrecen las expresiones regulares, entonces definitivamente es más rápido usar .indexOf () . Además, de esa manera no tendrá que preocuparse por escapar de personajes que tienen un significado especial.

Otros consejos

Las expresiones regulares pueden variar enormemente. Me imagino que una expresión regular simple y bien diseñada podría funcionar tan rápido o más rápido que indexOf (). Por otro lado, una expresión regular compleja necesitaría más tiempo ya que está haciendo más trabajo.

También tiene un problema de implementación del navegador que nubla cuestiones. Si no se escribe un ciclo cronometrado para medir el tiempo que le toma a cada navegador realizar cada tipo de detección con sus necesidades específicas, realmente no puede obtener una respuesta sólida.

Lo que es peor es que crea un nuevo objeto de expresión regular en cada iteración del bucle. defínalo una vez, fuera del ciclo, o páselo como argumento.

Además, para este uso, prueba es mejor y más rápido que coincidencia .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top