2010-07-01 157 views
2

我是,目前在.NET 4.0中工作我的第一個項目,它需要幾千個字符串比較(我正在搜索目錄,有時甚至是某些文件的整個驅動器)。大多數情況下,字符串非常短,因爲我只查看文件路徑,所以我只是使用String.Contains()來查看文件路徑字符串是否包含我的針串。什麼時候應該使用Regex而不是String.IndexOf()?或String.Contains()?

我想知道雖然,正則表達式會是一個更好的主意嗎?正則表達式比標準字符串比較更快?它是基於比較的字符串的長度還是比較的字符串的數量?

+3

無論字符串的長度是多少,常規字符串查找操作的性能都優於正則表達式。如果您可以通過常規查找來完成,請使用常規查找。 – Amber 2010-07-01 17:31:48

+4

當IndexOf和Contains不能用於您要查找的內容時。 – Will 2010-07-01 17:36:28

回答

2

它是可變的。比較性能是輸入數據的複雜功能,文化用於比較,區分大小寫和CompareOptions。實例化Regex對象會更昂貴(除非它在Regex緩存中),所以如果您進行了大量的比較,那麼使用起來並不好,我發現它通常比IndexOf()慢,但是YMMV。

請記住,使用Contains/IndexOf時,用戶/線程正在運行的區域將決定如何完成比較。這可能會對性能產生重大影響。並非所有的文化都如此快速。

不變文化是一個非常快速的文化。如果你直接使用CompareInfo,而不是做String.IndexOf(),它仍然會更快。

CultureInfo.InvariantCulture.CompareInfo.IndexOf(..) 

做出正確選擇的唯一方法就是基準測試。這就是說,除非你要通過很多兆字節的字符串,否則對任何人都不會有什麼影響。正如ChrisF早些時候所說的那樣,在這種情況下關注可讀/可維護的代碼。

下面是關於如何充分利用正則表達式的好文章: Optimizing Regular Expression Performance

2

如果你的搜索表達式很簡單,那麼我認爲它不值得移植到正則表達式中 - 無論你在編碼和閱讀方面有多好,當你(或者更重要的是)需要更多的時間來理解代碼時,另外一些人)在6個月的時間內再看一遍。

如果速度的提高只能保持較小的可讀性和可維護性代碼。

1

我只是猜測,但我懷疑,對於簡單的字符串搜索會出現在String.Contains()String.IndexOf()和正則表達式之間的性能差別不大(如果有的話,我猜想,正則表達式絕不會更快,但可能會比較慢以微乎其微的量)。

除非您的要求(或成爲)使您需要匹配比子串更復雜的東西,否則不應該考慮移動到正則表達式。

0

在.NET 4.0中沒有與問題String.IndexOf致電看到修補程序2467309,它可以幫助你決定你的答案。

相關問題