类型转换性能是否可以优化?

时间:2015-06-22 17:45:02

标签: c# xml csv optimization type-conversion

以下代码段将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));

1 个答案:

答案 0 :(得分: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()迭代通过字符串只发出它需要的块而不是在每次传递中创建一个数组,但我不会担心这一点,直到我首先尝试上述更明显的改进。