2009-06-17 44 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

更糟的是,你在循環的每次迭代中創建一個新的正則表達式對象 - 在循環外部定義一次,或將其作爲參數傳遞。

此外,對於此用途,測試匹配更好和更快。