Quelles sont les performances supérieures utilisées dans les grandes boucles: .indexOf (str) ou .match (regex)?

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

Question

J'ai ce tableau.prototype sur ma page et il semble y avoir beaucoup de temps de traitement:

        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;
        }
Était-ce utile?

La solution

Tout d’abord, vous savez que vous n’avez pas besoin du "". *". de chaque côté, non? Une expression régulière déjà par défaut correspondra n'importe où dans la chaîne. Deuxièmement, si vous recherchez simplement une chaîne constante et que vous n'avez pas besoin d'utiliser les éléments avancés proposés par les expressions régulières, il est nettement plus rapide d'utiliser .indexOf () . De plus, vous n'aurez pas à vous inquiéter des caractères d'échappement ayant une signification particulière.

Autres conseils

Les expressions régulières peuvent varier énormément. J'imagine qu'une expression régulière simple et bien conçue peut fonctionner aussi vite ou plus rapidement que indexOf (). Par ailleurs, une expression régulière complexe aurait besoin de plus de temps car elle demande plus de travail.

Vous avez également un problème d’implémentation de navigateur qui ne tient pas. À moins d’écrire une boucle chronométrée pour mesurer le temps pris par chaque navigateur pour effectuer chaque type de détection avec vos besoins spécifiques, vous ne pouvez pas vraiment obtenir une réponse solide.

Pire, vous créez un nouvel objet d’expression régulière à chaque itération de la boucle. définissez-le une fois, en dehors de la boucle, ou transmettez-le en tant qu'argument.

De même, pour cette utilisation, le test est meilleur et plus rapide que la correspondance .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top