2009-06-17 64 views
2

我有我的网页上这array.prototype和它似乎是占用了大量的处理时间:大循环中使用的性能更高:.indexOf(str)或.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

你为什么不在这两种方式上时间?我怀疑在大多数情况下indexOf会更快,但测试比猜测更好。 – 2009-06-17 17:10:38

+0

不要忘记,每个环境都可以不同。在Firefox中停留一段时间,您可能会获得与Opera,Chrome或Safari不同的结果。我会在Internet Explorer中记录它的时间,因为它是这个软件包的缺点 - 在IE中快速使用它,而且在其他地方应该足够快。 – Nosredna 2009-06-17 17:13:34

回答

10

首先,你知道你不必在任何一方都有“。*”,对吧?正则表达式默认情况下会匹配字符串中的任何位置。其次,如果您只是搜索一个常量字符串,并且不需要使用正则表达式提供的任何高级内容,那么使用.indexOf()肯定会更快。此外,您不必担心逃脱具有特殊含义的角色。

0

正则表达式可以变化很大。我想象一个简单的,精心制作的正则表达式可能比indexOf()更快或更快。另一方面,复杂的正则表达式需要更多的时间,因为它正在做更多的工作。

您也有一个浏览器实现问题混淆事项。在编写定时循环来衡量每个浏览器根据您的特定需求执行每种类型的检测所需的时间之前,您无法真正得到确凿的答案。

0

更糟的是,你在循环的每次迭代中创建一个新的正则表达式对象 - 在循环外部定义一次,或将其作为参数传递。

此外,对于此用途,测试匹配更好和更快。