类型转换性能可优化

本文关键字:优化 性能 类型转换 | 更新日期: 2023-09-27 17:59:04

以下代码片段在数据处理应用程序中将 xml 数据转换为 csv 数据。 element是一个XElement.我目前正在尝试优化应用程序的性能,并想知道我是否可以以某种方式将下面正在进行的两个操作结合起来: 最终,我仍然希望访问 join 的字符串值和列表中的值元素,因为它们稍后用于其他目的。不确定这是否可行。任何帮助将不胜感激!

第一个操作基本上是剥离所有标签的 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));

类型转换性能可优化

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(),它遍历字符串仅发出所需的块,而不是在每次传递中创建一个数组,但在我尝试上述更明显的改进之前,我不会担心这一点首先。