2015-06-22 37 views
0

以下片段將xml數據轉換爲數據處理應用程序中的csv數據。 elementXElement。我目前正在試圖優化應用程序的性能,並想知道我是否可以以某種方式組合下面進行的兩個操作:最終,我仍然需要訪問連接的字符串值和列表中的值的元素,因爲它們被使用後來出於其他目的。不知道這是否可行。任何幫助將不勝感激!類型轉換性能優化?

第一個操作基本上是去除所有標籤的XML數據,並且只是在它們之間或它們之間返回文本數據。它也檢查格式。第二個操作使用XML數據並刪除所有換行符和空格(如果它們存在於數據的前幾個字符中)。

IEnumerable<string> values = new List<string>(); 
     values = element.DescendantNodes().OfType<XText>() 
     .Select(v => Regex.Replace(v.Value, "\\s+", " ")).ToList(); 

string joined = string.Concat(element.ToString().Split().Take(3)) + string.Join(" ", element. 
     ToString().Split().Skip(3)); 

回答

0
IEnumerable<string> values = new List<string>(); 
values = … 

可能不會是一個大問題,但爲什麼創建一個新的List<string>()只是把它扔掉。替換爲這兩種:

IEnumerable<string> values; 
values = … 

如果您需要在前面的範圍定義values,或者只是:

Enumerable<string> values = … 

再後來就:

….Select(v => Regex.Replace(v.Value, "\\s+", " ")).ToList(); 

你真的需要它成爲一個列表?只比較速度:

….Select(v => Regex.Replace(v.Value, "\\s+", " ")); 

還有時會比較慢,而且有些時候,它只是將無法正常工作,但也有很多次,其中ToList()只是一個時間和內存浪費時間。

string joined = string.Concat(
    element.ToString().Split().Take(3)) 
    + string.Join(" ", element.ToString().Split().Skip(3)); 

的第一件事就是爲什麼你叫ToString()Split()兩次?:

var splitOnWhiteSpace = element.ToString().Split(); 
string joined = string.Concat(
    splitOnWhiteSpace.Take(3)) 
    + string.Join(" ", splitOnWhiteSpace.Skip(3)); 

我們也許可以用自定義的方式優化Join太:

var elString = element.ToString(); 
var buffer = new StringBuilder(element.Length - 2); //Can't be larger, unlikely to be much smaller so obtain necessary space in advance. 
using(var en = elString.Split().GetEnumerator()) 
{ 
    int count = 0; 
    while(en.MoveNext() && ++count != 4) 
    buffer.Append(en.Current); 
    while(en.MoveNext()) 
    buffer.Append(en.Current).Append(' '); 
} 
string joined = buffer.ToString(); 

如果這是被幾個循環擊中,我會考慮在循環之間保持緩衝區(Clear()它在每次使用之後而不是創建一個新的)。

如果被拆分的字符串非常大,我可能會考慮一個自定義版本Split(),它會遍歷字符串,只發出它需要的塊,而不是在每個過程中創建一個數組,但我不會擔心,直到我我首先嚐試了上述更明顯的改進。

+0

謝謝你,你的建議改善了一點性能! – sparta93

+0

GB數據的處理時間從大約7分鐘變爲大約6.4分鐘 – sparta93

+0

如果您將'XElement'方法替換爲使用'XmlReader'的方法,並以流方式執行此操作('yield return'ing results as it得到他們)你可能會做得更好; 'XmlReader'使用起來很快,但通常速度更快。 –