繁体   English   中英

C#编译器如何与拆分一起工作?

[英]How does the C# compiler work with a split?

我有一个List<string> ,我要对其进行迭代并拆分每个项目,然后将其添加到StringBuilder

foreach(string part in List)
{
   StringBuilder.Append(part.Split(':')[1] + " ");
}

所以我的问题是通过此拆分创建了多少个字符串? 所有拆分将产生两个项目。 所以...我在想它将创建一个string[2] ,然后创建一个空字符串。 但是,它是否随后创建了string[1] + " "的串联,然后将其添加到StringBuilder或进行了优化?

该代码实际上等效于此:

foreach(string part in myList)
{
   sb.Append(string.Concat(part.Split(':')[1], " "));
}

因此,是的,将创建一个附加string ,该string代表拆分第二部分和空字符串的串联。

包括原始string在内,您还具有通过调用Split()创建的两个string ,以及对文字字符串" "的引用,该字符串将从程序集元数据中加载。

您可以通过依次Append分割结果和空字符串来保存对Concat()的调用:

sb.Append(part.Split(':')[1]).Append(" ");

请注意,如果您仅使用字符串文字,那么编译器将为您做出一种优化:

sb.Append("This is " + "one string");

实际上被编译为

sb.Append("This is one string");

每个项目3个额外的字符串

  • part[0];
  • part[1];
  • part[1] + " "

最小的分配可能是完全避免所有临时分配,但通常会进行微观优化警告。

var start = part.IndexOf(':') + 1;
stringbuilder.Append(part, start, part.Length-start).Append(' ');

您有原始字符串'split'-1个字符串

您将“ split”拆分为两个-2字符串

您已将拆分的两个部分连接在一起-1个字符串

字符串构建器不会创建新的字符串。

当前代码使用4个字符串,包括原始字符串。

如果要保存一个字符串,请执行以下操作:

StringBuilder.Append(part.Split(':')[1]);
StringBuilder.Append(" ");

这段代码:

foreach(string part in List)
{
   StringBuilder.Append(part.Split(':')[1] + " ");
}

等效于:

foreach(string part in List)
{
   string tmp = string.Concat(part.Split(':')[1], " ");
   StringBuilder.Append(tmp);
}

是的,它是不必要地创建字符串。 至少就生成的字符串数而言,这会更好:

foreach(string part in List)
{
   StringBuilder.Append(part.Split(':')[1])
                .Append(" ");
}

因此,对于列表中的每个值( n ,在代码中称为part ),您正在分配:

  1. x (我假设2个)字符串用于拆分。
  2. n用于连接的字符串。
  3. StringBuilder大约为n + 1字符串; 可能要少得多。

因此,最后有nx + n + n + 1 ,并假设分割总是产生两个值4n + 1

改善此问题的一种方法是:

foreach(string part in List) 
{
    var val = part.Split(':')[1];
    StringBuilder.EnsureCapacity(StringBuilder.Length + val.Length + 1);
    StringBuilder.Append(val);
    StringBuilder.Append(' ');
}

这使其成为3n + 1 这是一个粗略的估计,因为StringBuilder会在空间用完时分配字符串-但是,如果您EnsureCapacity ,则会防止其出错

可能唯一可以确定如何编译的方法是构建它,然后使用Refactor重新对其进行反编译,以查看其内部处理方式。 无论如何,请记住,这可能不会影响整个应用程序的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM