2011-11-25 74 views
1

我想解析一個大的文本字符串。我需要將原始字符串拆分爲15個字符的塊(並且下一個塊可能包含空格,因此使用修剪功能)。我使用兩個字符串,即原始字符串和臨時字符串。該臨時字符串用於存儲每個15個長度塊。 我不知道我是否可以陷入性能問題,因爲字符串是不可變的。這是代碼:使用String.Substrings,是否缺乏性能?

string original = "THIS IS SUPPOSE TO BE A LONG STRING AN I NEED TO SPLIT IT IN BLOCKS OF 15 CHARACTERS.SO"; 
string temp = string.Empty; 
while (original.Length != 0) 
{ 
    temp = original.Substring(0, 14).Trim(); 

    original = original.Substring(14, (original.Length -14)).Trim(); 
} 

我很感謝您的反饋,以便找到實現此功能的最佳方法。

+2

你的性能測試數字表明瞭什麼?您獲得的結果是否符合您在設計時定義的系統的整體性能?它是否符合您所需的性能標準? –

+0

嗨達林,我仍在努力。我正在嘗試使用IL DASM。 –

+1

看起來像'StringBuilder'類的工作... http://msdn.microsoft.com/en-us/library/2839d5h5(v=VS.71).aspx – Quasdunk

回答

0

一般來說,如果你想在更大的數據上運行這樣的代碼可能會有問題,那當然取決於你的需求。

一般來說,使用StringBuilder類可能是個好主意,它允許您以「更多可變」方式對字符串進行運算而不會影響性能,例如從其開始時刪除而不重新分配整個字符串。

在你的例子中,我會考慮扔掉石灰,從原來的子字符串取代它,並用一些代碼來更新一些索引,指出你應該從哪裏得到新的子字符串。然後,條件只是檢查你的索引是否在字符串末尾和你的臨時方法將採用不是從0到14的子字符串,而是從我,我會是這個索引。

但是 - 如果你不需要優化代碼,我在這裏假設你需要更多的性能,並且你想犧牲一些時間和/或寫一些不那麼容易理解的代碼來提高效率。

1

我認爲你對於不可改變的問題是正確的 - 每次重新創建'原創'可能不是最快的方法。

將'original'傳遞給StringReader類怎麼樣?

+0

謝謝,我會試試看! –

3

你會得到這樣的表現略好(但無論是性能增益會顯著是另一回事完全):

for (var startIndex = 0; startIndex < original.Length; startIndex += 15) 
{ 
    temp = original.Substring(startIndex, Math.Min(original.Length - startIndex, 15)).Trim(); 
} 

這是因爲你沒有複製的最後都 - 丁 - 執行得更好每個循環迭代15個字符的原始字符串。

編輯

爲了推進該指數將下一個非空白字符,你可以做這樣的事情:

for (var startIndex = 0; startIndex < original.Length;) 
{ 
    if (char.IsWhiteSpace(string, startIndex) 
    { 
     startIndex++; 
     continue; 
    } 
    temp = original.Substring(startIndex, Math.Min(original.Length - startIndex, 15)).Trim(); 
    startIndex += 15; 
} 
+0

這段代碼非常清晰易讀。感謝您的建議。 –

+0

這個想法是獲得15個字符的塊(沒有空格)。在這段代碼中,如果開頭有5個空格,結果字符串的長度是10。 –

+0

@MichaelHidalgo你的示例代碼會做同樣的事情,據我所知。此外,在編輯我的答案以滿足此要求之前,讓我問一下如何處理「XXXX XXXX XXXX XXXX XXXX」這樣的案例?第一個塊的長度爲14個字符(「XXXX XXXX XXXX」)。這是不可接受的嗎? – phoog

1

如果您original字符串超過幾千個字符長,您將有顯着(> 0.1s)的處理時間和大量的GC壓力。第一個Substring電話是好的,我不認爲你可以避開它,除非你深入System.String並與m_FirstChar混亂。第二個Substring可以完全避免逐字符逐句翻遍int