哪个字符串操作更好?

5Yr*_*DBA 7 .net c#

可能重复:
字符串连接与字符串生成器.性能

以下两个选项之间的任何差异(性能和内存使用情况)?

选项1:

StringBuilder msgEntry = new StringBuilder();
msgEntry.AppendLine("<" + timeTag + ">" + timeStamp + "</" + timeTag + ">");
Run Code Online (Sandbox Code Playgroud)

选项2:

StringBuilder msgEntry = new StringBuilder();
msgEntry.Append("<");
msgEntry.Append(timeTag);
msgEntry.Append(">");
msgEntry.Append(timeStamp);
msgEntry.Append("</");
msgEntry.Append(timeTag );
msgEntry.Append(">\n");
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 27

第二个在内存使用方面可能稍好一些,因为它不需要计算中间字符串1 ...但它的可读性较低,IMO.

就个人而言我会用:

msgEntry.AppendFormat("<{0}>{1}</{0}>", timeTag, timeStamp);
Run Code Online (Sandbox Code Playgroud)

你没有表现出你想要做什么StringBuilder.如果您只想将其转换为字符串,那么我将使用:

string text = string.Format("<{0}>{1}</{0}>", timeTag, timeStamp);
Run Code Online (Sandbox Code Playgroud)

首先.

性能如何?好吧,可能更糟 - 毕竟,它必须解析格式字符串.但除非你已经测量过并发现它是瓶颈,你为什么担心呢?

一般来说:

  • 确保您的架构合理有效 - 以后很难改变.
  • 在效率和简单性之间平衡您的内部设计,并强调可测试性; 稍后更改设计可能需要一段时间,但通常应该没有兼容性问题.
  • 编写您的实现尽可能可读.
  • 测量系统以确定它是否表现良好,以及瓶颈在哪里.他们几乎永远不会像这样代码.(毕竟,我们不是在循环中讨论字符串连接.)
  • 当您发现瓶颈时,请尝试不同的优化并进行测量.不要认为你认为更快的东西实际上会更快.

1或者要传递给的数组Concat...我们不知道它的类型,timeStamp所以我们无法确切地知道那里发生了什么; 在第二种形式中,它可以就地附加,而第一种形式可能需要将其打包,然后在执行连接之前将其转换为字符串.

.NET 3.5和.NET 4之间的重新分配等的确切实现可能已经发生了变化(我知道实现的一些部分).如果没有非常仔细的基准测试,我真的不愿意说哪个更快......但是可读性更容易调用,尽管是主观的.