[英]C# performance of StringBuilder ToString vs String Substring
什么是更快有一個字符串,然后為這個字符串調用子字符串,其中第一個字符串將是初始字符串,每個新的子字符串從初始子字符串中的較小部分,直到它結束? 或者使用StringBuilder從一開始就切斷越來越多,然后總是從收縮的字符串中使用ToString?
此鏈接描述了StringBuilder ToString方法僅在新線程訪問StringBuilder或返回的String遠小於當前分配的空間時才分配新空間。 這聽起來比使用Substring更快。 我可以在.Net Framework 3.5的實現中看到這個邏輯。 對於版本4.0,立即調用FastAllocateString(或多或少與String Substring一樣)。 它是否與以前的框架版本中的邏輯相同,現在只隱藏?
為什么我需要它:
編輯 :更新說明:我有一個字符串和一組用戶給定的正則表達式和上下文。 上下文告訴我哪些正則表達式嘗試與字符串的開頭匹配將是有趣的。 成功匹配后,字符串的開頭現在在最后一場比賽結束之后。 現在可能存在不同的背景。 另外我想知道哪個正則表達式最后一次匹配。 由於這是多次完成,因此性能應該盡可能好。
為了避免搜索整個(剩余)字符串,我會使用start-anchor(^),因此可以盡快進行搜索(在知道開始不匹配之后)。 如果我這樣做,我有一個問題,我不能使用Match方法的start索引參數除了0之外的任何東西。否則,由於錨點,永遠不會有匹配。
所以我認為我現在有兩種可能性:
1)始終在輸入字符串上使用Substring方法並保留和索引當前位置。
2)使用StringBuilder並在成功匹配時始終刪除輸入的開頭。 然后調用ToString方法以查看新的開始是否與下一個Regex匹配。
上述一種或兩種方法的性能是否可以接受,還是有另一種更快的方法?
Edit2:關於StringBuilder和String:正如這里所描述的,StringBuilder的實現現在立即分配空間,而之前這個被延遲,直到StringBuilder字符串被更改(這一直是我的要求的情況)。 所以我認為與Kendall Frey的Regex-only解決方案相比,Substring和ToString都非常慢。
你不需要這樣做。 .NET正則表達式引擎包含一項功能,使您可以使用\\G
錨點匹配緊跟上一個匹配項后的字符串。
示例正則表達式:
\Gcat
示例字符串:
catcatcatdogcat
火柴:
(cat)(cat)(cat)dogcat
編輯:我不認為正則表達式讓你記住多個正則表達式之間的\\G
錨點位置。 相反,您可以使用Regex.Match(string, int)
重載來在某個點開始您的字符串,並使用\\G
錨點來匹配起始位置。
許多字符串操作方法都有開始/結束或開始/長度對的版本。
即Regex.Match可用於匹配子串,這可能比部分切割字符串或插入標記字符更快。
public Match Match(string input, int beginning, int length)
注:與任何性能問題,你需要嘗試變化和衡量自己的數據 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.