2009-06-17 1 views
2

Ich habe diese Array.prototype auf meiner Seite und es scheint eine Menge Verarbeitungszeit Saugen bis werden:Was hat eine höhere Leistung in großen Schleifen verwendet: .IndexOf (str) oder .match (Regex)?

 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; 
     } 
+0

Warum tust du es nicht in beide Richtungen? Ich vermute, dass indexOf in den meisten Fällen schneller sein wird, aber es ist besser zu testen als zu vermuten. –

+0

Vergessen Sie nicht, dass jede Umgebung anders sein kann. Zeit es in Firefox und Sie können ein anderes Ergebnis als in Opera, Chrome oder Safari wetten. Ich würde es im Internet Explorer tun, da es das Gerümpel der Packung ist - schnell in IE und es sollte überall sonst schnell sein. – Nosredna

Antwort

10

Als erstes wissen Sie, dass Sie nicht das ". *" Auf beiden Seiten haben müssen, richtig? Ein regulärer Ausdruck wird standardmäßig bereits überall in der Zeichenfolge gefunden. Zweitens, wenn Sie nur nach einer konstanten Zeichenkette suchen und keine der erweiterten Funktionen verwenden müssen, die reguläre Ausdrücke bieten, ist es definitiv schneller, .indexOf() zu verwenden. Auf diese Weise müssen Sie sich keine Gedanken über die Flucht von Charakteren machen, die eine besondere Bedeutung haben.

+5

+1 Ich kann mir nicht vorstellen, wie ein regulärer Ausdruck indexOf schlagen könnte. Wenn Sie Regex-Power nicht benötigen, verwenden Sie Regex nicht. –

0

Reguläre Ausdrücke stark variieren kann. Ich stelle mir vor, dass ein einfacher, gut ausgearbeiteter regulärer Ausdruck so schnell oder schneller funktioniert als indexOf(). Auf der anderen Seite würde ein komplexer regulärer Ausdruck mehr Zeit benötigen, da er mehr Arbeit leistet.

Sie haben auch ein Browser-Implementierungsproblem Trübung Angelegenheiten. Kurz vor dem Schreiben einer zeitgesteuerten Schleife, um die Zeit zu messen, die jeder Browser benötigt, um jede Art von Erkennung mit Ihren spezifischen Bedürfnissen durchzuführen, können Sie nicht wirklich eine solide Antwort erhalten.

0

Schlimmer ist, Sie erstellen ein neues Objekt für reguläre Ausdrücke bei jeder Iteration der Schleife- definieren Sie es einmal, außerhalb der Schleife, oder übergeben Sie es als ein Argument.

Auch für diese Verwendung Test ist besser und schneller als übereinstimmen.