[英]looping over char[] or substring(): Efficiency in C#?
你們中的任何人都知道什么會更好:
一種。 獲取一個字符串s
,轉換為char
數組並循環遍歷它,或者
灣 得到一個字符串s
,循環它的子串( s.Substring(i, 1)
)?
任何提示非常感謝。
選項b) ,循環子串,是非常低效的。
最快的方法是
c)使用只讀索引器屬性直接遍歷字符串字符:
for (int i = 0; i < s.Length; i++) { char c = s[i]; ... }
或者,基於IEnumerable<char>
接口:
foreach(char c in s) { ... }
(A)效率更高。 但為什么不這樣做:
foreach (char c in s)
一些快速基准測試表明,這是一個微不足道的(差異<2%)效率低於
for(int i = 0; i < s.Length; ++i)
char c = s[i];
但我的觀點是,前者的可讀性使其優於除了時間最關鍵的代碼之外的任何東西。
這取決於你想要做什么。
您是否只需要檢查特定索引處的字符,或者根據它們創建新字符串或什么?
記住SubString()
將返回一個新字符串。 這可能會導致不必要的開銷,具體取決於您嘗試執行的操作。 更清楚地解釋這個問題會有所幫助。
另外,不要預先優化。 以您感覺更高效的方式編寫代碼。 然后對其進行分析並解決此問題,如果它導致瓶頸。
用研究和/或等待答案的方式用一些大字符串來描述這兩個例程會更快,但如果我不得不猜測我會下注A
b聽起來很奇怪。 只是猜測, 但聲音更快,當然也更容易理解。
編輯:因此,如果你想要索引,你老了
for (int i = 0; i < s.Length; i++)
//Do something with s[i]
會好起來的
或者,對於一些LINQ矯枉過正
s.Select((i, c) => //i being index, c the char, or the other way round, I forget at times);
為什么要將字符串轉換為char數組? String類上有一個索引器,可以讓你獲得各個字符:
char c = s[i];
你究竟在做什么? 當你正在執行的字符串操作有一個優化的方法時,它將超出你提出的任何類型的循環。 舉個簡單的例子:
File.ReadAllLines(...);
...
Regex exp = new Regex(..., RegexOptions.Compiled);
foreach (line)
exp.Match(...);
慢得多:
File.ReadAllText(...);
...
foreach (match in Regex.Match(..., RegexOptions.Multiline))
...
雖然使用子串記住它會給你新的字符串orignal字符串將保持原樣。我想說orignal字符串將保持原樣,因為.NET中斷其字符串,所以未來的實例將拉出相同的不可變字符串實習池,任何性能打擊都可以忽略不計。 在計算機科學中,字符串實習是一種只存儲每個不同字符串值的一個副本的方法,該字符串值必須是不可變的。 實習字符串使得一些字符串處理任務更加節省時間或空間,代價是在創建或實現字符串時需要更多時間。 不同的值存儲在字符串實習池中。 每個字符串的單個副本稱為“實習生”,通常由字符串類的方法查找。 因此,每次創建新字符串時都使用子字符串而不是子字符串選擇for循環選項。
string str = "TestString";
for (int i = 0; i < str.Length; i++)
{
char c = str[i];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.