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()
,它会遍历字符串,只发出它需要的块,而不是在每个过程中创建一个数组,但我不会担心,直到我我首先尝试了上述更明显的改进。
谢谢你,你的建议改善了一点性能! – sparta93
GB数据的处理时间从大约7分钟变为大约6.4分钟 – sparta93
如果您将'XElement'方法替换为使用'XmlReader'的方法,并以流方式执行此操作('yield return'ing results as it得到他们)你可能会做得更好; 'XmlReader'使用起来很快,但通常速度更快。 –