2015-08-19 27 views
0

我看到的indexOf快,當你按這裏的解決方案JavaScript: indexOf vs. Match when Searching Strings?的Javascript:正則表達式的IndexOf VS關鍵字清單掃描時

但是掃描對一個字,如果你有一個清單說5關鍵字,並且您想要計算每個關鍵字的出現次數(假定每個單詞在大字符串中只出現一次)。

下面會更快嗎?

var list1 = ['word1', 'word2','word3','word4','word5']; 
for (var i = 0; i < list1.length; i++){ 
    if (exampleLargeText.indexOf(list1[i]) > -1){ 
    keywordCounter++; 
    } 
} 

VS ....

var keywordRegex = 'word1|word2|word3|word4|word5']; 
var keywordCounter = exampleLargeText.toLowerCase().match(new RegExp(SUBMIT_ELEMENT_REGEX , "ig")) || []).length 

是的indexOf()仍然較快,儘管你在這裏掃描exampleLargeText 5倍的事實呢?

+6

測試它。這是找出答案的唯一方法。 – Bergi

回答

2

/aaa|bbb|ccc/這樣的正則表達式不會比簡單(但仍然相似,3個字符)的表達式如/abc/更有效。這是因爲正則表達式引擎匹配從左到右。最簡單的比賽將是'aaa'的第一個和'abc'的第二個......每一個都需要3個步驟。現在,想象一下,您嘗試將'aabbccx'與兩個表達式匹配。第一個表達式總共需要33個步驟,第二個表達式需要5個步驟,這是因爲每個交替(由|表示)強制正則表達式引擎重新開始。在Regex101這樣的工具上玩這個遊戲。

不過,如果你能夠讓你的正則表達式不僅僅是單獨檢查每個字優化,有機會能擊敗.indexOf()。例如,如果您的表達式確實是/word1|word2|word3|word4|word5/,則可以將其重寫爲/word[1-5]/。這比單獨查找每個單詞更有效,因爲現在表達式是以簡單模式定義的。但是,誰知道,.indexOf()仍然可能會更快,這取決於開銷。

這就是基準測試進行時 - 使用jsPerf

+0

Gotcha。謝謝。 – Arrow