这个问题已经在这里有了答案:




已关闭10年。






以下两个选项之间有什么区别(性能和内存使用情况)?

选项1:

StringBuilder msgEntry = new StringBuilder();
msgEntry.AppendLine("<" + timeTag + ">" + timeStamp + "</" + timeTag + ">");

选项2:
StringBuilder msgEntry = new StringBuilder();
msgEntry.Append("<");
msgEntry.Append(timeTag);
msgEntry.Append(">");
msgEntry.Append(timeStamp);
msgEntry.Append("</");
msgEntry.Append(timeTag );
msgEntry.Append(">\n");

最佳答案

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

我个人会使用:

msgEntry.AppendFormat("<{0}>{1}</{0}>", timeTag, timeStamp);

之后,您还没有显示想要使用StringBuilder做什么。如果您只是要将其转换为字符串,那么我将使用:
string text = string.Format("<{0}>{1}</{0}>", timeTag, timeStamp);

首先。

表现如何?好吧,可能更糟-毕竟,它必须解析格式字符串。但是,除非您已对此进行了度量,并发现它是瓶颈,否则您为什么担心?

一般来说:
  • 确保您的体系结构相当有效-以后很难更改。
  • 着重于可测试性,从而在效率和简单性之间平衡内部设计;稍后更改设计可能需要一段时间,但是通常应该可行,而不会出现兼容性问题。
  • 将您的实现编写为尽可能可读的。
  • 对系统进行度量以找出其性能是否足够好以及瓶颈在哪里。他们几乎永远都不会出现在这样的代码中。 (毕竟,我们这里不是在循环中谈论字符串连接。)
  • 当您发现瓶颈时,请尝试不同的优化措施并进行评估。不要以为您认为更快的事情实际上会更快。


  • 1或要传递给Concat的数组...我们不知道timeStamp的类型,因此我们无法确切知道那里发生了什么。在第二种形式中,它可以就地添加,而第一种形式中,可能需要将其装箱,然后在执行串联之前将其转换为字符串。

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

    09-30 19:05
    查看更多