簡體   English   中英

StringBuilder ToString與String Substring的C#性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM