每次我必須對字符串進行簡單的遏制或替換操作時,我所搜索的術語是固定值,我發現如果我接受我的示例輸入並對其進行分析,則使用編譯好的常規表達式幾乎總是比使用String類中的等價方法更快。爲什麼C#編譯正則表達式比等效的字符串方法更快?
我已經嘗試比較多種方法(hs
是「大海撈針」來搜索,ndl
是「針」來搜索,repl
是重置價值regex
總是與RegexOptions.Compiled
選項創建):
hs.Replace(ndl, repl)
VSregex.Replace(hs, repl)
hs.Contains(ndl)
VSregex.IsMatch(hs)
我已經發現了不少的討論重點的兩種技術,這更快(1,2,3,和其他的負載),但是這些討論似乎總是集中在:
- 使用字符串版本的簡單複雜操作的操作和正則表達式(從原始性能角度來看,這似乎不一定是個好主意),或者運行一個測試並比較兩者(對於等效測試,正則表達式版本似乎不是總是表現得更好)。
我不明白這可能是這樣的情況:正則表達式引擎如何比較任何兩個字符串的子字符串匹配比等效的字符串版本更快?這似乎適用於非常小或非常大的搜索空間,或搜索詞大小的搜索詞,或者搜索詞在搜索空間的早期還是晚期發生。
那麼,爲什麼是正則表達式更快?
*事實上,只有情況下,我已經成功地顯示字符串版本比編譯正則表達式搜索一個空字符串時,速度更快!任何其他情況下,從單字符字符串到非常長的字符串都會被編譯後的正則表達式比等效字符串方法更快地處理。
更新:加入到澄清,我期待在這裏搜索項在編譯時已知病例的條款。對於動態操作或一次性操作,編譯正則表達式的開銷會傾向於傾斜結果而偏向字符串方法。
我相信你的更好的問題可能是「如果正則表達式更快,爲什麼不使用正則表達式?」。無論如何,我唯一的猜測將會涉及以下任何一項:1.正則表達式編譯需要一些額外的時間,你不會考慮,或2.正則表達式編譯/處理吃更多的內存或什麼,你會得到一個時空權衡。 – zebediah49
@ zebediah49我認爲你是對的,我的問題導致了這個問題 - 但我真的很感興趣爲什麼或如何正則表達式表現更好。 –
近距離選票來自哪裏? –