2015-06-22 110 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'使用起来很快,但通常速度更快。 –